当前位置: 首页 > news >正文

mybatisX的自定义模板生成

在idea中使用mybtais的自定义模板生成,可以帮我们省去很多重复的代码。

打开一个项目,我们要修改的主要就两个文件,一个是生成的mapper接口,另一个是xml文件:
相应的mapper接口模板为:
 

package ${mapperInterface.packageName};import ${tableClass.fullClassName};
import com.scmpt.framework.aop.mybatis.interceptor.unique.UniqueValidation;
import java.util.List;
import org.apache.ibatis.annotations.Param;/**
* @author ${author!}
* @description 针对表【${tableClass.tableName}<#if tableClass.remark?has_content>(${tableClass.remark!})</#if>】的数据库操作Mapper
* @createDate ${.now?string('yyyy-MM-dd HH:mm:ss')}
* @Entity ${tableClass.fullClassName}
*/
public interface ${mapperInterface.fileName} {@UniqueValidation(table = "${tableClass.tableName}")
int insert(${tableClass.shortClassName} record);${tableClass.shortClassName} getById(Long id);@UniqueValidation(table = "${tableClass.tableName}")
int updateById(${tableClass.shortClassName} record);void deleteRecycle(@Param("ids") List<Long> ids,@Param("updateUserId") Long updateUserId);
void recoverRecycle(@Param("ids") List<Long> ids,@Param("updateUserId") Long updateUserId);
void deleteBatch(@Param("ids") List<Long> ids,@Param("updateUserId") Long updateUserId);List<Long> getToTranslate(@Param("ids") List<Long> ids);List<${tableClass.shortClassName}> getInfoDoByIds(@Param("ids")List<Long> longList);void insertBatch(@Param("doList") List<${tableClass.shortClassName}> managesDos);
}

我们要引用的注解也好,或者是第三方插件也好。都是提前把对应的包路径引进来。

相应的mapper的XML文件生成模板为:
 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="${mapperInterface.packageName}.${baseInfo.fileName}"><resultMap id="BaseResultMap" type="${tableClass.fullClassName}"><#list tableClass.pkFields as field><id property="${field.fieldName}" column="${field.columnName}" <#if baseInfo.needJdbcType>jdbcType="${field.jdbcType}"</#if>/></#list><#list tableClass.baseFields as field><result property="${field.fieldName}" column="${field.columnName}" <#if baseInfo.needJdbcType>jdbcType="${field.jdbcType}"</#if>/></#list></resultMap><sql id="Base_Column_List"><#list tableClass.allFields as field>${field.columnName}<#sep>,<#if field_index &gt; 0 && field_index%5==0>${"\n        "}</#if></#list></sql><select id="getById" parameterType="java.lang.Long" resultMap="BaseResultMap">select<include refid="Base_Column_List" />from ${tableClass.tableName}where <#list tableClass.pkFields as field> ${field.columnName} = ${'#'}{${field.fieldName}<#if baseInfo.needJdbcType>,jdbcType=${field.jdbcType}</#if>} <#if field_has_next>AND</#if></#list></select><insert id="insert"<#if (tableClass.pkFields?size==1)> keyColumn="${tableClass.pkFields[0].columnName}" keyProperty="${tableClass.pkFields[0].fieldName}" parameterType="${tableClass.fullClassName}" useGeneratedKeys="true"</#if>>insert into ${tableClass.tableName}( <#list tableClass.allFields as field>${field.columnName}<#sep>,<#if field_index &gt; 0 && field_index%5==0>${"\n        "}</#if></#list>)values (<#list tableClass.allFields as field>${'#'}{${field.fieldName}<#if baseInfo.needJdbcType>,jdbcType=${field.jdbcType}</#if>}<#sep>,<#if field_index &gt; 0 && field_index%5==0>${"\n        "}</#if></#list>)</insert><update id="updateById" parameterType="${tableClass.fullClassName}">update ${tableClass.tableName}<set><#list tableClass.baseBlobFields as field><if test="${field.fieldName} != null">${field.columnName} = ${'#'}{${field.fieldName}<#if baseInfo.needJdbcType>,jdbcType=${field.jdbcType}</#if>},</if></#list></set>where  <#list tableClass.pkFields as field> ${field.columnName} = ${'#'}{${field.fieldName}<#if baseInfo.needJdbcType>,jdbcType=${field.jdbcType}</#if>} <#if field_has_next>AND</#if></#list></update><update id="recoverRecycle">update ${tableClass.tableName}set is_recycle = 0,update_time = now(),update_user_id = ${'#'}{updateUserId}where <#list tableClass.pkFields as field>${field.columnName}</#list> in<foreach collection="ids" item="id" open="(" separator="," close=")">${'#'}{id}</foreach></update><update id="deleteRecycle">update ${tableClass.tableName}set is_delete = 1,update_time = now(),update_user_id = ${'#'}{updateUserId}where <#list tableClass.pkFields as field>${field.columnName}</#list> in<foreach collection="ids" item="id" open="(" separator="," close=")">${'#'}{id}</foreach></update><update id="deleteBatch">update ${tableClass.tableName}set is_recycle = 1,update_time = now(),update_user_id = ${'#'}{updateUserId}where <#list tableClass.pkFields as field>${field.columnName}</#list> in<foreach collection="ids" item="id" open="(" separator="," close=")">${'#'}{id}</foreach></update><insert id="insertBatch">INSERT INTO ${tableClass.tableName} (<#list tableClass.allFields as field>${field.columnName}<#sep>,</#list>)VALUES<foreach collection="doList" item="item" separator=",">(<#list tableClass.allFields as field>${'#'}{item.${field.fieldName}}<#sep>,</#list>)</foreach></insert><select id="getInfoDoByIds" resultMap="BaseResultMap">SELECT<include refid="Base_Column_List"/>FROM ${tableClass.tableName}WHERE <#list tableClass.pkFields as field>${field.columnName}</#list> IN<foreach collection="ids" item="id" open="(" separator="," close=")">${'#'}{id}</foreach></select><select id="getToTranslate" resultType="java.lang.Long">SELECT tt.<#list tableClass.pkFields as field>${field.columnName}</#list>FROM (<foreach collection="ids" item="id" separator=" UNION ALL ">SELECT ${'#'}{id} AS <#list tableClass.pkFields as field>${field.columnName}</#list></foreach>) ttLEFT JOIN ${tableClass.tableName} omsON tt.<#list tableClass.pkFields as field>${field.columnName}</#list> = oms.<#list tableClass.pkFields as field>${field.columnName}</#list>WHERE oms.<#list tableClass.pkFields as field>${field.columnName}</#list> IS NULL</select>
