最近在用 Mybatis-Plus,嗯,是真他妈香!!!今天就来说说 Mybatis-Plus 的那些使用技巧
创建user表
注意:– 真实开发中往往都会有这四个字段,version(乐观锁)、deleted(逻辑删除)、gmt_create(创建时间)、gmt_modified(修改时间)
导入依赖
创建application.yml
业务代码
实体类
mapper接口
注意点,我们需要在主启动类上去扫描我们的mapper包下的所有接口 @MapperScan(value = “com.glj.securitydemo.mapper”)
测试
配置日志
application.yml文件添加日志配置:
Mybatis-plus的CRUD
插入操作
看到id会自动填充。数据库插入的id的默认值为:全局的唯一id
主键生成策略
1)主键自增 1、实体类字段上 @TableId(type = IdType.AUTO)
@Tableid
- 描述:主键注解
属性 | 类型 | 必须指定 | 默认值 | 描述 |
---|---|---|---|---|
value | String | 否 | “” | 主键字段名 |
type | Enum | 否 | IdType.NONE | 主键类型 |
IdType
值 | 描述 |
---|---|
AUTO | 数据库ID自增 |
NONE | 无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT) |
INPUT | insert前自行set主键值 |
ASSIGN_ID | 分配ID(主键类型为Number(Long和Integer)或String)(since 3.3.0),使用接口IdentifierGenerator 的方法nextId (默认实现类为DefaultIdentifierGenerator 雪花算法) |
ASSIGN_UUID | 分配UUID,主键类型为String(since 3.3.0),使用接口IdentifierGenerator 的方法nextUUID (默认default方法) |
ID_WORKER | 分布式全局唯一ID 长整型类型(please use ASSIGN_ID ) |
UUID | 32位UUID字符串(please use ASSIGN_UUID ) |
ID_WORKER_STR | 分布式全局唯一ID 字符串类型(please use ASSIGN_ID ) |
具体注解到:https://mp.baomidou.com/guide/annotation.html#tablename
2、数据库id字段设置为自增!
3、再次测试(可以看到id值比上次插入的大1)id的生成策略源码解释
更新操作
自动填充
创建时间、修改时间!这两个字段操作都是自动化完成的,我们不希望手动更新!阿里巴巴开发手册:所有的数据库表都要配置上gmt_create、gmt_modified!而且需要自动化!
1、在表中新增字段 gmt_create, gmt_modified
2、实体类字段属性上需要增加注解
3.编写处理器来处理这个注解
乐观锁
乐观锁 : 顾名思义,十分乐观,它总是认为不会出现问题,无论干什么不去上锁!如果出现了问题, 再次更新值测试 悲观锁:顾名思义,十分悲观,它总是认为总是出现问题,无论干什么都会上锁!再去操作!
乐观锁实现方式:
取出记录时,获取当前version 更新时,带上这个version 执行更新时, set version = newVersion where version = oldVersion 如果version不对,就更新失败
乐观锁测试:
1.给数据库中增加version字段
2.实体类加对应的字段
3.配置类
4.测试
查询操作
普通查询
条件查询(QueryWrapper)
如果说,我们需要查询的 SQL 语句如下:
那么对应的代码可以为:
条件查询(QueryWrapper lambda)
普通分页查询
1、配置拦截器组件
2、直接使用Page对象
分页查询(联表)
当我们需要关联表格分页查询时,普通分页查询已经满足不了我们的需求了,那么我们需要进行联表分页查询
假设我们需要的 SQL 语句如下:
那么我们需要进行如下操作
1、新建 UserVO.java
2.UserMapper.java 中新增:
3.编写代码
以上就是分页查询(联表)时的操作,这个应该是用的比较多的
AND 和 OR深入
queryWrapper 默认是按照 and 来连接的,但是在我们业务需求中,肯定会用到 or 来写 SQL
1.刚使用
假设我们需要的 SQL 语句如下:
那么我们可以这样写
以上就完成了初级的 and 和 or 联用的情况
2.咱们开始进阶了~
假设我们需要的 SQL 语句如下:
那么我们可以这样写:
以上就完成了复杂的 and 和 or 联用的情况
那么以后遇见更复杂的,可以按此规则继续进行拼接 SQL
具体查看官网API:https://mp.baomidou.com/guide/wrapper.html#abstractwrapper
指定查询字段(select)
当我们只需要查询表格中的某几个字段,如果表格数据很大的话,我们不应该查询表格的所有字段,假如,我们需要的 SQL 如下:
SELECT
id,
`name`,
age
FROM
user
WHERE
1 = 1
AND age = 24
我们只需要查询年龄等于24的用户的 id、name、age,所以,可以这样写:
删除操作
物理删除
逻辑删除
物理删除 :从数据库中直接移除
逻辑删除 :在数据库中没有被移除,而是通过一个变量来让它失效!
deleted = 0 => deleted = 1 管理员可以查看被删除的记录!防止数据的丢失,类似于回收站!
1、在数据表中增加一个 deleted 字段
2、实体类中增加属性
@TableLogic
private Integer deleted;
3、配置文件:
mybatis-plus:
global-config:
db-config:
logic-delete-field: deleted # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
4、测试删除
@Test
public void testDeleteById(){
userMapper.deleteById(2L);
}
------------------------日志
JDBC Connection [HikariProxyConnection@1551760389 wrapping com.mysql.cj.jdbc.ConnectionImpl@345d053b] will not be managed by Spring
==> Preparing: UPDATE user SET deleted=1 WHERE id=? AND deleted=0
==> Parameters: 2(Long)
<== Updates: 1
注意:自己在 xml 文件中写的 SQL 不会自动加上逻辑删除条件
最后更多技巧请参考官网:https://mp.baomidou.com/
总结得太好了!大长见识!