文章目录
1. mybatis-批量增加
<insert id="batchSaveUser">
insert into t_user (user_name,sex) values
/*
<!-- 动态SQL之foreach的用法 -->
<!-- collection="users" 用于指定循环集合的名称,如果接口中并未指定参数别名,那么默认就是list
*/
item="user" 用于指定每次循环后的对象的别名
separator="," 用于指定每次循环后之间的分割符-->
<foreach collection="users" item="user" separator=",">
(#{user.userName},#{user.sex})
</foreach>
</insert>
2. 单条件批量删除
方法1:括号()定义在for循环中
<delete id="deleteBatch">
delete from LP_SALARY_STANDARD
where
ID in
<foreach collection="ids" item="id" separator="," open="(" close=")">
#{id}
</foreach>
</delete>
方法2:括号()定义在for循环外
<delete id="batchDeleteUser">
delete from t_user where id in
(
<foreach collection="ids" item="id" separator=",">
#{id}
</foreach>
)
</delete>
mybatis-plus写法
/**
* 删除修理厂
*/
@RequestMapping("/delete")
public R delete(@RequestParam List<Integer> ids) {
shxRepairFactorysService.removeByIds(ids);
return R.ok();
}
3. 多条件批量删除
mybatis写法①:and
//<!--通过条件删除数据 用or分割,可以带有index索引-->
<delete id="batchDeleteByCondition">
delete from test where
<foreach collection="list" item="item" separator=" or " index="index">
(name = #{item.name} and area_code = #{item.areaCode} and type = #{item.type})
</foreach>
</delete>
mybatis写法①:in
<delete id="deleteBatch" parameterType="java.util.List">
delete from test
where (PRSNLID, ENTID) in
<foreach item="item" index="index" collection="list" separator="," open="(" close=")">
(#{item.prsnlid},#{item.entid})
</foreach>
</delete>
4. mp的lambda用法、分组查询
lambda查询
List<CcUserEntity> list = ccUserService
.list(Wrappers.<CcUserEntity>lambdaQuery()
.eq(CcUserEntity::getAccountType, ConstantEnum.AccountType.ASSESSMENT.getValue())
.eq(CcUserEntity::getPersonBelongId, assessmentCompanyId));
分组查询:不使用lambda
QueryWrapper objectQueryWrapper = new QueryWrapper<>();
objectQueryWrapper.select("case_status,count(*) num").groupBy("case_status");
List list = ccTaskService.listMaps(objectQueryWrapper);
// 或者直接获取map
// Map map = ccTaskService.getMap(objectQueryWrapper);
分组查询:使用lambda
//遍历所有任务,并以公估公司id来分组
Map<String, List<CcTaskEntity>> taskGroupByCompanyId = ccTaskService.list()
.stream()
.collect(Collectors.groupingBy(CcTaskEntity::getAssesmentCompanyId));
5. mybatis-plus 插入/更新操作
①:更新操作
-
根据id更新
User user = new User(); user.setUserId(1); user.setAge(29); userMapper.updateById(user); -
条件构造器作为参数进行更新,可以实现批量更新(所有
name = zhb的数据都会被更新)//把名字为rhb的用户年龄更新为18,其他属性不变 UpdateWrapper<User> updateWrapper = new UpdateWrapper<>(); updateWrapper.eq("name","zhb"); User user = new User(); user.setAge(18); userMapper.update(user, updateWrapper); -
假设只更新一个字段在使用updateWrapper 的构造器中也需要构造一个实体对象,这样比较麻烦。可以使用updateWrapper的set方法,可以实现批量更新(所有
name = zhb的数据都会被更新)//只更新一个属性,把名字为rhb的用户年龄更新为18,其他属性不变 UpdateWrapper<User> updateWrapper = new UpdateWrapper<>(); updateWrapper.eq("name","zhb").set("age", 18); userMapper.update(null, updateWrapper); -
lambda构造器,可以实现批量更新(所有
name = zhb的数据都会被更新)LambdaUpdateWrapper<User> lambdaUpdateWrapper = new LambdaUpdateWrapper<>(); lambdaUpdateWrapper.eq(User::getName, "zhb").set(User::getAge, 18); Integer rows = userMapper.update(null, lambdaUpdateWrapper);或者
LambdaUpdateWrapper<KfAppointmentDsEntity> wrapper = Wrappers.<KfAppointmentDsEntity>lambdaUpdate(); wrapper.eq(KfAppointmentDsEntity::getAccidentno, "80052222222222222") .eq(KfAppointmentDsEntity::getCarnum, "粤111111") .set(KfAppointmentDsEntity::getTrueOrFalse, "真"); kfAppointmentDsService.update(wrapper);
②:插入或更新:saveOrUpdate
当saveOrUpdate不传Wrapper时,默认按照主键id进行更新或者插入
testtableService.saveOrUpdate(testtableEntity3);

当saveOrUpdate带有Wrapper时,会更新所有符合Wrapper条件的数据!
testtableService.saveOrUpdate(testtableEntity3,
Wrappers.<TesttableEntity>lambdaUpdate()
.eq(TesttableEntity::getName,"BBB"));
-
如果不存在符合
Wrapper条件的,且实体类上无主键id,则直接执行插入!

-
如果不存在符合
Wrapper条件的,其实体类上设置了主键id,则会通过主键id再差一次,决定更新还是插入!

③:(批量)新增或更新:saveOrUpdateBatch
该方法没有Wrapper条件
testtableService.saveOrUpdateBatch(list );
- 如果实体类设置了主键
id,则根据id查询,决定更新或者插入

- 如果实体类采用主键自增,不手动设置主键
id,则直接执行插入操作!

6. mybatis-plus 中 and、or的用法
需求:查询 userId = 15 且 (status = 2 或者 fileSize = 3251544304L )的数据
or()的错误用法
LambdaQueryWrapper<Task> queryWrapper = new QueryWrapper<Task>().lambda();
queryWrapper
.eq(Task::getUserId, "15")
.eq(Task::getStatus, 2)
.or()
.eq(Task::getFileSize, 3251544304L);
这种写法拼出来的SQL语句是这样的,显然查询结果是错误的
SELECT * FROM task WHERE user_id = ? AND status = ? OR file_size = ?
or()的正确用法:配合and使用
LambdaQueryWrapper<Task> queryWrapper2 = new QueryWrapper<Task>().lambda();
queryWrapper2
.eq(Task::getUserId, "15")
.and(wrapper -> wrapper.eq(Task::getStatus, 2).or().eq(Task::getFileSize, 3251544304L));
这种写法对应的sql如下,结果正确!
SELECT * FROM task WHERE user_id = ? AND ( status = ? OR file_size = ? )
7. mybatis-plus的批量插入效率对比,性能优化
mybatis-plus的批量插入效率对比
设置 rewriteBatchedStatements=true 开启jdbc批处理
本文详细介绍了MyBatis的批量插入、更新及删除操作,包括单条件与多条件批量删除的实现方式。同时,深入探讨了MyBatis-Plus的Lambda查询、分组查询、批量插入效率优化等高级特性,以及插入、更新操作的灵活应用。
655

被折叠的 条评论
为什么被折叠?



