mybatisPlus generator生成xml时自定义sql

文章介绍了如何使用mybatisPlusgenerator在MyBatis中自定义SQL模板,包括添加依赖、配置生成代码、复制并编辑xml模板,以便在内网开发中快速生成基础CRUD操作所需的XML文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


最近需要用mybatis生成基础curd的内容,内网开发,mybatis的模板手敲太费劲,所以选择用mybatisPlus,由于项目需要,还是要生成的xml中有基础的增删改。


一、编写生成代码的配置

添加依赖

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.3.1</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.5.3.1</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.26</version>
        </dependency>
        <!--        springboot集成druid连接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.15</version>
        </dependency>
         <!--        需要加一个模板引擎,生成代码的时候必须配置一个,默认是velocity,应该可以去掉,没再深究-->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.3</version>
        </dependency>

参考官网的示例,具体参数意义可以看下官网,这么写是生成了实体类、dao、service、xml文件

public class FastAutoGeneratorMysqlTest {
    private static final DataSourceConfig.Builder DATA_SOURCE_CONFIG
            = new DataSourceConfig.Builder("jdbc:mysql://localhost:3306/test","root","root");

    public static void main(String[] args) {
        FastAutoGenerator
                .create(DATA_SOURCE_CONFIG)
                .globalConfig(builder -> { // 设置author及生成目录
                    builder.author("aaa")
                            .outputDir("D://");
                })
                .dataSourceConfig(builder -> builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> {
                    int typeCode = metaInfo.getJdbcType().TYPE_CODE;
                    if (typeCode == Types.SMALLINT){ // int类型映射
                        return DbColumnType.INTEGER;
                    }
                    return typeRegistry.getColumnType(metaInfo);
                }))
                .packageConfig(builder -> { // 生成代码的包名
                    builder.parent("com.demo.test")
                        .moduleName("dao")
                        .xml("mapper.xml")
                        .pathInfo(Collections.singletonMap(OutputFile.xml,"D://"));
                })
                .strategyConfig(builder -> {
                    builder.addInclude("t_user")
                            .mapperBuilder()
                            .superClass(BaseMapper.class)
                            .enableBaseResultMap() // 生成字段映射
                            .enableBaseColumnList(); // 生成基础列
                })
                .execute();
    }
}

此时执行,使用的是默认的xml模板文件,生成的xml只有字段映射、全列名两部分。

二、复制模板文件

将mybatisPlus中的xml模板复制到自己项目的resource文件夹下,路径与源码中的保持一致,也就是重写源码中的模板文件(我是这个模板,不同的引擎,对应的文件后缀不同)。
模板文件
在这里插入图片描述

三、编辑模板文件,添加自己需要生成的sql

例如下面的模板中添加了insert sql的生成,具体模板语法不太了解,复制的查询结果映射改的

<?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="${package.Mapper}.${table.mapperName}">

#if(${enableCache})
    <!-- 开启二级缓存 -->
    <cache type="${cacheClassName}"/>

#end
#if(${baseResultMap})
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="${package.Entity}.${entity}">
#foreach($field in ${table.fields})
#if(${field.keyFlag})##生成主键排在第一位
        <id column="${field.name}" property="${field.propertyName}" />
#end
#end
#foreach($field in ${table.commonFields})##生成公共字段
        <result column="${field.name}" property="${field.propertyName}" />
#end
#foreach($field in ${table.fields})
#if(!${field.keyFlag})##生成普通字段
        <result column="${field.name}" property="${field.propertyName}" />
#end
#end
    </resultMap>

#end
#if(${baseColumnList})
    <!-- 通用查询结果列 -->
    <sql id="Base_Column_List">
#foreach($field in ${table.commonFields})
        ${field.columnName},
#end
        ${table.fieldNames}
    </sql>

#end

    <!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="${package.Entity}.${entity}">
#foreach($field in ${table.fields})
    #if(${field.keyFlag})##生成主键排在第一位
        <id column="${field.name}" property="${field.propertyName}" />
    #end
#end
#foreach($field in ${table.commonFields})##生成公共字段
    <result column="${field.name}" property="${field.propertyName}" />
#end
#foreach($field in ${table.fields})
    #if(!${field.keyFlag})##生成普通字段
        <result column="${field.name}" property="${field.propertyName}" />
    #end
#end
</mapper>

