MP代码生成器使用指南

  • 1)简介
  • 2)MP 的代码生成器 和 Mybatis MBG代码生成器的对比
  • 3)表及字段命名策略选择
  • 1.使用添加依赖
  • 2.生成器代码
    • 关于服务层自动注入
  • mybaits-plus代码生成器更新版本使用
    • MP代码生成器最新配置详解
      • 数据库配置(DataSourceConfig)
        • 基础配置
        • 可选配置
      • 全局配置(GlobalConfig)
      • 包配置(PackageConfig)
      • 模板配置(TemplateConfig)
      • 注入配置(InjectionConfig)
      • 策略配置(StrategyConfig)
      • Entity 策略配置
      • Controller 策略配置
      • Service 策略配置
      • Mapper 策略配置
    • 标准配置
    • 建议去看官方文档进行相关配置,链接如下


1)简介

MP 提供了大量的自定义设置,生成的代码完全能够满足各类型的需求。AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。


2)MP 的代码生成器 和 Mybatis MBG代码生成器的对比

MP 的代码生成器都是基于 java 代码来生成。MBG 基于 xml 文件代码生成

MyBatis 的代码生成器可生成: 实体类、Mapper 接口、Mapper 映射文件

MP的代码生成器可生成: 实体类(可以选择是否支持 AR)、Mapper 接口、Mapper 映射文件、 Service 层、Controller层。IDEA的EasyCode也是可以进行生成。


3)表及字段命名策略选择

在MybatisPlus中,我们建议数据库表名 和 表字段名采用驼峰命名方式, 如果采用下划线命名方式,请开启全局下划线开关(版本2.3默认开启),如果表名字段名命名方式不一致请注解指定,我们建议最好保持一致(约定大于配置)

这么做的原因是为了避免在对应实体类时产生的性能损耗,这样字段不用做映射就能直接和实体类对应。当然如果项目里不用考虑这点性能损耗,那么你采用下滑线也是没问题的,只需要在生成代码时配置dbColumnUnderline(map-underscore-to-camel-case)属性就可以。


1.使用添加依赖

MyBatis-Plus 从 3.0.3 之后移除了代码生成器与模板引擎的默认依赖,需要手动添加相关依赖:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.4.1</version>
</dependency>
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.0</version> 
        </dependency>

如果使用的是spring而不是springboot,还需要导入slf4j的依赖,springboot在启动器中默认导入了

<!--sfl4j日志依赖-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.7</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.7</version>
        </dependency>

2.生成器代码

    @Test
    public void testGenerator() {
        //获取当前系统的目录
        String ObjectPath = System.getProperty("user.dir");

        //1.全局策略配置
        GlobalConfig config = new GlobalConfig();
        config.setActiveRecord(true)//是否支持AR模式
                .setAuthor("大忽悠")//作者
                .setOutputDir(ObjectPath+"/src/main/java")//生成路径
                .setFileOverride(true)//文件覆盖
                .setIdType(IdType.AUTO)//主键策略
                .setServiceName("%sService")//设置生成service接口名字的首字母是否为I(默认会生成I开头的IStudentService)
                .setBaseResultMap(true)//自动SQL映射文件,生成基本的ResultMap
                .setBaseColumnList(true)//生成基本的SQL片段
                .setSwagger2(true); //实体属性 Swagger2 注解

        //2.数据源配置
        DataSourceConfig dataSourceConfig = new DataSourceConfig();
        dataSourceConfig.setDbType(DbType.MYSQL)//设置数据库类型
                .setDriverName("com.mysql.jdbc.Driver")//数据库驱动名
                .setUrl("jdbc:mysql://localhost:3306/tx?useUnicode=true&characterEncoding=UTF-8")//数据库地址
                .setUsername("root")//数据库名字
                .setPassword("126433");//数据库密码


        //自动填充配置
        TableFill gmtCreate=new TableFill("gmt_create", FieldFill.INSERT);
        TableFill gemModified=new TableFill("gmt_modified",FieldFill.INSERT_UPDATE);
        ArrayList<TableFill> tableFills=new ArrayList<>();
        //3.策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setCapitalMode(true)//全局大写命名
                .setNaming(NamingStrategy.underline_to_camel)//数据库表映射到实体的命名策略
                .setColumnNaming(NamingStrategy.underline_to_camel)//列的命名也支持驼峰命名规则
                //.setTablePrefix("tbl_")//数据库表的前缀
                .setInclude("user")//设置要映射的表名,这里可以写多个
                .setEntityLombokModel(true)  //使用Lombok开启注解
                .setLogicDeleteFieldName("deleted")//设置逻辑删除字段
                 .setTableFillList(tableFills)//设置自动填充配置
                  .setVersionFieldName("version")//乐观锁配置
                   .setRestControllerStyle(true)//开启驼峰命名格式
                   .setControllerMappingHyphenStyle(true);//controller层,开启下划线url : //localhost:8080/hello_id_2

        //4.包名策略
        PackageConfig packageConfig = new PackageConfig();
        packageConfig
                .setModuleName("DHY")//设置模块名
                .setParent("com.template")//所放置的包(父包)
                .setMapper("mapper")//Mapper包
                .setService("service")//服务层包
                .setController("controller")//控制层
                .setEntity("beans")//实体类
                .setXml("mapper");//映射文件
        //5.整合配置
        AutoGenerator autoGenerator = new AutoGenerator();
        autoGenerator.setGlobalConfig(config)
                .setDataSource(dataSourceConfig)
                .setStrategy(strategy)
                .setPackageInfo(packageConfig);
        //6.执行
        autoGenerator.execute();
    }


