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代码生成器更新版本使用
- 导入依赖
<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>
- 快速实践
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();
}
}
- 交互式生成
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.com")
//默认无
//.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代码生成器官方教程
代码生成器配置新