在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 > 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 > 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 > 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.fieldName | Java 属性名 | userName |
field.columnName | 数据库列名 | user_name |
field.jdbcType | JDBC 类型 | VARCHAR |
field.columnLength | 列长度 | 64 |
field.columnScale | 列精度(小数位) | 2 |
field.columnIsArray | 是否为数组 | false |
field.shortTypeName | Java 类型短名称 | String |
field.fullTypeName | Java 类型全限定名 | java.lang.String |
field.remark | 字段注释 | 用户名 |
field.autoIncrement | 是否自增 | true |
field.nullable | 是否允许 NULL | false |
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