关于服务层自动注入

Service层的接口自动继承了了IService接口,里面有一些常用操作的接口

Service层的实现类不仅实现了Service层的接口,并且还继承了ServiceImpl类,该类也实现了IService接口。所以我们的serviceimpl不需要写一些简单具体操作的实现。并且也不需要自动注入mapper,在ServiceImpl中已经帮我们注入了。

//服务层接口
public interface EmployeeService extends IService<Employee> {

}
//服务层实现类
@Service
public class EmployeeServiceImpl extends ServiceImpl<EmployeeMapper, Employee> implements EmployeeService {
    //不用再进行Mapper的注入
    /**
     * EmployeeServiceImpl  集成了ServiceImpl
     * 1.在ServiceImpl中已经完成Mapper对象的注入,直接在EmployeeServiceImpl中进行使用
     * 2.在ServiceImpl中野帮我们提供了常用的CRUD方法,基本的一些CRUD方法在Service中不需要我们自己定义
     */
}
//被继承的接口
public class ServiceImpl<M extends BaseMapper<T>, T> implements IService<T> {
    @Autowired
    protected M baseMapper;//已自动注入Mapper
    //各种方法省略
}


mybaits-plus代码生成器更新版本使用

  1. 导入依赖
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.5.1</version>
</dependency>

模板引擎选择自己需要的引入即可,可选项有下面三个:

添加 模板引擎 依赖,MyBatis-Plus 支持 Velocity(默认)、Freemarker、Beetl,用户可以选择自己熟悉的模板引擎,如果都不满足您的要求,可以采用自定义模板引擎。

Velocity(默认):

<dependency>
    <groupId>org.apache.velocity</groupId>
    <artifactId>velocity-engine-core</artifactId>
    <version>2.3</version>
</dependency>

Freemarker:

<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.31</version>
</dependency>

Beetl:

<dependency>
    <groupId>com.ibeetl</groupId>
    <artifactId>beetl</artifactId>
    <version>3.9.3.RELEASE</version>
</dependency>
  1. 快速实践
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import dhy.com.Main;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.Collections;

/**
 * @author 大忽悠
 * @create 2022/1/6 17:04
 */
