Mybatisplus

111 阅读4分钟

一、了解Mybatis-Plus

  • 在MyBatis的基础上只做增强不做改变,为简化开发提高效率

1.快速入门

  • 创建数据库,创建表
  • 创建SpringBoot工程
  • 引入MP以及相关依赖
  • 在配置文件中配置数据库(Springboot版本不同,driver和url不同)
  • 创建与数据库字段一致的实体类
  • 创建Mapper接口继承BaseMapper,里面封装了MP大量CRUD方法,接口上添加Repository注解
  • 启动类上添加MapperSan注解扫描Mapper
  • 编写测试类

image.png

查看mybatis日志,在配置文件中写入

mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

2.MP的主键策略

2.1 ASSIGN_ID

image.png

MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法)

@TableId(type = IdType.ASSIGN_ID)
private String id;

雪花算法:分布式ID生成器

雪花算法是由Twitter公布的分布式主键生成算法,它能够保证不同表的主键的不重复性,以及相同表的主键的有序性。

核心思想:

长度共64bit(一个long型)。

首先是一个符号位,1bit标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0。

41bit时间截(毫秒级),存储的是时间截的差值(当前时间截 - 开始时间截),结果约等于69.73年。

10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID,可以部署在1024个节点)。

12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID)。

image.png

优点:整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞,并且效率较高。

 

2.2 AUTO 自增策略

需要在创建数据表的时候设置主键自增

实体字段中配置 @TableId(type = IdType.AUTO)

@TableId(type = IdType.AUTO)
private Long id;

要想影响所有实体的配置,可以设置全局主键配置

#全局设置主键生成策略
mybatis-plus.global-config.db-config.id-type=auto

3.自动填充

实体类修改

实体上增加字段并添加自动填充注解

 @TableField(fill = FieldFill.***INSERT***) **private** Date **createTime***//create_time  
 
@TableField(fill = FieldFill.***INSERT_UPDATE***) **private** Date **updateTime**; *//update_time* 

 

实现元对象处理器接口

注意:不要忘记添加 @Component 注解

@Component    
public class MyMetaObjectHandler implements MetaObjectHandler {          
//mp执行添加操作,这个方法执行      
@Override      
public void insertFill(MetaObject metaObject) {          
this.setFieldValByName( "createTime" ,new Date(),metaObject);
this.setFieldValByName( "updateTime" ,new Date(),metaObject);      
}          
//mp执行修改操作,这个方法执行      
@Override      
public void updateFill(MetaObject metaObject) {          
this.setFieldValByName( "updateTime" ,new Date(),metaObject);      }  }

4. 乐观锁实现流程

修改实体类

添加 @Version 注解

@Version
private Integer version;

创建配置文件

创建包config,创建文件MybatisPlusConfig.java

此时可以删除主类中的 @MapperScan 扫描注解

@Configuration 
@MapperScan( "com.atguigu.demomptest.mapper") 
public class** MpConfig {     */**      ** *乐观锁插件      */ 
@Bean 
public** OptimisticLockerInterceptor optimisticLockerInterceptor() {         
return new** OptimisticLockerInterceptor();    
} }

5.分页

MP配置类添加分页

@Bean  
public PaginationInterceptor paginationInterceptor() {  
    **return new** PaginationInterceptor();  
}

实现

//分页查询  
@Test  
public void** testSelectPage() {  
    Page<User> page = **new** Page(1,3);  
    Page<User> userPage = **userMapper**.selectPage(page, **null**);  
    //返回对象得到分页所有数据  
long pages = userPage.getPages(); *//总页数  
long current = userPage.getCurrent(); *//当前页  
List<User> records = userPage.getRecords(); *//查询数据集合  
long total = userPage.getTotal(); *//总记录数  
boolean hasNext = userPage.hasNext();  *//下一页  
boolean hasPrevious = userPage.hasPrevious(); *//上一页  
  
System.out.println(pages);  
    System.out.println(current);  
    System.out.println(records);  
    System.out.println(total);  
    System.out.println(hasNext);  
    System.out.println(hasPrevious);

6.逻辑删除

逻辑删除:假删除,将对应数据中代表是否被删除字段状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录

逻辑删除的使用场景:

  • 可以进行数据恢复

  • 有关联数据,不便删除 测试后发现,数据并没有被删除,deleted字段的值由0变成了1

测试后分析打印的sql语句,是一条update

注意:被删除前,数据的deleted 字段的值必须是 0,才能被选取出来执行逻辑删除的操作

二、条件构造器和常用

Wrapper : 条件构造抽象类,最顶端父类  

    AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件

        QueryWrapper : 查询条件封装

        UpdateWrapper : Update 条件封装

    AbstractLambdaWrapper : 使用Lambda 语法

        LambdaQueryWrapper :用于Lambda语法使用的查询Wrapper

        LambdaUpdateWrapper : Lambda 更新封装Wrapper

@Test

public void testSelectListOrderBy() {

QueryWrapper<User>queryWrapper = newQueryWrapper<>();

queryWrapper.orderByDesc("age", "id")

List<User>users = userMapper.selectList(queryWrapper);

users.forEach(System.out::println);


}
查询方式说明
setSqlSelect设置 SELECT 查询字段
whereWHERE 语句,拼接 + WHERE 条件
andAND 语句,拼接 + AND 字段=值
andNewAND 语句,拼接 + AND (字段=值)
orOR 语句,拼接 + OR 字段=值
orNewOR 语句,拼接 + OR (字段=值)
eq等于=
allEq基于 map 内容等于=
ne不等于<>
gt大于>
ge大于等于>=
lt小于<
le小于等于<=
like模糊查询 LIKE
notLike模糊查询 NOT LIKE
inIN 查询
notInNOT IN 查询
isNullNULL 值查询
isNotNullIS NOT NULL
groupBy分组 GROUP BY
havingHAVING 关键词
orderBy排序 ORDER BY
orderAscASC 排序 ORDER BY
orderDescDESC 排序 ORDER BY
existsEXISTS 条件语句
notExistsNOT EXISTS 条件语句
betweenBETWEEN 条件语句
notBetweenNOT BETWEEN 条件语句
addFilter自由拼接 SQL
last拼接在最后,例如:last(“LIMIT 1”)