Mybatis-plus
1. dependency
dependency: mybatis-plus-boot-start, mysql-java-connector
mysql8的配置: useSSL, useUnicode, charactorEncoding utf-8, serverTimezone=GMT
2. log for mybatis plus
实现日志输出:
application.yml配置: mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
, 可以输出sql语句的日志到console。
3. 主键生成策略
//数据库中主键生成策略: uuid, 自增id, 雪花算法, redis, zookeeper
SnowFlake
10bit工作机器ID为: 5bit数据中心id, 5bit机器id, 12bit流水号(1毫秒4096个id)
选择:
在Entity的类的主键上➕:
@TableId(type = IdType.)
IdType.AUTO: 必须在数据库简表的时候也加上自增, 否则报错
IdType.NONE: 不设置主键
INPUT:手动输入
ID_WORKER: 全局唯一, 数字
UUID:
ID_WORKER_STR: 全局唯一, 字符串
4. 自动填充时间
- 数据库级别: 数据库创建或者设置(一般不用)
- 代码级别:
- Entity上添加注解
@TableField(fill = FieldFill.INSERT)
private Date createTime;
- 继承MetaObjectHandler 处理注解
@Component
public class MyDateTimeHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("createTime", new Date(), metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
}
}
// 注意点: handler类要添加到spring容器中
//TableField注解中后面的枚举类型是什么, handler就要实现那种方法, 否则不能处理
5. 乐观锁
乐观锁: 乐观, 干什么都不加锁, 等到出问题才, 再次更新值测试,去加锁
when update a record, hope this record didn't be updated by others
OptimisticLocker will do:
1. get this record, with version
2. when update, with the version
which means: update entity set property=newValue,version=newVersion
where id = 2 and version=oldVersion
3. update
4. if version is not right one, update failed
悲观锁: 悲观, 干什么都加锁, 再去操作
- 数据库中加version字段
- Entity 中添加@Version注解
@Version
private Integer version;
- 添加乐观锁插件到配置类中(官网上找)
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return interceptor;
}
}
eg:
- thread1查询出user1(version = 1), set了一个值, 但还没有修改
- thread2查询处user1 (version = 1), set 了一个值, 修改了, 此时version为2
- thread1 去修改user1, 但update了0 row, 因为version 应该是1, 但此时是2
- result: user1 只被thread2 修改了, thread1 执行失败
- 如果没有乐观锁, thread2执行的更新应该被thread1覆盖。
6. mybatis 插件
22-09年版本的mybatis插件可以完全配置到同一个Bean里, 结构为:
MybatisPlusInterceptor有一个list属性, 所有要添加到配置类都直接add到这个list里面就可以了。
7. 分页查询
- 插件中添加PaginationInnerInterceptor拦截器
- 新建Page
Page<User> userPage = new Page<>(1, 5);// init and give current param and size
mapper.selectPage(userPage, null);// put page to the method
8. 逻辑删除(软删除)
- 老版本需要添加配置的bean, 新版本不用
- 数据库添加一个字段 deleted
- entity上添加注解
@TableLogic
private Integer deleted;
- yml配置中添加默认的值:
mybatis-plus:
global-config:
db-config:
logic-delete-field: flag # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
配置之后, 执行删除操作, 只会修改deleted值, 并且在查询的时候都会自己带上检测deleted值的操作
9. 性能分析插件
添加插件, 设置插件的属性(可以设置sql的执行时间, 以及设置是否format sql语句
插件的@Profile环境为dev or test, 可以在application.yml 中指定springboot的执行环境:
spring.profiles.active=dev
如果时间超过设定的时间上限, 则不执行sql, 用于检测哪些sql需要优化
10. 条件查询器Wrapper
看文档
11. 代码生成器
使用方法:
new一个生成器的类
新建各种配置类, set各种类的配置
把配置类添加到生成器中
execute生成器