MyBatis-plus聚合查询、表关联、条件更新实践
作者: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
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
