前言
系列很长,请配合目录观看。
mybatis-plus
作为Mybatis
的增强工具,这几年从初出茅庐到现在的功能强大,经历了许多版本的迭代。mybatis-plus
官网介绍了其许许多多的特性,但笔者看中的是其中这几样:
- 低XML开发:原版的mybatis对于hibernate来说最大的优点就是灵活性,但对于业务简单的代码来说,频繁编写xml文件也成了一个大困扰,项目到后期面对大堆xml文件也足以让人头疼。
- 支持灵活的CRUD操作: 基本覆盖日常使用的sql场景。
- 简单的插件:分页、自适应填充、主键策略、乐观锁、多租户等等。对于中小型项目非常友好,不过大型项目还是不推荐使用这些插件来实现锁、租户等功能。
- 多数据源:Mybatis-plus的多数据源相比于原生连接池的若干配置文件可谓优雅。
官网地址:mybatis-plus
代码生成器
最近mybatis-plus终于推出了新的代码生成器,深受老版生成器荼毒的笔者拍手叫好。
新版的代码生成器必须依赖mybatis-plus-generator
3.5.1版本以上,旧版强烈建议升级。需要注意,此依赖仅用于生成相关代码,mybatis-plus本身的运行不需要依赖此包。这里贴一下需要的所有依赖:
<!-- mybatis plus 主依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.0</version>
</dependency>
<!-- mybatis plus 代码生成器依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.1</version>
</dependency>
<!-- 代码生成器模板,用于生成代码 -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.3</version>
</dependency>
加好依赖后,准备编写代码生成器,我们新建一个带Main函数的类,可以放在test目录下。
代码生成器生成的范围包括:controller、service、serviceImpl、mapper、entity、mapping
Main方法中最基础的代码如下:
FastAutoGenerator.create("jdbc:mysql://172.22.12.21:3309/wochanye","root","XXXXX")
.globalConfig(builder -> {
builder.outputDir(System.getProperty("user.dir")+"/src/main/java");
})
.packageConfig(builder -> {
builder.parent("com.wochanye.mp"); // 设置父包名
})
.strategyConfig(builder -> {
builder.addInclude("region_data"); // 设置需要生成的表名
})
.execute();
其实到这里,生成的代码已经可以使用了。不过很多配置还是需要加的,毕竟做项目方方面面有很多。
代码生成器主要分成6部分:数据库配置、全局配置、包配置、模板配置、注入配置、策略配置。
想看完整示例的请跳过至完整示例:完整示例
数据库配置
// 大多数场景下这一行已经足够,代码生成器会自动判断schema和数据库的类型
new DataSourceConfig.Builder("jdbc:mysql://127.0.0.1:3306/mybatis-plus","root","123456")
// 配置schema,可不填自动识别
.schema("mybatis-plus")
// 下面三个配置是特定的查询语句、类型转换器、关键词处理器,极端场景可以使用(如地理空间类型,后面会介绍一下)
.dbQuery(new MySqlQuery())
.typeConvert(new MySqlTypeConvert())
.keyWordsHandler(new MySqlKeyWordsHandler())
.build();
全局配置
这里配置的主要是一些可选的全局策略,详见代码:
new GlobalConfig.Builder()
// (重要)配置后再次执行覆盖原有文件,建议配置
.fileOverride()
// (重要)配置输出的文件夹,springboot项目可以使用如下方式
.outputDir(System.getProperty("user.dir") + "/src/main/java")
// (重要)时间类型,看你喜欢用sql包中的Date、util包中的Date还是更新的LocalDateTime
.dateType(DateType.TIME_PACK)
// 配置生成文件中的author
.author("Chenyongyu")
// 是否启用kotlin模式
.enableKotlin()
// 是否启用swagger,比如启用后会在entity中自动生成字段ApiModel注释等等
.enableSwagger()
// 注释日期的格式
.commentDate("yyyy-MM-dd")
.build();
时间类型那一点还是比较重要的,如果业务代码中我们喜欢使用java8以后的LocalDateTime体系,配置DateType.TIME_PACK
后,生成的entity类中时间类型就是LocalDate或者LocalDateTime。
包配置
这里主要是配置生成文件的包位置
new PackageConfig.Builder()
// (重要)配置公共的父包名,建议配置
.parent("com.wochanye.mp")
// 配置公共的模块名,多模块项目可以使用
.moduleName("sys")
// 配置entity包名,默认entity,可以不配置
.entity("entity")
// 配置service包名,默认service,可以不配置,下面的配置也是
.service("service")
.serviceImpl("service.impl")
.mapper("mapper")
.mapperXml("mapper.xml")
.controller("controller")
.other("other")
.build();
这里没什么大问题,有一点,就是很多人是不想用mybatis-plus生成的service层以及controller层的,那么可以考虑把他们都生成到一个额外的包里面,比如配置.service("delete"),然后一起删除。
策略配置
策略配置中有很多细分配置,比如详细到具体entity的配置、service、mapper的配置、表过滤的配置,内容很多,就不一一介绍了,这里贴一下使用率较高的配置。
.strategyConfig(builder -> {
builder
// 跳过视图的生成
.enableSkipView()
.entityBuilder()
// (重要)主键模式,这里设置自动模式,配合mysql的自增主键
.idType(IdType.AUTO)
// entity文件名,这里配置后面统一加Entity后缀
.formatFileName("%sEntity")
// activeRecord模式,使用上来说就是可以直接在entity对象上执行insert、update等操作
.enableActiveRecord()
.build();
})
注入配置和模板配置不做定制化的话不怎么使用,后面具体用到的时候具体来说。
完整示例
最后贴一下整体的生成器代码:
FastAutoGenerator.create("jdbc:mysql://172.22.12.21:3309/wochanye","root","Uni@123")
.globalConfig(builder -> {
builder // (重要)配置后再次执行覆盖原有文件,建议配置
.fileOverride()
// (重要)配置输出的文件夹,springboot项目可以使用如下方式
.outputDir(System.getProperty("user.dir") + "/src/main/java")
// (重要)时间类型,看你喜欢用sql包中的Date、
// util包中的Date还是更新的LocalDateTime
.dateType(DateType.TIME_PACK)
// 配置生成文件中的author
.author("Chenyongyu")
// 是否启用kotlin模式
// .enableKotlin()
// 是否启用swagger,比如启用后会在entity中自动生成字段ApiModel注释等等
// .enableSwagger()
// 注释日期的格式
.commentDate("yyyy-MM-dd")
.build();
})
.packageConfig(builder -> {
builder.parent("com.wochanye.mp") // 设置父包名
.service("delete")
.serviceImpl("delete")
.controller("delete")
;
})
.strategyConfig(builder -> {
builder
.addInclude("region_data","table_4_mp")
// 跳过视图的生成
.enableSkipView()
.entityBuilder()
// (重要)主键模式,这里设置自动模式,配合mysql的自增主键
.idType(IdType.AUTO)
// entity文件名,这里配置后面统一加Entity后缀
.formatFileName("%sEntity")
// activeRecord模式,使用上来说就是
// 可以直接在entity对象上执行insert、update等操作
.enableActiveRecord()
.build();
})
// 使用Freemarker引擎模板,默认的是Velocity引擎模板
.templateEngine(new VelocityTemplateEngine())
.execute();
执行效果
这是执行完后的效果:
初步使用
- 首先是都要有的数据源配置和mp配置,由于兼容,因此不需要mybatis的配置
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://172.xx.xx.xx:3309/xxxx
username: root
password: XXX
mybatis-plus:
# xml文件位置
mapper-locations:
- classpath*:com/wochanye/mp/mapper/xml/*.xml
# 实体类位置
type-aliases-package: com.wochanye.mp.entity
# 打印sql日志
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
- 然后是启动类的配置:
@SpringBootApplication
@MapperScan(basePackages = {"com.wochanye.mp.mapper"})
public class MybatisPlusDemoApplication {
- 我们在Test类中注入mapper对象,试试初步使用
@Resource
private RegionDataMapper regionDataMapper;
@Test
void contextLoads() {
// 查询列表并打印
log.info(regionDataMapper.selectList(Wrappers.query())
.stream()
.map(RegionDataEntity::getName)
.collect(Collectors.joining(",")));
// 直接用new的实体来insert
Table4MpEntity table4MpEntity = new Table4MpEntity();
table4MpEntity.setName("辣椒儿");
table4MpEntity.setAge(28);
table4MpEntity.insert();
}
下面是执行结果: