文章目录

  • 简介
  • 注意事项
  • 依赖引入
  • 代码生成工具
  • 注释
  • 1、自动填充
  • 2、乐观锁和分页
  • 3、逻辑删除
  • 代码git地址
  • 参考资料


简介

AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。

注意事项

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

依赖引入

Mybatis-Plus 依赖引入如下所示:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.0</version>
</dependency>

3.0.3移除了代码自动生成,还需要引入代码生成器依赖

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

3.0.3移除了模板,还需要引入模板:下面3个选一个即可

<!--模板引擎-->
 <!-- https://mvnrepository.com/artifact/org.apache.velocity/velocity-engine-core -->
 <dependency>
     <groupId>org.apache.velocity</groupId>
     <artifactId>velocity-engine-core</artifactId>
     <version>2.2</version>
 </dependency>

 <!-- https://mvnrepository.com/artifact/org.freemarker/freemarker -->
<!-- <dependency>
     <groupId>org.freemarker</groupId>
     <artifactId>freemarker</artifactId>
     <version>2.3.30</version>
 </dependency>-->

 <!-- https://mvnrepository.com/artifact/com.ibeetl/beetl -->
 <!--<dependency>
     <groupId>com.ibeetl</groupId>
     <artifactId>beetl</artifactId>
     <version>3.1.3.RELEASE</version>
 </dependency>-->

Velocity是默认的模板,如果使用别的模板,还需要做以下配置。

AutoGenerator generator = new AutoGenerator();
// set freemarker engine
generator.setTemplateEngine(new FreemarkerTemplateEngine());

// set beetl engine
generator.setTemplateEngine(new BeetlTemplateEngine());

// set custom engine (reference class is your custom engine class)
generator.setTemplateEngine(new CustomTemplateEngine());

// other config
...

当然此处将MySQL表结构自动生成Java,还需要引入数据库驱动:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

代码生成工具

编写代码生成Java类,运行即可。

代码如下所示:

package cn.linkpower;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

import java.util.ArrayList;

// 代码生成器
public class CodeGenerator {
    public static void main(String[] args) {
        // 构建一个代码生成器对象
        AutoGenerator mpg = new AutoGenerator();
        // 配置策略
        // 1、全局配置
        GlobalConfig gc = new GlobalConfig();
        // 设置生成代码的目录
        // 获取当前项目的目录
        String property = System.getProperty("user.dir");
        gc.setOutputDir(property + "/src/test/java/"); // 这里是生成在 /test/ 下,可以根据具体情况改变

        // 生成代码的作者
        gc.setAuthor("专注写bug");

        // 生成完成后,打开项目所在windows下的文件夹(false 不打开)
        gc.setOpen(false);

        // 是否覆盖原来的文件(false 不覆盖)
        gc.setFileOverride(true);

        // 去除IService的I前缀
        gc.setServiceImplName("%sService");

        // 设置pojo类主键策略
        gc.setIdType(IdType.ID_WORKER);

        // 设置pojo类data的类型
        gc.setDateType(DateType.ONLY_DATE);

        // 设置swagger文档
        gc.setSwagger2(false);

         // 将配置丢入自动生成器内
        mpg.setGlobalConfig(gc);

        // 2、设置数据源
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://192.168.99.100:3306/mybatis_plus?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8");
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("你的密码");
        dsc.setDbType(DbType.MYSQL); // 使用的是mysql
        mpg.setDataSource(dsc);

        // 3、包的配置
        PackageConfig pc = new PackageConfig();
        pc.setParent("cn.linkpower");
        pc.setModuleName("test");
        pc.setEntity("pojo");
        pc.setMapper("mapper");
        pc.setService("service");
        pc.setController("controller");
        mpg.setPackageInfo(pc);

        // 4、配置策略
        StrategyConfig strategy = new StrategyConfig();
        strategy.setInclude("user"); // 设置要映射的表,多个则使用 ”,“ 分割
        strategy.setNaming(NamingStrategy.underline_to_camel); // 命名规则(下划线转驼峰)
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);//列的名字(下划线转驼峰)
        //strategy.setSuperEntityClass("你自己的父类实体,没有就不用设置!");
        strategy.setEntityLombokModel(true); // 是否使用lombok开启注解