</mapper>

至此,我们就可以直接点击模板生成来进行我们自定义的模板生成策略。

ftl文件: 使用的FreeMark模板语言

Freemarker的基本语法及使用大全_freemarker 语法_小码哥哥哥的博客-CSDN博客

不太懂freemark和模板中变量含义的结合以上理解就可以进行模板自定义了。

要注意的是,我们修改的是default-all这个生成模板,所以,我们也要使用相应的生成策略才可以。

生成的mapper接口为:

可以看到正确输出了我们相应的格式。

如果想要恢复默认的生成模板,我们可以直接在项目中恢复默认。

如此,就能把我们的模板恢复为静态的模板了。相应的代码生成时的映射关系为:

1. 实体类信息(tableClass.*

变量名说明示例
tableClass.fullClassName类的全限定名com.example.system.entity.UserDO
tableClass.shortClassName类的简称(不含包名)UserDO
tableClass.tableName数据库表名sys_user
tableClass.pkFields主键字段集合[id]
tableClass.allFields所有字段集合[id, username, password, ...]
tableClass.baseFields排除主键 & BLOB 的字段集合[username, password, ...]
tableClass.baseBlobFields排除主键,含 BLOB 的字段集合[username, password, avatar, ...]
tableClass.remark表注释用户信息表

2. 字段信息(field.*

变量名说明示例
field.fieldNameJava 属性名userName
field.columnName数据库列名user_name
field.jdbcTypeJDBC 类型VARCHAR
field.columnLength列长度64
field.columnScale列精度(小数位)2
field.columnIsArray是否为数组false
field.shortTypeNameJava 类型短名称String
field.fullTypeNameJava 类型全限定名java.lang.String
field.remark字段注释用户名
field.autoIncrement是否自增true
field.nullable是否允许 NULLfalse

3. 配置信息(baseInfo.*

变量名说明示例
baseInfo.shortClassName配置名称UserDO
baseInfo.tableName配置文件名称UserDO
baseInfo.pkFields配置名称id
baseInfo.allFields后缀DO
baseInfo.baseFields包名com.example.system.entity
baseInfo.baseBlobFields模板内容...
baseInfo.remark相对模块的资源文件路径src/main/resources

更多的信息请查看官网:

Mybatis X 插件 | MyBatis-Plus

http://www.dtcms.com/a/298380.html

相关文章:

  • 【深基12.例1】部分背包问题 Java
  • docker 挂载卷
  • 【C++】二叉搜索数
  • 使用Akshare获取股票历史数据
  • Avalonia 发布完cv到Linux上运行 出现字体丢失/不显示问题
  • [NLP]UPF基本语法及其在 native low power verification中的典型流程
  • 闲鱼多账号运营安全策略 如何规避同ip
  • MC_GearInPos电子齿轮
  • python-函数进阶、容器通用方法、字符串比大小(笔记)
  • 机器学习-SVM支持向量机
  • Unity UOS 多人联机
  • Go语言中的非类型安全指针
  • Idefics2:构建视觉-语言模型时,什么是重要的
  • Java 常用数据库详解
  • 数据结构 二叉树(1)
  • leetcode933最近的请求次数
  • 《汇编语言:基于X86处理器》第9章 编程练习
  • Three.js 控制器和交互设计:OrbitControls + Raycaster 实战
  • Chromadb 1.0.15 索引全解析:从原理到实战的向量检索优化指南
  • 《C++》面向对象编程--类(补充)
  • yarn在macOS上的安装与镜像源配置:全方位指南
  • Modbus RTU转Profinet网关接涡街液体流量计到西门子1200 PLC系统
  • [第十三篇] Spring Boot监控
  • 网络安全-机遇与挑战
  • leetcode 3487. 删除后的最大子数组元素和 简单
  • Java排序算法之<冒泡排序>
  • [python][flask]Flask-Principal 使用详解
  • SpringBoot学习路径--SpringBoot的简单介绍和项目搭建
  • Kafka运维实战 15 - kafka 重设消费者组位移入门和实战【实战】
  • Qt 数据库事务处理与数据安全