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区别解析

    这篇文章主要介绍了Spring BeanFactory和FactoryBean区别解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 一文掌握Spring的创建与使用

    一文掌握Spring的创建与使用

    这篇文章详细介绍了spring的创建与使用,文章中有详细的代码示例和图片介绍,对学习有一定的而参考价值,需要的同学可以参考一下
    2023-04-04
  • nacos未自动注册问题及解决

    nacos未自动注册问题及解决

    文章主要介绍了在使用Nacos服务发现时遇到的问题,通过查阅资料和文档,发现服务自动注册的特性是Spring Cloud Alibaba 0.2.3版本才有的功能,作者从使用0.2.1版本到升级到0.2.3版本,问题得以解决
    2025-10-10
  • 解决使用httpclient传递json数据乱码的问题

    解决使用httpclient传递json数据乱码的问题

    这篇文章主要介绍了解决使用httpclient传递json数据乱码的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • Spring框架中ImportBeanDefinitionRegistrar的应用详解

    Spring框架中ImportBeanDefinitionRegistrar的应用详解

    这篇文章主要介绍了Spring框架中ImportBeanDefinitionRegistrar的应用详解,如果实现了ImportSelector接口,在配置类中被@Import加入到Spring容器中以后,Spring容器就会把ImportSelector接口方法返回的字符串数组中的类new出来对象然后放到工厂中去,需要的朋友可以参考下
    2024-01-01
  • Java集合ArrayList与LinkedList详解

    Java集合ArrayList与LinkedList详解

    这篇文章主要介绍了Java集合ArrayList与LinkedList详解,对于ArrayList和LinkedList,他们都是List接口的一个实现类,并且我们知道他们的实现方式各不相同,例如ArrayList底层实现是一个数组
    2022-08-08
  • MybatisPlus为何可以不用@MapperScan详解

    MybatisPlus为何可以不用@MapperScan详解

    这篇文章主要给大家介绍了关于MybatisPlus为何可以不用@MapperScan的相关资料,文中通过图文介绍的非常详细,对大家学习或者使用MybatisPlus具有一定的参考学习价值,需要的朋友可以参考下
    2023-04-04
  • SpringBoot多数据源配置并通过注解实现动态切换数据源

    SpringBoot多数据源配置并通过注解实现动态切换数据源

    本文主要介绍了SpringBoot多数据源配置并通过注解实现动态切换数据源,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • springboot整合shardingsphere和seata实现分布式事务的实践

    springboot整合shardingsphere和seata实现分布式事务的实践

    本文主要介绍了springboot整合shardingsphere和seata实现分布式事务的实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • 数组实现Java 自定义Queue队列及应用操作

    数组实现Java 自定义Queue队列及应用操作

    这篇文章主要介绍了数组实现Java 自定义Queue队列及应用操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06

最新评论