-
0x01_简单看一下批量的源码
-
0x01_实验1:查询
-
单次查询getXXX测试
-
批量查询listXXX测试
-
0x02_实验2:insert
-
0x03_其他数据库操作不再介绍,与查询和新增类似,看API就可以
Mybatis-plus_CURD接口-IService
前几篇提到的都是用userMapper操作数据库,实际开发中很少这么做。更常用的是service接口(CURD接口),在业务层简化开发。
CURD接口的官网地址:https://baomidou.com/pages/49cc81/#service-crud-%E6%8E%A5%E5%8F%A3
官网的部分介绍如下:
说明:
通用 Service CRUD 封装IService (opens new window)接口,进一步封装 CRUD 采用 get 查询单行
remove 删除
list 查询集合
page 分页
前缀命名方式区分Mapper
层避免混淆,泛型 T
为任意实体对象建议如果存在自定义通用 Service 方法的可能,请创建自己的 IBaseService
继承Mybatis-Plus
提供的基类对象 Wrapper
为 条件构造器
0x01_简单看一下批量的源码
在实验开始之前,下载相关源码,查看一些重要的API
-
1.关注默认批次提交数量
在批量进行操作的时候,最好特别需要指明批量提交的数量,避免无法描述的错误。
以批量插入为例,简单看一下源码:在
IService
接口中,有定义了一个saveBatch
方法:看一下其具体实现:在
ServiceImpl.java
类中:image-20221022141851502 @Transactional(rollbackFor = Exception.class)
@Override
public boolean saveBatch(Collection<T> entityList, int batchSize) {
String sqlStatement = getSqlStatement(SqlMethod.INSERT_ONE);
return executeBatch(entityList, batchSize, (sqlSession, entity) -> sqlSession.insert(sqlStatement, entity));
}再看具体的
executeBatch
方法:protected <E> boolean executeBatch(Collection<E> list, int batchSize, BiConsumer<SqlSession, E> consumer) {
return SqlHelper.executeBatch(this.entityClass, this.log, list, batchSize, consumer);
}再看
SqlHelper.executeBatch
方法: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++;
}
});
}说明:需要传入
batchSize
,即批量操作的数量,然后再for循环中,会比较batchSize
和需要批量插入的list
的大小,两者取其小赋值为idxLimit
,进行批量操作,每次循环次数到idxLimit
就执行sqlSession.flushStatements();
,也就是数据库刷新操作(这个sqlSession.flushStatements
在我读mybatis缓存的相关的源码的时候,就经常碰到)。所以,数据的批量操作,不是你想要插多少就插多少的。“批处理”的思想。
0x01_实验1:查询
IService接口提供了很多数据库CURD方法。其中关于查询,有两类,单次查询还是批量查询,单次查询一般都是getXXX
,批量查询一般都是listXXX
,
准备自定义接口和相关实现类:(MVC结构)
其中:IUserService
接口实现IService接口:
package com.bones.mp.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.bones.mp.pojo.User;
/**
* @author : bones
* @version : 1.0
*/
public interface IUserService extends IService<User> {
}
impl/UserService.java
:继承ServiceImpl
类,实现自定义的IUserService
接口
package com.bones.mp.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bones.mp.mapper.UserMapper;
import com.bones.mp.pojo.User;
import com.bones.mp.service.IUserService;
import org.springframework.stereotype.Service;
/**
* @author : bones
* @version : 1.0
*/
@Service
public class UserService extends ServiceImpl<UserMapper, User> implements IUserService {
}
特别注意:一定要加上注解
@Service
测试方法:
利用
UserService
进行查询,所以要进行声明:@Autowired
private IUserService userService;
单次查询getXXX测试
//单次查询
@Test
void testGetXXX(){
User user = userService.getById(1);
System.out.println("user = " + user);
}
批量查询listXXX测试
@Test
void testList(){
System.out.println("全部查询list");
//全部查询,没有条件,相当于select * from user
List<User> list = userService.list();
list.forEach(System.out::println);
System.out.println("批量查询listMaps");
System.out.println();
//查询数据,没有条件,但是返回数据类型是map
List<Map<String, Object>> maps = userService.listMaps();
maps.forEach(System.out::println);
System.out.println("批量查询,但是返回数据类型是obj,只返回主键");
List<Object> objects = userService.listObjs();
objects.forEach(System.out::println);
}
注:
1.
listObjs()
方法用于取出通过MybatisPlus查询到的数据并放入List中,其中取出的数据并不包括对象所有的字段,最多只能返回一个字段。2.
listMaps()
方法返回的数据结构是map,但是返回的数据是全的。
0x02_实验2:insert
在IService接口中,有saveXXX方法作为数据库的insert操作:
建议在新增的时候,除了传入新增的对象,最好传入size,自己指定批量新增的数量。
以下面这个测试方法为例:
@Test
void saveBatchUser(){
List<User> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
User user = new User(null, "aaa" + i, 10 + i, "aaa" + i + "@163.com");
list.add(user);
}
boolean b = userService.saveBatch(list,5);
System.out.println("b = " + b);
}
运行结果中,打印的日志是批量增加的(5个5个批量增加)

如果不指定,又小于1000个,那就是按照你的list个数来新增。
0x03_其他数据库操作不再介绍,与查询和新增类似,看API就可以
原文始发于微信公众号(小东方不败):Mybatis-plus_CURD接口-IService
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/47206.html