mybatisX的自定义模板生成

在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 &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>
        ) 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接口为:

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

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

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

  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 表注释 用户信息表

  1. 字段信息(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

  1. 配置信息(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

相关推荐
运维帮手大橙子20 分钟前
字符串缓冲区和正则表达式
java·开发语言
丶小鱼丶1 小时前
栈算法之【有效括号】
java·算法
郝学胜-神的一滴2 小时前
SpringBoot实战指南:从快速入门到生产级部署(2025最新版)
java·spring boot·后端·程序人生
鼠鼠我捏,要死了捏4 小时前
Java 虚拟线程在高并发微服务中的实战经验分享
java·microservices·virtualthreads
武子康5 小时前
Java-82 深入浅出 MySQL 内部架构:服务层、存储引擎与文件系统全覆盖
java·开发语言·数据库·学习·mysql·spring·微服务
Rancemy5 小时前
rabbitmq 03
java·分布式·rabbitmq
界面开发小八哥6 小时前
通用CI/CD软件平台TeamCity v2025.3全新发布——主要界面交互体验升级
ide·ci/cd·开发平台·teamcity
Dcs7 小时前
“SQL注入即服务”:一个10年历史系统的奇幻演变
java
秃了也弱了。7 小时前
reflections:Java非常好用的反射工具包
java·开发语言
Amagi.8 小时前
Java设计模式-代理模式
java·代理模式