java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > MyBatis-plus聚合查询、表关联、条件更新

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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文