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

打开一个项目,我们要修改的主要就两个文件,一个是生成的mapper接口,另一个是xml文件:
相应的mapper接口模板为:
java
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文件生成模板为:
java
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//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>
) tt
LEFT JOIN ${tableClass.tableName} oms
ON 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接口为:
可以看到正确输出了我们相应的格式。
如果想要恢复默认的生成模板,我们可以直接在项目中恢复默认。

如此,就能把我们的模板恢复为静态的模板了。相应的代码生成时的映射关系为:
- 实体类信息(
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 |
表注释 | 用户信息表 |
- 字段信息(
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 |
- 配置信息(
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 |
更多的信息请查看官网: