1、简介
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
润物无声
只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑。
效率至上
只需简单配置,即可快速进行 CRUD 操作,从而节省大量时间。
丰富功能
热加载、代码生成、分页、性能分析等功能一应俱全

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

主键策略

SSIGN_ID:MyBatis-Plus默认的主键策略是:ASSIGN_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)。

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

java使用mybatisplus雪花算法 mybatis 主键雪花算法_主键

AUTO 自增策略
需要在创建数据表的时候设置主键自增
实体字段中配置 @TableId(type = IdType.AUTO)

自动填充和乐观锁
更新操作:update时生成的sql自动是动态sql:UPDATE user SET age=? WHERE id=?

在User表中添加datetime类型的新的字段 create_time、update_time

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

@TableField(fill = FieldFill.INSERT)
private Date createTime; //create_time

@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime; //update_time

实现元对象处理器接口

@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);
    }
}

乐观锁
**主要适用场景:**当要更新一条记录的时候,希望这条记录没有被别人更新,也就是说实现线程安全的数据更新

乐观锁实现方式:
取出记录时,获取当前version
更新时,带上这个version
执行更新时, set version = newVersion where version = oldVersion
如果version不对,就更新失败

例子
实体类成员变量 添加 @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();
    }
}

物理删除和逻辑删除

**物理删除:**真实删除,将对应数据从数据库中删除,之后查询不到此条被删除数据

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

逻辑删除的使用场景:
可以进行数据恢复
有关联数据,不便删除

条件构造器和常用接口

1、wapper介绍

java使用mybatisplus雪花算法 mybatis 主键雪花算法_条件语句_02


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

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

QueryWrapper : 查询条件封装 重点使用

UpdateWrapper : Update 条件封装

AbstractLambdaWrapper : 使用Lambda 语法

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

LambdaUpdateWrapper : Lambda 更新封装Wrapper

API
setSqlSelect: 设置 SELECT 查询字段

where: WHERE 语句,拼接 + WHERE 条件

and: AND 语句,拼接 + AND 字段=值

andNew: AND 语句,拼接 + AND (字段=值)

o:r OR 语句,拼接 + OR 字段=值

orNew: OR 语句,拼接 + OR (字段=值)

eq: 等于=

allEq: 基于 map 内容等于=

ne: 不等于<>

gt: 大于>

ge: 大于等于>=

lt: 小于<

**le :**小于等于<=

like: 模糊查询 LIKE

notLike: 模糊查询 NOT LIKE

in: IN 查询

notIn: NOT IN 查询

isNull: NULL 值查询

isNotNull: IS NOT NULL

groupBy: 分组 GROUP BY

having: HAVING 关键词

orderBy: 排序 ORDER BY

orderAsc: ASC 排序 ORDER BY

orderDesc: DESC 排序 ORDER BY

exists: EXISTS 条件语句

notExists: NOT EXISTS 条件语句

between: BETWEEN 条件语句

notBetween: NOT BETWEEN 条件语句

addFilter: 自由拼接 SQL

last: 拼接在最后,例如:last(“LIMIT 1”)