@SpringBootTest(classes = Main.class,webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
public class Generator
{
    public void generator()
    {
        FastAutoGenerator.create("url", "username", "password")
                .globalConfig(builder -> {
                    builder.author("dhy") // 设置作者
                            .enableSwagger() // 开启 swagger 模式,这里开启的是对swagger2的支持
                            .fileOverride() // 覆盖已生成文件
                            .outputDir("D://"); // 指定输出目录
                })
                .packageConfig(builder -> {
                    builder.parent("com.dhy") // 设置父包名
                            .moduleName("system") // 设置父包模块名
                            .pathInfo(Collections.singletonMap(OutputFile.mapperXml, "D://")); // 设置mapperXml生成路径
                })
                .strategyConfig(builder -> {
                    builder.addInclude("t_simple") // 设置需要生成的表名
                            .addTablePrefix("t_", "c_"); // 设置过滤表前缀
                })
                //使用freemark引擎要引入freemark的依赖
                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
                .execute();
    }
}

  1. 交互式生成
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.fill.Column;
import dhy.com.Main;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * @author 大忽悠
 * @create 2022/1/6 17:04
 */
@SpringBootTest(classes = Main.class,webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
public class Generator
{
    public void generator()
    {
        FastAutoGenerator.create(DATA_SOURCE_CONFIG)
                // 全局配置
                .globalConfig((scanner, builder) -> builder.author(scanner.apply("请输入作者名称?")).fileOverride())
                // 包配置
                .packageConfig((scanner, builder) -> builder.parent(scanner.apply("请输入包名?")))
                // 策略配置
                .strategyConfig((scanner, builder) -> builder.addInclude(getTables(scanner.apply("请输入表名,多个英文逗号分隔?所有输入 all")))
                        .controllerBuilder().enableRestStyle().enableHyphenStyle()
                        .entityBuilder().enableLombok().addTableFills(
                                new Column("create_time", FieldFill.INSERT)
                        ).build())
                /*
                    模板引擎配置,默认 Velocity 可选模板引擎 Beetl 或 Freemarker
                   .templateEngine(new BeetlTemplateEngine())
                   .templateEngine(new FreemarkerTemplateEngine())
                 */
                .execute();
    }
    //处理 all 情况
    protected static List<String> getTables(String tables)
    {
        return "all".equals(tables) ? Collections.emptyList() : Arrays.asList(tables.split(","));
    }
}


MP代码生成器最新配置详解

数据库配置(DataSourceConfig)

基础配置

new DataSourceConfig.Builder("jdbc:mysql://127.0.0.1:3306/mybatis-plus","root","123456")
    .build();

可选配置

new DataSourceConfig.Builder("jdbc:mysql://127.0.0.1:3306/mybatis-plus","root","123456")
    .dbQuery(new MySqlQuery()) //设置当前数据库查询类型
    .schema("mybatis-plus")//
    .typeConvert(new MySqlTypeConvert())
    .keyWordsHandler(new MySqlKeyWordsHandler())
    .build();

全局配置(GlobalConfig)

new GlobalConfig.Builder()
    .fileOverride()
    .outputDir("/opt/dhy")
    .author("dhy")
    .enableKotlin()
    .enableSwagger()
    .dateType(DateType.TIME_PACK)
    .commentDate("yyyy-MM-dd")
    .build();

包配置(PackageConfig)

new PackageConfig.Builder()
    .parent("com.baomidou.mybatisplus.samples.generator")
    .moduleName("sys")
    .entity("po")
    .service("service")
    .serviceImpl("service.impl")
    .mapper("mapper")
    .mapperXml("mapper.xml")
    .controller("controller")
    .other("other")
    .pathInfo(Collections.singletonMap(OutputFile.mapperXml, "D://"))
    .build();

模板配置(TemplateConfig)

new TemplateConfig.Builder()
    .disable(TemplateType.ENTITY)
    .entity("/templates/entity.java")
    .service("/templates/service.java")
    .serviceImpl("/templates/serviceImpl.java")
    .mapper("/templates/mapper.java")
    .mapperXml("/templates/mapper.xml")
    .controller("/templates/controller.java")
    .build();

注入配置(InjectionConfig)

new InjectionConfig.Builder()
    .beforeOutputFile((tableInfo, objectMap) -> {
    //预处理输出模板信息
        System.out.println("tableInfo: " + tableInfo.getEntityName() + " objectMap: " + objectMap.size());
    })
    //自定义传入模板的参数值
    .customMap(Collections.singletonMap("test", "baomidou"))
    //自定义自己的模板
    .customFile(Collections.singletonMap("test.txt", "/templates/test.vm"))
    .build();

策略配置(StrategyConfig)

new StrategyConfig.Builder()
    .enableCapitalMode()
    .enableSkipView()
    .disableSqlFilter()
    .likeTable(new LikeTable("USER"))
    .addInclude("t_simple")
    .addTablePrefix("t_", "c_")
    .addFieldSuffix("_flag")
    .build();

Entity 策略配置


new StrategyConfig.Builder()
    .entityBuilder()
    .superClass(BaseEntity.class)
    .disableSerialVersionUID()
    .enableChainModel()
    .enableLombok()
    .enableRemoveIsPrefix()
    .enableTableFieldAnnotation()
    .enableActiveRecord()
    .versionColumnName("version")
    .versionPropertyName("version")
    .logicDeleteColumnName("deleted")
    .logicDeletePropertyName("deleteFlag")
    .naming(NamingStrategy.no_change)
    .columnNaming(NamingStrategy.underline_to_camel)
    .addSuperEntityColumns("id", "created_by", "created_time", "updated_by", "updated_time")
    .addIgnoreColumns("age")
    .addTableFills(new Column("create_time", FieldFill.INSERT))
    .addTableFills(new Property("updateTime", FieldFill.INSERT_UPDATE))
    .idType(IdType.AUTO)
    .formatFileName("%sEntity")
    .build();

Controller 策略配置

new StrategyConfig.Builder()
    .controllerBuilder()
    .superClass(BaseController.class)
    .enableHyphenStyle()
    .enableRestStyle()
    .formatFileName("%sAction")
    .build();


Service 策略配置

new StrategyConfig.Builder()
    .serviceBuilder()
    .superServiceClass(BaseService.class)
    .superServiceImplClass(BaseServiceImpl.class)
    .formatServiceFileName("%sService")
    .formatServiceImplFileName("%sServiceImp")
    .build();


Mapper 策略配置

new StrategyConfig.Builder()
    .mapperBuilder()
    .superClass(BaseMapper.class)
    .enableMapperAnnotation()
    .enableBaseResultMap()
    .enableBaseColumnList()
    .cache(MyMapperCache.class)
    .formatMapperFileName("%sDao")
    .formatXmlFileName("%sXml")
    .build();

标准配置

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.TemplateType;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import dhy.com.Main;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;


import java.util.Collections;


/**
 * @author 大忽悠
 * @create 2022/1/6 17:04
 */
@SpringBootTest(classes = Main.class,webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@Slf4j
public class Generator
{
    @Value("${spring.datasource.url}")
    private String url;
    @Value("${spring.datasource.username}")
    private String username;
    @Value("${spring.datasource.password}")
    private String password;

    private final String OUTPUTPATH=System.getProperty("user.dir")+"\\src\\main\\java";
    private final String XMLOUTPUTPATH=System.getProperty("user.dir")+"\\src\\main\\resources\\mapper\\";
    @Test
    public void generator()
    {
        System.out.println("输出目录为: "+OUTPUTPATH);
        FastAutoGenerator
                //数据库配置
                .create(url,username,password)
                //全局配置
                .globalConfig(builder -> {
                    builder.author("大忽悠")
                            //输出日期的格式
                            .commentDate("yyyy年MM月dd日")
                            //使用localDateTime
                            .dateType(DateType.TIME_PACK)
                             //可以覆盖已经生成的文件,默认为false
                            .fileOverride()
                            //禁止打开输出目录
                            .disableOpenDir()
                            //指定输出目录
                            .outputDir(OUTPUTPATH)
                            .build();
                })
                //包配置
                .packageConfig(builder -> {
                    //父包名
                    builder.parent("dhy")
                            //默认无
                            //.moduleName()
                            //设置实体类包名
                            .entity("domain")
                            .service("service")
                            .serviceImpl("serviceImpl")
                            .controller("controller")
                            .mapper("mapper")
                            .xml("mapper.xml")
                            //设置mapper.xml文件的输出路径
                            .pathInfo(Collections.singletonMap(OutputFile.mapperXml,XMLOUTPUTPATH))
                            .build();
                })
                //策略配置
                .strategyConfig(builder -> {
                    //设置要映射的表
                    builder.addInclude("badgewithuser","bigachivement","smallachivement")
                            .build()
                            //实体类配置
                            .entityBuilder()
                            //开启链式模式
                            .enableChainModel()
                            //开启lombok注解
                            .enableLombok();
                })
                //模板配置---不输出controller层
                .templateConfig(builder -> {
                    builder.disable(TemplateType.CONTROLLER);
                })
                .execute();

    }

}


建议去看官方文档进行相关配置,链接如下

MP代码生成器官方教程

代码生成器配置新

更多推荐

MyBaitsPlus---MP代码生成器使用指南