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

金仓导入mysql的sql_乐观锁

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. 自动填充时间

  • 数据库级别: 数据库创建或者设置(一般不用)
  • 代码级别:
  1. Entity上添加注解
@TableField(fill = FieldFill.INSERT)
private Date createTime;
  1. 继承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

悲观锁: 悲观, 干什么都加锁, 再去操作


  1. 数据库中加version字段
  2. Entity 中添加@Version注解
@Version
   private Integer version;
  1. 添加乐观锁插件到配置类中(官网上找)
@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. 分页查询

  1. 插件中添加PaginationInnerInterceptor拦截器
  2. 新建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, 新版本不用
  1. 数据库添加一个字段 deleted
  2. entity上添加注解
@TableLogic
private Integer deleted;
  1. 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生成器