MyBatis-plus聚合查询、表关联、条件更新实践
更新时间:2026年05月15日 09:59:08 作者:zhengxianyi515
文章描述了一个图书馆系统的操作流程,首先查询预约数量,其次关联查询可预约书籍并发出通知,最后更新书刊状态为下架,输出每步操作的SQL日志
1、聚合查询
统计预约数量,返回数量 > 0的记录:
QueryWrapper<BookArangeDO> arangeQuery = new QueryWrapper<BookArangeDO>()
.eq("status", "1")
.in("book_no", bookNoList)
.select("book_no", "count(book_no) as arange_count")
.groupBy("book_no").having("arange_count > {0}", 0)
;
List<Map<String, Object>> mapList = bookArangeMapper.selectMaps(arangeQuery);
Map<String, Integer> countMap = new HashMap<>();
mapList.forEach(bookArangeDO -> {
countMap.put(bookArangeDO.get("book_no").toString(), Integer.valueOf(bookArangeDO.get("arange_count").toString()));
});输出查询sql日志
SELECT book_no, count(book_no) AS arange_count FROM bl_book_arange WHERE deleted = 0 AND (status = ? AND book_no IN (?, ?)) AND tenant_id = 1 GROUP BY book_no HAVING arange_count > ?
2、表关联查询
预约表BookArange关联复本表BookCopy,查询可以预约的书籍,逐个发出预约取书通知。
MPJLambdaWrapperX<BookArangeDO> queryWrapperX = new MPJLambdaWrapperX<>();
queryWrapperX
.select(BookArangeDO::getBookNo, BookArangeDO::getTenantId)
.leftJoin(BookCopyDO.class, BookCopyDO::getBookNo, BookArangeDO::getBookNo)
.eq(BookCopyDO::getStatus, "3") // 可借阅
.eq(BookArangeDO::getStatus, "1") // 预约中
;
Page<Map<String, Object>> page = new Page<>(1, 10);
page = bookArangeMapper.selectJoinMapsPage(page, queryWrapperX);输出查询sql日志
SELECT t.book_no,t.tenant_id FROM bl_book_arange t LEFT JOIN bl_book_copy t1 ON (t1.book_no = t.book_no) WHERE t.deleted=0 AND t1.deleted=0 AND (t1.status = ? AND t.status = ?)
3、条件更新
书刊下架,将已归还、可借阅状态的书刊状态更新为已下架状态。
LambdaUpdateWrapper<BookCopyDO> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.in(BookCopyDO::getBookNo, bookNos)
.in(BookCopyDO::getStatus, "6", "3") // 已归还、可借阅
.set(BookCopyDO::getTakeupId, SecurityFrameworkUtils.getLoginUserId())
.set(BookCopyDO::getStatus, '7'); // 已下架
int n = bookCopyMapper.update(updateWrapper);
if(n !=bookNos.length) {
throw new ServiceException("下架失败,请检查书刊条码、上架状态");
}输出查询sql日志
UPDATE bl_book_copy SET takeup_id = ?, status = ? WHERE deleted = 0 AND (book_no IN (?) AND status IN (?, ?)) AND tenant_id = 1
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
Spring BeanFactory和FactoryBean区别解析
这篇文章主要介绍了Spring BeanFactory和FactoryBean区别解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下2020-03-03
Spring框架中ImportBeanDefinitionRegistrar的应用详解
这篇文章主要介绍了Spring框架中ImportBeanDefinitionRegistrar的应用详解,如果实现了ImportSelector接口,在配置类中被@Import加入到Spring容器中以后,Spring容器就会把ImportSelector接口方法返回的字符串数组中的类new出来对象然后放到工厂中去,需要的朋友可以参考下2024-01-01
MybatisPlus为何可以不用@MapperScan详解
这篇文章主要给大家介绍了关于MybatisPlus为何可以不用@MapperScan的相关资料,文中通过图文介绍的非常详细,对大家学习或者使用MybatisPlus具有一定的参考学习价值,需要的朋友可以参考下2023-04-04
SpringBoot多数据源配置并通过注解实现动态切换数据源
本文主要介绍了SpringBoot多数据源配置并通过注解实现动态切换数据源,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2022-08-08
springboot整合shardingsphere和seata实现分布式事务的实践
本文主要介绍了springboot整合shardingsphere和seata实现分布式事务的实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2022-07-07


最新评论