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

相关推荐
Kay_Liang2 小时前
大语言模型如何精准调用函数—— Function Calling 系统笔记
java·大数据·spring boot·笔记·ai·langchain·tools
自由的疯3 小时前
Java 如何学习Docker
java·后端·架构
自由的疯3 小时前
Java Docker本地部署
java·后端·架构
007php0073 小时前
猿辅导Java面试真实经历与深度总结(二)
java·开发语言·python·计算机网络·面试·职场和发展·golang
摇滚侠3 小时前
Spring Boot 3零基础教程,WEB 开发 内容协商机制 笔记34
java·spring boot·笔记·缓存
一勺菠萝丶3 小时前
在 macOS 上用 Docker 为 Java 后端 & 常见开发需求搭建完整服务(详尽教程)
java·macos·docker
顾漂亮3 小时前
JVM底层攻坚
java·jvm·spring
编程岁月3 小时前
java面试-0215-HashMap有序吗?Comparable和Comparator区别?集合如何排序?
java·数据结构·面试
木井巳3 小时前
[Java数据结构与算法]详解排序算法
java·数据结构·算法·排序算法
没有bug.的程序员4 小时前
分布式架构未来趋势:从云原生到智能边缘的演进之路
java·分布式·微服务·云原生·架构·分布式系统