目录
一、简介
MyBatis-Plus是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。引入它不会对现有工程产生影响;引入后只需简单配置,即可快速进行单表CRUD操作,节省大量时间;适用于任何能使用MyBatis进行CRUD并且支持标准SQL的数据库。
二、配置
1、依赖
<!-- 数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- mybatis-plus(Spring Boot) -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>最新版本</version>
</dependency>
<!-- mybatis-plus(Spring) -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>最新版本</version>
</dependency>
2、配置文件
# 数据库连接配置
spring:
datasource:
username: root
password: liboran
# useSSL是否使用安全连接;useUnicode指定字符的编码解码格式;characterEncoding设置字符编码集;serverTimezone设置时区
url: jdbc:mysql://localhost:3306/mybatis_plus?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
# 高版本驱动兼容低版本驱动
driver-class-name: com.mysql.cj.jdbc.Driver
# 配置日志
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
3、创建Mapper接口
Mapper接口继承BaseMapper<T>,T是对应的实体类
@Repository
public interface UserMapper extends BaseMapper<User> {
}
4、启动类上添加@MapperScan
使用@MapperScan("mapper包的路径")注解,扫描Mapper包
三、简单的CURD操作
1、插入操作
插入一条数据,参数放入一个对象
2、更新操作
根据Id进行更新,参数放入一个对象
3、查询操作
4、删除操作
同查询操作
四、拓展
1、主键生成策略
上面在测试插入操作的过程中,并没有设置id属性,但自动生成了一串id,这个id就是根据主键生成策略生成的。可以对id添加注解@TableId,通过type属性设置主键生成策略。
IdType源码如下:
public enum IdType {
AUTO(0), //自增,数据库中的字段必须设置自增
NONE(1), //数据库中未设置主键,当id为空时,采用的是ID_WORKER生成id
INPUT(2), //手动输入,未输入id的话报错
ID_WORKER(3), //默认的,全局唯一id,雪花算法
UUID(4), //全局唯一id,UUID
ID_WORKER_STR(5); //ID_WORKER的字符串表示
private int key;
private IdType(int key) {
this.key = key;
}
public int getKey() {
return this.key;
}
}
2、自动填充创建、修改时间
添加两个字段(实体类中同步添加属性):创建时间create_time、修改时间update_time,类型为timestamp,数据库版本低的话设置不了两个timestamp,可以考虑更新数据库至8的版本。
2.1、数据库级别
将create_time、update_time的默认值设置为CURRENT_TIMESTAMP,update_time需要勾选根据当前时间戳更新。
2.2、代码级别
① 对createTime和updateTime属性添加@TableField注解,设置fill的属性填充策略
FieldFill的源码如下:
public enum FieldFill {
DEFAULT, //默认的,不填充
INSERT, //插入时填充
UPDATE, //更新时填充
INSERT_UPDATE; //插入和更新时填充
private FieldFill() {
}
}
② 编写处理器MyMetaObjectHandler处理注解
@Component
@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill");
//第一个参数:填充实体类中的哪个属性;第二个参数:填充内容
this.setFieldValByName("createTime",new Date(),metaObject);
this.setFieldValByName("updateTime",new Date(),metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill");
this.setFieldValByName("updateTime",new Date(),metaObject);
}
}
3、乐观锁的处理
使用MyBatis-Plus提供的乐观锁插件
① 添加version字段(实体类中同步添加属性),类型为int
② 对实体类中的version属性添加注解@Version
③ 自定义配置类注册插件
@Configuration //声明这是一个配置类
@EnableTransactionManagement //自动管理事务
@MapperScan("mapper包路径")
public class MyBatisConfig {
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
}
4、MyBatis-Plus自带的分页插件
① 在MyBatis配置类注册分页插件
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
② 使用
③ 自定义方法使用分页插件
public interface TClassAttendanceMapper extends BaseMapper<TClassAttendance> {
//方法传入一个page对象,并返回一个page对象
Page<TClassAttendance> getAll(Page<TClassAttendance> page);
}
public class TClassAttendanceServiceImpl extends ServiceImpl<TClassAttendanceMapper, TClassAttendance> implements TClassAttendanceService {
@Autowired
TClassAttendanceMapper mapper;
@Override
public Page<TClassAttendance> getAll(Integer current, Integer size) {
Page<TClassAttendance> page = new Page<>(current,size);
page = mapper.getAll(page);
return page;
}
}
5、逻辑删除插件
添加字段deleted,类型为int,0表示未删除,1表示逻辑删除。删除时并不直接删除数据库中的数据,而是将deleted由0修改为1,在查询时查询条件会带上deleted = 0,不返回逻辑删除的数据。
① 对实体类中的deleted属性添加@TableLogic注解
② 在MyBatis配置类中注册逻辑删除插件
//逻辑删除插件
@Bean
public ISqlInjector sqlInjector(){
return new LogicSqlInjector();
}
③ 在application配置文件中配置
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
db-config:
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
6、性能分析插件
用于分析每条sql的执行时间
① 配置类中注册性能分析插件
//性能分析插件
@Bean
@Profile({"dev","test"}) //设置开发环境和测试环境开启
public PerformanceInterceptor performanceInterceptor(){
PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
performanceInterceptor.setMaxTime(100); //设置sql的最大执行时间,单位ms,超时则报错
performanceInterceptor.setFormat(true); //设置sql语句格式化,便于查看
return performanceInterceptor;
}
② application中设置环境为测试环境或开发环境
spring:
# 设置开发环境
profiles:
active: dev
sql超时的报错
7、条件构造器
复杂的查询、删除、更新比如说条件查询、范围查询、模糊查询等,可以通过条件构造器Wrapper来实现。比如说:
① 查询部分字段
② 查询名字为Jack的用户
③ 查询年龄为15岁的用户姓名
④ 查询名字以j为开头的用户
更多用法参考官方文档
8、代码自动生成器
创建一个类用于自动生成代码
package com.li;
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) {
// 1.实例化一个自动代码生成器对象
AutoGenerator generator = new AutoGenerator();
// 2 全局配置
GlobalConfig globalConfig = new GlobalConfig();
//获取当前项目路径
String path = System.getProperty("user.dir");
//设置代码生成目标目录,当前路径
globalConfig.setOutputDir(path+"/mybatis-plus/src/main/java");
// 设置作者
globalConfig.setAuthor("张三");
// 设置生成后是否弹出文件夹
globalConfig.setOpen(false);
// 设置是否覆盖已有文件
globalConfig.setFileOverride(false);
// 设置服务名字,去生成的service的I前缀
globalConfig.setServiceName("%sService");
// 设置ID生成策略,自增
globalConfig.setIdType(IdType.AUTO);
// 设置日期类型,仅时间
globalConfig.setDateType(DateType.ONLY_DATE);
// 是否生成swagger接口文档
globalConfig.setSwagger2(true);
// 将全局配置加入代码生成器中
generator.setGlobalConfig(globalConfig);
// 3 数据源配置
DataSourceConfig dataSourceConfig = new DataSourceConfig();
dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/mybatis-plus?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8");
dataSourceConfig.setUsername("root");
dataSourceConfig.setPassword("root");
dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver");
dataSourceConfig.setDbType(DbType.MYSQL);
// 将数据源配置加入代码生成器中
generator.setDataSource(dataSourceConfig);
// 4 包配置
PackageConfig packageConfig = new PackageConfig();
// 设置模块名
packageConfig.setModuleName("hello");
// 设置包路径
packageConfig.setParent("com.test");
// 设置实体类包名
packageConfig.setEntity("entity");
// 设置mapper层包名
packageConfig.setMapper("mapper");
// 设置service层包名
packageConfig.setService("service");
// 设置controller层包名
packageConfig.setController("controller");
// 将包配置加入代码生成器中
generator.setPackageInfo(packageConfig);
// 5 策略配置
StrategyConfig strategy = new StrategyConfig();
// 设置读取哪些表生成代码,可以写多个,逗号隔开
strategy.setInclude("user");
// 表名 → 类名的过程将命名规则由_转为驼峰
strategy.setNaming(NamingStrategy.underline_to_camel);
// 字段名 → 属性名的过程将命名规则由_转为驼峰
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
// 是否生成Lombok注解
strategy.setEntityLombokModel(true);
// 设置逻辑删除的字段名
strategy.setLogicDeleteFieldName("deletetd");
// 自动填充策略配置
TableFill tableFill = new TableFill("create_time", FieldFill.INSERT);
TableFill tableFill2 = new TableFill("update_time", FieldFill.INSERT_UPDATE);
ArrayList<TableFill> tableFills = new ArrayList<>();
tableFills.add(tableFill);
tableFills.add(tableFill2);
strategy.setTableFillList(tableFills);
// 乐观锁配置
strategy.setVersionFieldName("version");
// 设置controller层为@RestController
strategy.setRestControllerStyle(true);
// 将策略配置加入代码生成器中
generator.setStrategy(strategy);
//执行代码生成器
generator.execute();
}
}
五、参考资料
【狂神说Java】MyBatisPlus最新完整教程通俗易懂_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV17E411N7KN/?spm_id_from=333.999.0.0&vd_source=18add245858bb01410866b08c994e66bMyBatis-Plus 官方文档https://baomidou.com/