最新版Mybatis-plus3.5.0全面攻略(一)代码生成器和初步使用

3,674

前言

系列很长,请配合目录观看。
mybatis-plus作为Mybatis的增强工具,这几年从初出茅庐到现在的功能强大,经历了许多版本的迭代。mybatis-plus官网介绍了其许许多多的特性,但笔者看中的是其中这几样:

  • 低XML开发:原版的mybatis对于hibernate来说最大的优点就是灵活性,但对于业务简单的代码来说,频繁编写xml文件也成了一个大困扰,项目到后期面对大堆xml文件也足以让人头疼。
  • 支持灵活的CRUD操作: 基本覆盖日常使用的sql场景。
  • 简单的插件:分页、自适应填充、主键策略、乐观锁、多租户等等。对于中小型项目非常友好,不过大型项目还是不推荐使用这些插件来实现锁、租户等功能。
  • 多数据源:Mybatis-plus的多数据源相比于原生连接池的若干配置文件可谓优雅。 image.png

官网地址:mybatis-plus

代码生成器

最近mybatis-plus终于推出了新的代码生成器,深受老版生成器荼毒的笔者拍手叫好。
新版的代码生成器必须依赖mybatis-plus-generator3.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();

执行效果

这是执行完后的效果:

image.png

初步使用

  1. 首先是都要有的数据源配置和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
  1. 然后是启动类的配置:
@SpringBootApplication
@MapperScan(basePackages = {"com.wochanye.mp.mapper"})
public class MybatisPlusDemoApplication {
  1. 我们在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();
}

下面是执行结果:

image.png