MybatisPlus:代码生成器

  1. 快速入门
    1. 引入依赖
    2. 写main方法
      1. 上面对xml有作用的两个配置
  2. 修改xml存放路径
  3. 改成3.5以上的代码风格
  4. 自定义xml模版

快速入门

引入依赖

<!-- 添加 代码生成器 依赖,这里的版本最好和mybatis的一样-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.4.1</version>
</dependency>
<!--   模板引擎
        MyBatis-Plus 支持 Velocity(默认)、Freemarker、Beetl,用户可以选择自己熟悉的模板引擎,
        如果都不满足您的要求,可以采用自定义模板引擎。     -->
<dependency>
    <groupId>org.apache.velocity</groupId>
    <artifactId>velocity-engine-core</artifactId>
    <version>2.3</version>
</dependency>

写main方法

public class GenerateCode {
    public static void main(String[] args) {
        // 代码生成器
        // 3.5.0的版本是这样的,private AutoGenerator() {},和官方教程不一样
        AutoGenerator mpg = new AutoGenerator();
        /**************************全局配置****************************************/
        // 全局配置,要导这个包的:import com.baomidou.mybatisplus.generator.config.GlobalConfig;
        // 3.5.0的版本是这样的,private GlobalConfig() {},和官方教程不一样
        GlobalConfig gc = new GlobalConfig();
        // projectPath:获取当前项目路径:
        //D:\workplace\LearnCode\mybatisPlus\MyMybatisPlusdemo
        //System.out.println(System.getProperty("user.dir"));
        String projectPath = System.getProperty("user.dir");
        // 设置生成路径
        gc.setOutputDir(projectPath + "/src/main/java");
        // 设置作者
        gc.setAuthor("Jerry");
        // 设置代码生成后是否需要打开文件
        gc.setOpen(false);
        // 实体属性 Swagger2 注解
        // gc.setSwagger2(true);
        // 生成xml的ResultMap:映射所有的字段
        gc.setBaseResultMap(true);
        // 生成xml的通用查询结果列
        gc.setBaseColumnList(true);
        // 第二次生成同名文件是覆盖还是累加
        gc.setFileOverride(true);
        //描述:时间类型对应策略。默认值:TIME_PACK
        // gc.setDateType(DateType.ONLY_DATE);
        //描述:实体命名方式,%s 为占位符。 默认值:null (驼峰命名)
        //示例:%sEntity 生成 UserEntity
        gc.setEntityName("%s");
        //描述:Mapper 命名方式,%s 为占位符。默认值:null
        //示例:%sDao 生成 UserDao
        gc.setMapperName("%sMapper");
        //描述:Mapper XML 命名方式,%s 为占位符。 默认值:null
        //示例:%sDao 生成 UserDao.xml
        gc.setXmlName("%sMapper");
        //描述:Service 命名方式,%s 为占位符。 默认值:null
        //示例:%sBusiness 生成 UserBusiness
        gc.setServiceName("%sService");

        //描述:Service impl 命名方式,%s 为占位符。 默认值:null
        //示例:%sBusinessImpl 生成 UserBusinessImpl
        gc.setServiceImplName("%sServiceImpl");
        // 将全局配置放入 AutoGenerator 中
        mpg.setGlobalConfig(gc);
        /**************************全局配置****************************************/

        /**************************数据源配置****************************************/
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://192.168.124.188:3306/mybatis_plus?serverTimezone=GMT%2B8&characterEncoding=utf-8&useSSL=false");
        // dsc.setSchemaName("public");
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("1234");
        // 将数据源配置放入 AutoGenerator 中
        mpg.setDataSource(dsc);
        /**************************数据源配置****************************************/

        /**************************包配置****************************************/
        PackageConfig pc = new PackageConfig();
        // 设置模块名:
        pc.setModuleName("mymybatisplusdemo");
        // 设置包名
        pc.setParent("com.lin");
        //完整路径:com.lin.mymybatisplusdemo

        // 将 包配置 放入 AutoGenerator 中
        mpg.setPackageInfo(pc);
        /**************************包配置****************************************/

        /**************************策略配置****************************************/
        StrategyConfig strategy = new StrategyConfig();
        // 表名的生成策略:下划线转驼峰
        strategy.setNaming(NamingStrategy.underline_to_camel);
        // 列名的生成策略:下划线转驼峰
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);

        //strategy.setSuperEntityClass("你自己的父类实体,没有就不用设置!");
        //实体类是否支持lombok
        strategy.setEntityLombokModel(true);
        // 是否使用@RestController的注解
        strategy.setRestControllerStyle(true);
        // 公共父类
        //strategy.setSuperControllerClass("你自己的父类控制器,没有就不用设置!");
        // 写于父类中的公共字段
        //strategy.setSuperEntityColumns("id");
        // 要生成的表名,多个表用逗号分开,如"t_user","t_person"
        strategy.setInclude("t_user","t_person","t_person_student");
        // 也可以按照表前缀生成相关内容:如生成前缀为t_的表的内容
        // strategy.setLikeTable(new LikeTable("t_"));

