目录
原理:MybatisPlus通过扫描实体类,并基于反射获取实体类信息作为数据库信息。
[17. JSON类型处理器](#17. JSON类型处理器)
[18. 生成秘钥](#18. 生成秘钥)
原理:MybatisPlus通过扫描实体类,并基于反射获取实体类信息作为数据库信息。
规定:
1.添加依赖
- service 继承 IService< 实体类 >
- 实现类中要继承IService的实现类ServiceImpl<mapper,实体类>
- 自定义 mapper 要继承 BaseMapper< 实体类 >
新增:insert(实体) 查询:selectByid(5L) 批量查:selectBatchIds(List.of(1L,2L,3L))
修改updateById(实体) 删除deleteById(5L)
2. 常用注解
@TableName(" 表名 ") :指定表名
@TableId(value="",type=" 主键类型"):用来指定表中的主键字段信息
@TableField(""):用来指定表中的普通字段信息
转义:@TableField(" 'order' ");
成员变量不是数据库字段:@TableField(exist = false)
3.常见配置:
4.条件构造器
5.QueryWrapper
无论是修改、删除、查询,都可以使用QueryWrapper来构建查询条件
Eg: 查询:查询出名字中带o的,存款大于等于1000元的人
// 2.查询数据
List<User> users = userMapper.selectList(wrapper);
users.forEach(System.out::println);
更新:更新用户名为jack的用户的余额为2000
userMapper.update(user, wrapper)//(实体类,wrapper)
6.UpdateWrapper
SET 的赋值结果是基于字段现有值的
更新id为1,2,4的用户的余额,扣200
UPDATE user SET balance = balance - 200 WHERE id in (1, 2, 4)
前面实体为更新的内容,后面为更新的条件
.setSql("balance = balance - 200")
userMapper.update(null, wrapper);
7.LambdaQueryWrapper:避免硬编码
8.自定义SQL
利用MyBatisPlus的wrapper来构建复杂的where条件,然后自己定义SQL语句剩下的部分。利用Wrapper生成查询条件,再结合Mapper.xml编写SQL
拼接 ${ew.customSqlSegment}
9.Iservice 接口
自定义Service继承Iservice<实体>,自定义实现类继承ServiceImpl<自定义Mapper,实体>再实现自定义接口
save
:新增remove
:删除update
:更新
- get:查询单个结果
- list:查询集合结果
count
:计数
page
:分页查询
多个ID查:userService.listByIds(List.of(1L,2L,3L).var
Users.forEach(System.out::println)
LambdaQuery()
LambdaUpdate()
10.案例:实现接口
11.Lambda
实现一个根据复杂条件查询用户的接口,查询条件如下:
- name:用户名关键字,可以为空
- status:用户状态,可以为空
- minBalance:最小余额,可以为空
- maxBalance:最大余额,可以为空
.one()
:最多1个结果.list()
:返回集合结果.count()
:返回计数结果
2.扣减后余额为0,则将用户status修改为冻结状态=2
// 4.扣减余额 update tb_user set balance = balance - ?
int remainBalance = user.getBalance() - money;
lambdaUpdate()
.set(User::getBalance, remainBalance) // 更新余额
.set(remainBalance == 0, User::getStatus, 2) // 动态判断,是否更新status
.eq(User::getId, id)
.eq(User::getBalance, user.getBalance()) // 乐观锁
.update();
12.批量新增
13.代码生成
14. 静态工具
有的时候Service之间也会相互调用,为了避免出现循环依赖问题,MybatisPlus提供一个静态工具类:Db
1.需求:改造根据id用户查询的接口,查询用户的同时返回用户收货地址列表
15. 逻辑删除
对于一些比较重要的数据,我们往往会采用逻辑删除的方案,即:
- 在表中添加一个字段标记数据是否被删除
- 当删除数据时把标记置为1
- 查询时只查询标记为0的数据
一旦采用了逻辑删除,所有的查询和删除逻辑都要跟着变化,非常麻烦。
为了解决这个问题,MybatisPlus就添加了对逻辑删除的支持。
注意 ,只有MybatisPlus生成的SQL语句才支持自动的逻辑删除,自定义SQL需要自己手动处理逻辑删除。
例如:逻辑删除字段:deleted
删除操作:Update user SET deleted = 1 WHERE id = 1 AND deleted = 0
查询操作:SELECT * FROM User WHERE deleted = 0
方法与普通删除一模一样,但是底层的SQL逻辑变了:
16. 通用枚举
像这种字段我们一般会定义一个枚举,做业务判断的时候就可以直接基于枚举做比较。但是我们数据库采用的是int类型,对应的PO也是Integer。因此业务操作时必须手动把枚举与Integer转换,非常麻烦。
枚举类型与数据库类型自动转换。
- 在application.yaml文件中添加配置:
mybatis-plus:
configuration:
default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler
17. JSON 类型处理器
数据库的user表中有一个info字段,是JSON类型:
格式像这样:
{"age": 20, "intro": "佛系青年", "gender": "male"}
而目前User实体类中却是String类型:
将User类的info字段修改为UserInfo类型,并声明类型处理器:
测试可以发现,所有数据都正确封装到UserInfo当中了:
同时,为了让页面返回的结果也以对象格式返回,我们要修改UserVO中的info字段:
此时,在页面查询结果如下: