mybitsplus
下载
链接:https://pan.baidu.com/s/18pET07q1iOQ9MTZmTmFxug?pwd=6km6
提取码:6km6
MybitsPlus快速入门
mybitsPlus->基于mybits-进行了一系列的开发
1.BaseMapper类

mapper->继承该方法-这些方法名也是说的非常易懂的
2.Mybits 映射Pojo

驼峰命名法是一种命名约定,其中每个单词的首字母大写,没有空格或标点符号来分隔单词,例如:camelCase。
3.注解@TableName -表名注解

4.主键注解 @Tableid

@TableId
private Long id;
属性

5.普通字段注解@TableField
@TableField("isMarried")
private Boolean isMarried;


6.常见配置

mybitspro 也支持手写sql

mybitsx+mybitsplus->可以支持跳转写-具体方法就是mybits
7.条件构造器
1.构造器了解
除了新增以外,修改、删除、查询的SQL语句都需要指定where条件。因此BaseMapper中提供的相关方法除了以id作为where条件以外,还支持更加复杂的where条件。

Wrapper关系

1.AbstractWrapper
提供了where中包含的所有条件构造方法

2.QueryWrapper
拓展了一个select方法,允许指定查询字段

3.UpdateWrapper


4.LambdaQueryWrapper
-无论是QueryWrapper还是UpdateWrapper在构造条件的时候都需要写死字段名称,会出现字符串魔法值。这在编程规范中显然是不推荐的。


自定义sql-注解

改

基于注解写sql-是mybitsplus功能
Service接口
1.Service了解
MybatisPlus不仅提供了BaseMapper,还提供了通用的Service接口及默认实现,封装了一些常用的service模板方法。
通用接口为IService,默认实现为ServiceImpl,其中封装的方法可以分为以下几类:

2.新增

3.删除

3.更新

4.查找单个

5.查询集合

6.计数

7.分页查询

Lambda




改造根据id修改用户余额的接口,要求如下
- 如果扣减后余额为0,则将用户status修改为冻结状态(2)

动态sql
mybits批量处理
IService中的lambdaUpdate方法可以非常方便的实现复杂更新业务
---也就是不需要构造条件-直接可以用lambda-进行查询
Mybits批处理
逐条插入

mybits批处理

每1000条批量插入一次
为什么mybits插入速度就快
@Transactional(rollbackFor = Exception.class)
@Override
public boolean saveBatch(Collection<T> entityList, int batchSize) {
//传入集合和集合大小
String sqlStatement = getSqlStatement(SqlMethod.INSERT_ONE);
获取预处理sql
return executeBatch(entityList, batchSize, (sqlSession, entity) -> sqlSession.insert(sqlStatement, entity));
}
->
public static <E> boolean executeBatch(Class<?> entityClass, Log log, Collection<E> list, int batchSize, BiConsumer<SqlSession, E> consumer) {
Assert.isFalse(batchSize < 1, "batchSize must not be less than one");///断言语句
///三元运算
return
!CollectionUtils.isEmpty(list)//检查集合是否为空
&& executeBatch(entityClass, log, sqlSession -> {
int size = list.size();
int idxLimit = Math.min(batchSize, size);
int i = 1;
for (E element : list) {
consumer.accept(sqlSession, element);
if (i == idxLimit) {
sqlSession.flushStatements();
idxLimit = Math.min(idxLimit + batchSize, size);
}
i++;
}
});
executeBatch(entityClass, log, sqlSession -> { ... }): 这是一个方法调用,调用了名为 executeBatch 的方法,并传递了 entityClass、log 和一个 Lambda 表达式作为参数。Lambda 表达式中的代码块将会在 executeBatch 方法内部执行。
Lambda 表达式内部的逻辑:
首先,获取集合 list 的大小,并将其存储在变量 size 中。
然后,计算循环的上限索引 idxLimit,它等于批处理大小 batchSize 和集合大小 size 中的较小值。
接着,初始化变量 i 为 1,用于追踪当前处理的元素索引。
在循环中,遍历集合 list 中的每个元素 element:
使用 consumer.accept(sqlSession, element) 方法处理当前元素,其中 consumer 是一个函数接口,用于执行特定的操作。
如果当前处理的索引 i 等于上限索引 idxLimit,则调用 sqlSession.flushStatements() 方法来刷新 SQL 语句,并更新上限索引 idxLimit 为下一个批次的上限索引。
最后,增加索引变量 i 的值,进入下一轮循环。
整个 Lambda 表达式的执行结果将作为 executeBatch 方法的返回值。
}
以发现其实MybatisPlus的批处理是基于PrepareStatement的预编译模式,然后批量提交,最终在数据库执行时还是会有多条insert语句,逐条插入数据。SQL类似这样:

-------开启重新批处理
****

mybitsplus->代码生成
在使用MybatisPlus以后,基础的Mapper、Service、PO代码相对固定,重复编写也比较麻烦




MybitsPlus静态
有的时候Service之间也会相互调用,为了避免出现循环依赖问题,MybatisPlus提供一个静态工具类:Db,其中的一些静态方法与IService中方法签名基本一致,也可以帮助我们实现CRUD功能


案例
改造根据id用户查询的接口,查询用户的同时返回用户收货地址列表

逻辑删除优化

确实
比如云盘项目-就是要过滤这些条件

配置逻辑删除

查询测试

通用枚举

mybits->提供枚举类型与数据库类型自动转换


同时,为了使页面查询结果也是枚举格式,我们需要修改UserVO中的status属性:

0---会自动根据数字-对应正常或者冻结
json类型处理器
数据库的user表中有一个info字段,是JSON类型
而目前User实体类中却是String类型
无法快捷拿出
info的类型最好是一个Map或者实体类。
而一旦我们把info改为对象类型,就需要在写入数据库时手动转为String,
再读取数据库时-json,手动转换为对象,这会非常麻烦。
因此MybatisPlus提供了很多特殊类型字段的类型处理器,解决特殊字段类型与数据库类型转换的问题。例如处理JSON就可以使用JacksonTypeHandler处理器。

--自动将json->对象
对象->转json
分页查询
1.配置分页插件

2.分页api

本文来自博客园,作者:逆向狗,转载请注明原文链接:https://www.cnblogs.com/Agtw/p/18186021