        // 描述:驼峰转连字符。
        // 比如 如果设置了true,对于t_person_student表,
        // 生成的controller @RequestMapping("/mymybatisplusdemo/person-student")
        // t_去除了是因为设置了  strategy.setTablePrefix("t_");
        // mymybatisplusdemo 这个值=pc.setModuleName("mymybatisplusdemo");
        //strategy.setControllerMappingHyphenStyle(true);
        //去掉表前缀:对于t_user, 如果不配置,会生成TUser的类,配置之后变成User类
        strategy.setTablePrefix("t_");
        // 将 策略配置 放入 AutoGenerator 中
        mpg.setStrategy(strategy);

        /**************************策略配置****************************************/

        /**************************模版引擎****************************************/
        // 这里我们使用默认的模版引擎,所以可以先注释掉
        //mpg.setTemplateEngine(new FreemarkerTemplateEngine());
        /**************************模版引擎****************************************/

        // 开始执行
        mpg.execute();
    }
}

上面对xml有作用的两个配置

gc.setBaseResultMap(true);

<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.lin.mymybatisplusdemo.entity.User">
    <id column="uid" property="uid" />
    <result column="name" property="name" />
    <result column="age" property="age" />
    <result column="email" property="email" />
    <result column="is_deleted" property="isDeleted" />
</resultMap>

gc.setBaseColumnList(true);

<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
    uid, name, age, email, is_deleted
</sql>

更多内容可以参考官方文档

修改xml存放路径

/**************************自定义配置****************************************/
// 自定义配置
InjectionConfig cfg = new InjectionConfig() {
    @Override
    public void initMap() {
        // to do nothing
    }
};

// 如果模板引擎是 velocity
String templatePath = "/templates/mapper.xml.vm";

// 自定义输出配置
List<FileOutConfig> focList = new ArrayList<>();
// 自定义配置会被优先输出
focList.add(new FileOutConfig(templatePath) {
    @Override
    public String outputFile(TableInfo tableInfo) {
        // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
        // projectPath=当前项目路径=D:\workplace\LearnCode\mybatisPlus\MyMybatisPlusdemo
        // pc.getModuleName()=pc.setModuleName("mymybatisplusdemo");
        return projectPath + "/src/main/resources/mapper/" + pc.getModuleName()
            + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
    }
});
// 将自定义的输出配置focList 放入到自定义配置中
cfg.setFileOutConfigList(focList);
// 将自定义配置放入 代码生成器 中
mpg.setCfg(cfg);

/**************************自定义配置****************************************/

模版引擎可以在下面找到:

xml在Resource里面了,但xml也还在Java里面

通过配置模版,就可以去掉Java包下的xml

/**************************配置模版****************************************/

TemplateConfig templateConfig = new TemplateConfig();
templateConfig.setXml(null);// 这里设置null,就可以控制xml不在Java包下生成
mpg.setTemplate(templateConfig);

/**************************配置模版****************************************/

改成3.5以上的代码风格

引入依赖

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.5.9</version>
</dependency>

上面的代码变为

public class GenerateCode {
    public static void main(String[] args) {

        FastAutoGenerator
                /**************************数据源配置****************************************/
                .create("jdbc:mysql://192.168.124.188:3306/mybatis_plus",
                        "root", "1234")
                /**************************全局配置****************************************/
                .globalConfig(builder -> builder
                        .author("Jerry")// 设置作者名
                        .outputDir(Paths.get(System.getProperty("user.dir")) + "/src/main/java")// 设置输出目录
                        .disableOpenDir()// 不允许自动打开输出目录
                        .dateType(DateType.ONLY_DATE)// 设置时间类型策略
                        .commentDate("yyyy-MM-dd") // 设置注释日期格式
                        .build())
                .packageConfig(builder -> builder
                        .parent("com.lin") // 设置父包名
                        .moduleName("mymybatisplusdemo") // 设置父包模块名
                        .entity("entity") // 设置 Entity 包名
                        .service("service") // 设置 Service 包名
                        .serviceImpl("service.impl") // 设置 Service Impl 包名
                        .mapper("mapper") // 设置 Mapper 包名
                        //.xml("MapperXml") // 设置 Mapper XML 包名, 如果没有pathInfo这个配置,此处就会生效
                        .controller("controller") // 设置 Controller 包名
                        // 设置路径配置信息: 单独设置xml文件的路径
                        .pathInfo(Collections.singletonMap(OutputFile.xml, System.getProperty("user.dir") + "/src/main/resources/mapper"))
                        .build())
                /**************************策略配置****************************************/
                .strategyConfig(builder -> builder
                        .enableCapitalMode()// 开启大写命名
                        .enableSkipView() // 开启跳过视图
                        .disableSqlFilter() // 禁用 SQL 过滤
                        //.likeTable(new LikeTable("USER")) // 模糊匹配表名
                        .addInclude("t_user","t_person","t_person_student") // 增加表匹配
                        .addTablePrefix("t_") // 增加过滤表前缀
                        //.addFieldSuffix("_flag") // 增加过滤字段后缀
                        /***************Entity 策略配置**********************/
                        .entityBuilder()//设置实体类模板
                        .logicDeleteColumnName("is_Deleted") //逻辑删除字段名(数据库字段)
                        .enableFileOverride()//覆盖已生成文件
                        .enableLombok()//开启 Lombok 模型
                        /***************模板配置 (TemplateConfig)**********************/
                        //.javaTemplate("/templates/entity.java") // 设置 Java 实体模板(自定义模版)
                        ///.mapperBuilder()
                        //.mapperXmlTemplate("/templates/mapper.xml.vm")// 这里主要放的是自定义的模版
                        //.disable() // 禁用实体类生成(自定义模版)
                        //.serviceBuilder() //设置 Service 层模板(自定义模版)
                        //.disableService() // 禁用 Service 层生成(自定义模版)
                        //.serviceTemplate("/templates/service.java") // 设置 Service 模板(自定义模版)
                        //.serviceImplTemplate("/templates/serviceImpl.java") // 设置 ServiceImpl 模板(自定义模版)
                        /***************Controller 策略配置**********************/
                        .controllerBuilder()
                        .enableRestStyle()//开启生成@RestController 控制器
                        .enableFileOverride()//覆盖已生成文件
                        /***************Service 策略配置**********************/
                        .serviceBuilder()
                        .enableFileOverride()//覆盖已生成文件
                        .formatServiceFileName("%sService")//格式化 Service 接口文件名称
                        .formatServiceImplFileName("%sServiceImpl")//格式化 Service 实现类文件名称
                        /***************Mapper 策略配置**********************/
                        /*Mapper 策略配置用于定制 Mapper 接口和对应的 XML 映射文件的生成规则,
                        包括父类、文件覆盖、Mapper 注解、结果映射、列列表、缓存实现类等。*/
                        .mapperBuilder()
                        .superClass(BaseMapper.class)// 设置父类
                        .enableBaseResultMap() // 	启用 BaseResultMap 生成
                        .enableBaseColumnList()// 	启用 BaseColumnList
                        .formatMapperFileName("%sMapper")//格式化 Mapper 文件名称
                        .formatXmlFileName("%sXml")//格式化 XML 实现类文件名称
                        .build())
                .execute();
    }
}

关于模版引擎"/templates/mapper.xml.vm":位置是在mybatis-plus-generator-3.5.9.jar的包下

自定义xml模版

模版的的编写:语法是velocity的语法

<?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

    <!-- 普通插入语句 -->
    <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>

</mapper>

自定义模版的放置路径:src/main/resources/templates/mymapper.xml.vm

自定义模版的配置:

.strategyConfig(builder -> builder
                        .mapperBuilder()
                        .mapperXmlTemplate("/templates/mymapper.xml.vm")//路径

自定义模版生成xml的效果

<?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="com.lin.mymybatisplusdemo.mapper.UserMapper">

        <!-- 通用查询映射结果 -->
        <resultMap id="BaseResultMap" type="com.lin.mymybatisplusdemo.entity.User">
                    <id column="uid" property="uid" />
                    <result column="name" property="name" />
                    <result column="age" property="age" />
                    <result column="email" property="email" />
                    <result column="is_deleted" property="isDeleted" />
        </resultMap>

        <!-- 通用查询结果列 -->
        <sql id="Base_Column_List">
                uid, name, age, email, is_deleted
        </sql>


    <!-- 普通插入语句 -->
    <insert id="insert">
        INSERT INTO t_user
        <trim prefix="(" suffix=")" suffixOverrides=",">
                    <if test="uid != null"> uid,</if>
                    <if test="name != null"> name,</if>
                    <if test="age != null"> age,</if>
                    <if test="email != null"> email,</if>
                    <if test="isDeleted != null"> is_deleted,</if>
        </trim>
        <trim prefix="VALUES(" suffix=")" suffixOverrides=",">
                    <if test="uid != null"> #{uid},</if>
                    <if test="name != null"> #{name},</if>
                    <if test="age != null"> #{age},</if>
                    <if test="email != null"> #{email},</if>
                    <if test="isDeleted != null"> #{isDeleted},</if>
        </trim>
    </insert>

</mapper>

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1909773034@qq.com

×

喜欢就点赞,疼爱就打赏