        // 设置逻辑删除的别名
        strategy.setLogicDeleteFieldName("deleted");
        // 设置自动填充配置
        TableFill create_time = new TableFill("create_time", FieldFill.INSERT);
        TableFill update_time = new TableFill("update_time", FieldFill.INSERT_UPDATE);
        ArrayList<TableFill> tableFiledLists = new ArrayList<>();
        tableFiledLists.add(create_time);
        tableFiledLists.add(update_time);
        strategy.setTableFillList(tableFiledLists);

        // 乐观锁策略
        strategy.setVersionFieldName("version");
        // controller 驼峰命名
        strategy.setRestControllerStyle(true);
        strategy.setControllerMappingHyphenStyle(true); // requestMapping中使用下划线命名

        mpg.setStrategy(strategy);

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

运行结束后,代码视图如下所示:

java mybatis 数据库id 自动生成 mybatisplus自动生成dao_代码生成器

注释

上面的代码生成器,对自动填充乐观锁逻辑删除等只是加了注解配置,并无其他配置项。这些配置项需要手动在对应的配置文件中编写。

1、自动填充

package cn.linkpower.config;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

import java.util.Date;

@Slf4j
@Component // 将组件加载至spring的ioc容器中
public class MyMetaObjectHandler implements MetaObjectHandler {

    /**
     * 插入时的填充策略
     * @param metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("---- insertFill ---");
        // metaObject.hasSetter() 可以用来判断是否有这个列,但是即便是没有这个列,写下面的配置也不会报错!
        // 插入数据时
        // 给 createTime 设定时间
        this.setFieldValByName("createTime",new Date(),metaObject);
        // 给 update_time 设定时间
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }

    /**
     * 更新时的填充策略
     * @param metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("---- updateFill ---");
        // 更新操作时,只需要修改 update_time 的数据即可
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }
}

2、乐观锁和分页

package cn.linkpower.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.injector.ISqlInjector;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.aop.interceptor.PerformanceMonitorInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import java.security.PermissionCollection;

@Configuration
@EnableTransactionManagement // 开启事务,默认是开启的
public class MPOptimisticLockerConfig {

    /**
     * 旧版
     */
//    @Bean
//    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
//        return new OptimisticLockerInterceptor();
//    }

    /**
     * 新版
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();

        // 乐观锁
        mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());

        // 分页
        // 官方给的案例是H2数据库,我们测试使用的是MySQL,此处需要做更改
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return mybatisPlusInterceptor;
    }

    // 分页旧版
//    @Bean
//    public PaginationInterceptor paginationInterceptor() {
//        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
//        // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求  默认false
//        // paginationInterceptor.setOverflow(false);
//        // 设置最大单页限制数量,默认 500 条,-1 不受限制
//        // paginationInterceptor.setLimit(500);
//        // 开启 count 的 join 优化,只针对部分 left join
//        paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
//        return paginationInterceptor;
//    }

    /**
     * SQL执行效率插件 性能分析插件(3.2.0 之后废除)
     */
//    @Bean
//    @Profile({"dev","test"})// 设置 dev test 环境开启
//    public PerformanceInterceptor performanceInterceptor() {
//        PerformanceInterceptor performanceInterceptor =  new PerformanceInterceptor();
//        performanceInterceptor.setFormat(true);//格式化语句
//        //performanceInterceptor.setMaxTime(5);//执行时间超过多少秒会抛出异常
//        return  performanceInterceptor;
//    }
}

3、逻辑删除

#逻辑删除配置
# 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
mybatis-plus.global-config.db-config.logic-delete-field: deleted
# 逻辑已删除值(默认为 1)
mybatis-plus.global-config.db-config.logic-delete-value: 1
# 逻辑未删除值(默认为 0)
mybatis-plus.global-config.db-config.logic-not-delete-value: 0

代码git地址

https://gitee.com/xiangjiaobunana/springboot-mybatis-plus.git

参考资料

代码生成器(官方文档)

MyBatis-Plus 代码生成器超详细讲解