Mybatis plus笔记记

本文详细介绍了MyBatis-Plus的主键策略,包括自动增长、UUID和雪花算法,并展示了如何更改策略。接着讨论了自动填充功能,用于自动设置创建时间和更新时间。此外,还阐述了乐观锁的概念及在MyBatis-Plus中的实现,以解决并发更新问题。最后,讲解了分页查询的配置和使用,以及逻辑删除的实现方式。
摘要由CSDN通过智能技术生成

一、官网简介

MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

二、主键策略

2.1 类型

1、自动增长

     缺点:分表的时候会比较麻烦。比如一张表数据过于庞大,我们把这张表分为两张表,第一张表存1~10000,那么第二张表id就为10001~20000,所以第二张表需要获取第一张表最后一列才能确定id。(第二张表的id值和第一张表密切联系,也就是耦合大)

2、UUID:每次生成随机唯一的值

     优点:表和表之间id值没有关系

     缺点:排序不方便

3、mp自带策略(默认)

    用的是twwiter的snowflake算法, snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bt是数据中心,5个bit的机器ID),
12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生4096个ID),最后还有一个符号位,永远是0。具体实现的代码可以参

2.2 如何改变策略?

在实体类的id属性上写注释@TableId(type=IdType.xxxx)

AUTO:主键自增

INPUT:自己设置id值

NOME:没有策略,也需要自己设置

UUID:每次生成随机唯一的值

ID_WORKER:生成19位值,数字类型使用这种策略(mp自带策略)

ID_WORKER_STR:生成19位值,字符串类型使用这种策略(mp自带策略)

2.3 自动填充

(1)在实体类上面添加注解(@TableField)

@ApiModelProperty(value = "创建时间")
@TableField(fill = FieldFill.INSERT)
private Date gmtCreate;

@ApiModelProperty(value = "更新时间")
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date gmtModified;

(2)代码

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        this.setFieldValByName("gmtCreate", new Date(), metaObject);
        this.setFieldValByName("gmtModified", new Date(), metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("gmtModified", new Date(), metaObject);
    }
}

三、配置乐观锁

问题:

     如果有两个程序员同时更新同个实体,那么肯定是会有更新先后之分的,最后提交的会把之前的提交数据覆盖。但是我们在更新的时候是希望这条记录没有被别人更新的,也就是说线程安全的数据更新。

解决方法:

     乐观锁:在更新数据之前先检查当前数据版本和数据库版本是否一样,一样的话可以执行修改操作,修改完之后版本号+1.

步骤:

  1. 首先在数据库表中添加int 类型的字段version
  2. 在实体类也添加Integer的version,在字段上添加@Version
  3. 创建配置类MpConfig(乐观锁插件)
    @Configuration
    public class MpConfig {
    
        @Bean
        public OptimisticLockerInterceptor optimisticLockerInnerInterceptor(){
            return new OptimisticLockerInterceptor();
        }
    }
  4.  测试即可。

四、分页查询

步骤:

  1. 配置插件
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2));
        return interceptor;
    }
  2. 创建page对象 

    @Test
    public void testPage(){
        //1、创建page
        //当前页和每页显示记录数
        Page<User> page=new Page<>(1,2);
        //调用mp分页查询的方法
        userMapper.selectPage(page, null);
        //通过page对象获取数据
        System.out.println(page.getCurrent());//当前页
        System.out.println(page.getRecords());//每页数据list集合
        System.out.println(page.getSize());//每页显示记录数
        System.out.println(page.getTotal());//总记录数
        System.out.println(page.getPages());//总页码数
        System.out.println(page.hasNext());//是否有下一页,返回boolean类型
        System.out.println(page.hasPrevious());//是否有上一页,返回boolean类型
    }

五、逻辑删除

1、实体类字段上加上@TableLogic注解

@TableLogic
private Integer deleted;

2、在application.yaml配置文件添加: 

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值