<insert id="insert">
    INSERT INTO ${table.name}
    <trim prefix="(" suffix=")" suffixOverrides=",">
    #foreach($field in ${table.fields})
        #if(${field.keyFlag})##生成主键排在第一位
        <if test="${field.propertyName} != null"> ${field.name},</if>
        #end
    #end
    #foreach($field in ${table.commonFields})##生成公共字段
        <if test="${field.propertyName} != null"> ${field.name},</if>
    #end
    #foreach($field in ${table.fields})
        #if(!${field.keyFlag})##生成普通字段
        <if test="${field.propertyName} != null"> ${field.name},</if>
        #end
    #end
    </trim>
    <trim prefix="VALUES(" suffix=")" suffixOverrides=",">
    #foreach($field in ${table.fields})
        #if(${field.keyFlag})##生成主键排在第一位
        <if test="${field.propertyName} != null"> #{${field.propertyName}},</if>
        #end
    #end
    #foreach($field in ${table.commonFields})##生成公共字段
    <if test="${field.propertyName} != null"> #{${field.propertyName}},</if>
    #end
    #foreach($field in ${table.fields})
        #if(!${field.keyFlag})##生成普通字段
        <if test="${field.propertyName} != null"> #{${field.propertyName}},</if>
        #end
    #end
    </trim>
</insert>

更改完xml模板文件后,再执行代码生成,会按照新的xml模板生成xml文件。

### MyBatisPlus 代码生成策略中的 XML 配置 MyBatis-Plus 的 `AutoGenerator` 工具能够简化开发流程,允许开发者快速生成项目所需的各类代码文件。对于 XML 文件的配置,在全局配置 (`GlobalConfig`) 中提供了多个选项来控制是否生成这些文件。 #### 控制 Mapper XML 文件生成 为了确保生成的 Mapper XML 文件包含必要的映射信息,可以在全局配置中设置如下参数: ```java globalConfig.setBaseResultMap(true); ``` 此行代码的作用是在生成的 Mapper XML 文件中加入基础的结果集映射 (Base Result Map),这有助于提高查询性能并减少手动编写 SQL 映射的工作量[^3]。 另外,如果希望在生成XML 文件中也包含列字段的基础映射,则可以启用以下配置项: ```java globalConfig.setBaseColumnList(true); ``` 上述配置使得每次生成 Mapper XML 文件都会自动添加表结构对应的 `<resultMap>` 和 `<sql>` 片段,从而进一步减少了手写重复代码的需求。 #### 自定义模板路径 除了默认的行为外,还可以通过自定义模板来自由定制所要生成的内容。例如,可以通过修改 `TemplateConfig` 来指定不同的模板位置用于生成 XML 文件: ```java templateConfig.setXml(null); // 不使用默认 xml 模板, 使用自定义模板 ``` 当指定了新的模板目录之后,可以根据项目的具体需求调整 XML 文件的具体格式和内容。 #### 完整示例 下面是一个完整的 Java 代码片段展示如何配置 MyBatis-Plus 自动生成工具以适应特定的应用场景: ```java import com.baomidou.mybatisplus.generator.AutoGenerator; import com.baomidou.mybatisplus.generator.config.DataSourceConfig; import com.baomidou.mybatisplus.generator.config.GlobalConfig; import com.baomidou.mybatisplus.generator.config.PackageConfig; import com.baomidou.mybatisplus.generator.config.TemplateConfig; public class CodeGenerator { public static void main(String[] args) { AutoGenerator mpg = new AutoGenerator(); // 设置数据源 DataSourceConfig dsc = new DataSourceConfig(); dsc.setUrl("jdbc:mysql://localhost:3306/your_database"); dsc.setUsername("root"); dsc.setPassword("password"); dsc.setDriverName("com.mysql.cj.jdbc.Driver"); // 全局配置 GlobalConfig gc = new GlobalConfig(); gc.setOutputDir(System.getProperty("user.dir") + "/src/main/java"); // 输出目录 gc.setAuthor("Your Name"); gc.setDateType(GlobalConfig.DateType.TIME_PACK); gc.setOpen(false); // 开启 baseResultMap 和 baseColumnList 功能 gc.setBaseResultMap(true); gc.setBaseColumnList(true); // 包名配置 PackageConfig pc = new PackageConfig(); pc.setParent("com.yourcompany.projectname"); // 关闭默认xml生成,采用自定义模板 TemplateConfig tc = new TemplateConfig(); tc.setXml(null); // 执行生成操作 mpg.setDataSource(dsc) .setPackageInfo(pc) .setGlobalConfig(gc) .setTemplate(tc) .execute(); } } ``` 这段代码展示了如何利用 MyBatis-Plus 的 `AutoGenerator` 类创建一个简单的数据库连接,并设置了输出目标、作者名称以及其他一些基本属性。同开启了 `baseResultMap` 和 `baseColumnList` 参数以便更好地支持 XML 文件的自动化生成过程[^2].
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值