新版本(针对3.5.1版本)
依赖导入
<!-- MyBatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
自动填充功能
必要条件:数据库中有create_time,update_time字段(或者类似的也行),不需要默认值和更新
实体类的字段属性上需要增加注解
//字段添加填充内容
@TableField(fill = FieldFill.INSERT)
private Date createTime;
//字段插入和修改填充内容
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
注解源码解释
public enum FieldFill {
/**
* 默认不处理
*/
DEFAULT,
/**
* 插入填充字段
*/
INSERT,
/**
* 更新填充字段
*/
UPDATE,
/**
* 插入和更新填充字段
*/
INSERT_UPDATE
}
创建一个handler包下
@Slf4j
@Component//一定不要忘记把处理器加到ioc容器中
public class MyMetaObjectHandler implements MetaObjectHandler {
//插入时的填充策略
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill");
this.strictInsertFill(metaObject, "createTime", Date.class, new Date());
this.strictInsertFill(metaObject, "updateTime", Date.class, new Date());
}
//更新时的填充策略
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill");
this.strictInsertFill(metaObject, "updateTime", Date.class, new Date());
}
}
乐观锁插件
必要条件:数据库中需要有version字段,设定其默认值为1
@Configuration//配置类
@MapperScan("com.lzj.mapper")
public class MyBatisPlusConfig {
/**
* 注册乐观锁插件
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return mybatisPlusInterceptor;
}
}
分页插件配置
@Configuration
@MapperScan("com.lzj.mapper")
public class MybatisPlusConfig {
/**
* 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除)
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2));
return interceptor;
}
}
自定义代码生成(适用于3.5.1及以上版本)
快速生成自定义代码
需要导入的3个依赖
<!-- freemarker模板引擎,因为我在代码生成器中选择导入的是freemarker模板疫情,如果你需要使用其他的模板引擎可以更换-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<!-- MP代码生成器-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.2</version>
</dependency>
<!-- lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
拿去即用,修改下以下数据即可:
- 数据库表名
- 数据源信息
- 作者名字
- 父包名
- 逻辑删除(需要使用可以取消注释)
- 过滤表前缀
- 模板引擎
package com.lzj;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* <p>
*
* </p>
*
* @autor:lzj
* @date:2022/4/6
*/
public class CodeGenerator {
public static void main(String[] args) {
List<String> tables = new ArrayList<>();
tables.add("m_user");//数据库的表名
tables.add("m_blog");
//1.配置数据源
FastAutoGenerator.create("jdbc:mysql://localhost:3306/vueblog?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai","root","root")
//2.全局配置
.globalConfig(builder -> {
builder.author("lzj") //设置作者名
.outputDir(System.getProperty("user.dir")+"/src/main/java") //输出路径(写到java目录)
.enableSwagger() //开启swagger
.commentDate("yyyy-MM-dd hh:mm:ss")//注释日期
.dateType(DateType.ONLY_DATE) //定义生成的实体类中日期的类型 TIME_PACK=LocalDateTime;ONLY_DATE=Date;
.fileOverride() //开启覆盖之前生成的文件
.disableOpenDir(); //禁止打开输出目录,默认打开
})
//3.包配置
.packageConfig(builder -> {
builder.parent("com.lzj")// 设置父包名
// .moduleName("lzj")//设置模块包名,设置了这个后在controller层的@RequestMapping("/user")会变成@RequestMapping("/lzj/user")
.entity("entity") //pojo 实体类包名
.service("service")//Service 包名
.serviceImpl("serviceImpl")// ***ServiceImpl 包名
.controller("controller")//Mapper XML 包名
.mapper("mapper")//Mapper 包名
.xml("mapper")//Mapper XML 包名
.other("utils") //自定义文件包名
.pathInfo(Collections.singletonMap(OutputFile.xml,System.getProperty("user.dir")+"/src/main/resources/mapper"));//mapper.xml路径信息,项目的 resources 目录的 Mapper 目录下
})
//4.策略配置
.strategyConfig(builder -> {
builder.addInclude(tables)//设置需要生成的数据表名
.addTablePrefix("m_")// 设置过滤表前缀,比如我数据库的表名叫m_blog,则过滤m_
//service 策略配置
.serviceBuilder()
.formatServiceFileName("%sService")//格式化 service 接口文件名称,%s进行匹配表名,如 UserService
.formatServiceImplFileName("%sServiceImpl")//格式化 service 实现类文件名称,%s进行匹配表名,如 UserServiceImpl
//实体类策略配置
.entityBuilder()
.enableLombok()//开启 Lombok
.logicDeleteColumnName("deleted")//逻辑删除字段名
.naming(NamingStrategy.underline_to_camel) //数据库表映射到实体的命名策略:下划线转驼峰命
.columnNaming(NamingStrategy.underline_to_camel) //数据库表字段映射到实体的命名策略:下划线转驼峰命
// .addTableFills(
// new Column("create_time", FieldFill.INSERT),
// new Column("modify_time", FieldFill.INSERT_UPDATE)
// )//添加表字段填充,"create_time"字段自动填充为插入时间,"modify_time"字段自动填充为插入修改时间
.enableTableFieldAnnotation()// 开启生成实体时生成字段注解
//Controller策略配置
.controllerBuilder()
.formatFileName("%sController")//格式化 Controller 类文件名称,%s进行匹配表名,如 UserController
.enableRestStyle()//开启生成 @RestController 控制器
//Mapper策略配置
.mapperBuilder()
.enableBaseResultMap() //生成通用的resultMap
.superClass(BaseMapper.class)//设置父类
.formatMapperFileName("%sMapper")//格式化 mapper 文件名称
.enableMapperAnnotation()//开启 @Mapper 注解
.formatXmlFileName("%sMapper");//格式化 Xml 文件名称
})
//5.配置模板引擎
.templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
/*
.templateEngine(new VelocityTemplateEngine())
.templateEngine(new BeetlTemplateEngine())
*/
//6.执行
.execute();
}
}
交互生成自定义代码格式
这种方式我只提供格式,可以将快速生成的修改成下面的格式即可使用
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("=====================数据库配置=======================");
System.out.println("请输入 URL");
String url = scan.next();
System.out.println("请输入 username");
String username = scan.next();
System.out.println("请输入 password");
String password = scan.next();
FastAutoGenerator.create(url, username, password)
// 全局配置
.globalConfig((scanner, builder) -> builder.author(scanner.apply("=====================全局配置=======================\n请输入作者名称?"))
.outputDir(System.getProperty("user.dir") + "/src/main/java")
.commentDate("yyyy-MM-dd hh:mm:ss")
.dateType(DateType.TIME_PACK)
.enableSwagger()
.fileOverride()
.enableSwagger()
.disableOpenDir()
)
// 包配置
.packageConfig((scanner, builder) -> builder.parent(scanner.apply("=====================包配置=======================\n请输入包名?"))
.moduleName(scanner.apply("请输入父包模块名?"))
.entity("entity")
.service("service")
.serviceImpl("serviceImpl")
.mapper("mapper")
.xml("mapper")
.other("utils")
.pathInfo(Collections.singletonMap(OutputFile.mapperXml, System.getProperty("user.dir")+"/src/main/resources/mapper"))
)
// 策略配置
.strategyConfig((scanner, builder) -> {
builder.addInclude(getTables(scanner.apply("=====================策略配置=======================\n请输入表名,多个英文逗号分隔?所有输入 all")))
.serviceBuilder()
.formatServiceFileName("%sService")
.formatServiceImplFileName("%sServiceImpl")
.entityBuilder() //实体类策略配置
.enableLombok() //开启 Lombok
.disableSerialVersionUID()
.logicDeleteColumnName("deleted") //逻辑删除字段
.naming(NamingStrategy.underline_to_camel)
.columnNaming(NamingStrategy.underline_to_camel)
.addTableFills(new Column("create_time", FieldFill.INSERT), new Column("modify_time", FieldFill.INSERT_UPDATE))
.enableTableFieldAnnotation() // 开启生成实体时生成字段注解
.controllerBuilder()
.formatFileName("%sController")
.enableRestStyle()
.mapperBuilder()
.superClass(BaseMapper.class)
.formatMapperFileName("%sMapper")
.enableMapperAnnotation() //@mapper
.formatXmlFileName("%sMapper");
})
/*
模板引擎配置,默认 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(","));
}
旧版本
旧版本的代码自动生成我还没有使用,所以这里就不写代码自动生成了
乐观锁插件
@MapperScan("com.lzj.mapper")
@EnableTransactionManagement //开启事务
@Configuration //配置类
public class MyBatisPlusConfig {
//注册乐观锁插件
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor(){
return new OptimisticLockerInterceptor();
}
}
分页插件
@Configuration
@MapperScan("com.lzj.mapper")
public class PageConfi {
@Bean
public PaginationInterceptor paginationInterceptor() {
// 这里就是分页插件的配置了,由于由@Configuration注解,所以是自动注入的,自动应用
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
return paginationInterceptor;
}
}