Mybatis框架,以 paramDTO对象集合形式进行批量查询。

news2024/11/19 0:51:56

      在日常工作中,我们时常遇到数据库表中以 (name + code)  为唯一索引, 在数据查询时需要根据这一组条件查询出表中唯一1条数据。

      有时,我们的入参是 List<DTO>  ,需要进行批量查询数据。那么可以使用以下的SQL来进行数据的查询。由于以下SQL中存在关键字 OR ,Mysql5.0 之前的版本可能会存在索引失效的情况,Mysql5.7版本应该是不存在索引失效的情况。

SELECT 
	u.id,
	u.is_deleted,
	u.NAME,
	u.age,
	u.create_date 
	
FROM
	USER u 
WHERE
	u.is_deleted = 'n' 
	AND (
		( u.NAME = "张三三" AND u.age = 28 ) 
		OR (u.NAME = "李四" AND u.age = 27 ) 
		OR (u.NAME = "李四" AND u.age = 25 ) 
		OR (u.NAME = "王小二" AND u.age = 18 ) 
	) 
ORDER BY
	u.id DESC,
	u.create_date DESC;

      在Mybatis项目中,mapper.xml文件中的SQL该如何编写呢? 以下的代码分别是 ServiceImpl.java 文件、mapper.java 文件、 mapper.xml 文件中的代码。

ServiceImpl.java 文件代码


    /**
     * 以 paramDTO对象集合 批量查询 用户 信息
     *
     * @param paramDTOList
     * @return
     *
     * @author  moon  2023/01/11  15:38
     */
    @Override
    public List<UserVO> batchSelectUserByParamDTOList(List<UserParamDTO> paramDTOList) {
        // 批量查询时,需要对 paramDTOList 进行去重处理,避免查询出重复的数据。  2023/01/11 15:40
        paramDTOList = paramDTOList.stream().distinct().collect(Collectors.toList());
        return userMapper.batchSelectUserByParamDTOList(paramDTOList);
    }

mapper.java 文件代码

    /**
     * 以 paramDTO对象集合 批量查询 用户 信息
     *
     * @param paramDTOList
     * @return
     *
     * @author  moon  2023/01/11  15:45
     */
    List<UserVO> batchSelectUserByParamDTOList(@Param("paramDTOList") List<UserParamDTO> paramDTOList);

mapper.xml 文件代码


  <select id="batchSelectUserByParamDTOList" resultType="com.moon.mybatis.vo.UserVO">
    SELECT
      DISTINCT
      u.id,
      u.is_deleted,
      u.NAME,
      u.age,
      u.create_date

    FROM user u
    WHERE
        u.is_deleted = 'n'
        <if test="paramDTOList != null and paramDTOList.size() != 0">
          AND (
            <foreach collection="paramDTOList" item="item" separator="OR" index="index">
              (
                1 = 1
                <if test="item.id != null">
                  AND u.id = #{item.id, jdbcType=BIGINT}
                </if>
                <if test="item.name != null and item.name != ''">
                  AND u.NAME = #{item.name, jdbcType=VARCHAR}
                </if>
                <if test="item.age != null">
                  AND u.age = #{item.age, jdbcType=BIGINT}
                </if>
                <if test="item.createDate != null">
                  AND u.create_date &gt;= #{item.createDate, jdbcType=TIMESTAMP}
                </if>
              )
            </foreach>
          )
        </if>
    ORDER BY u.id DESC, u.create_date DESC
  </select>

     mapper.xml中SQL编写好后,输入入参参数,即可正常获取到SQL信息。

入参参数如下所示:

[
    {
        "age":28,
        "distinct":false,
        "name":"张三三"
    },
    {
        "age":27,
        "distinct":false,
        "name":"李四"
    },
    {
        "age":25,
        "distinct":false,
        "name":"李四"
    },
    {
        "age":25,
        "distinct":false,
        "name":"李四"
    },
    {
        "age":18,
        "distinct":false,
        "name":"王小二"
    }
]

在 knife4j 接口文档中测试

调用接口后的log日志如下所示,小伙伴们可以将日志复制出来,自己仔细观看,在Navicat中运行一下看看。

2023-01-11 17:26:20.702  INFO 14780 --- [nio-8080-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2023-01-11 17:26:20.702  INFO 14780 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2023-01-11 17:26:20.712  INFO 14780 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet        : Completed initialization in 10 ms
2023-01-11 17:26:21.549 TRACE 14780 --- [nio-8080-exec-3] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to springfox.documentation.swagger.web.ApiResourceController#swaggerResources()
2023-01-11 17:26:21.549 TRACE 14780 --- [nio-8080-exec-1] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to springfox.documentation.swagger.web.ApiResourceController#uiConfiguration()
2023-01-11 17:26:30.143 TRACE 14780 --- [nio-8080-exec-4] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to com.moon.mybatis.controller.UserController#selectUser2(List, Integer, Integer)
2023-01-11 17:26:30.209  INFO 14780 --- [nio-8080-exec-4] c.m.mybatis.controller.UserController    : 以paramDTO集合对象批量查询用户信息, 传入的参数页码为:1, 页大小:20, paramDTO对象集合为:[{"age":28,"distinct":false,"name":"张三三"},{"age":27,"distinct":false,"name":"李四"},{"age":25,"distinct":false,"name":"李四"},{"age":25,"distinct":false,"name":"李四"},{"age":18,"distinct":false,"name":"王小二"}]
2023-01-11 17:26:30.262 DEBUG 14780 --- [nio-8080-exec-4] c.m.m.m.U.batchSelectUserByParamDTOList  : ==>  Preparing: SELECT DISTINCT u.id, u.is_deleted, u.NAME, u.age, u.create_date FROM user u WHERE u.is_deleted = 'n' AND ( ( 1 = 1 AND u.NAME = ? AND u.age = ? ) OR ( 1 = 1 AND u.NAME = ? AND u.age = ? ) OR ( 1 = 1 AND u.NAME = ? AND u.age = ? ) OR ( 1 = 1 AND u.NAME = ? AND u.age = ? ) ) ORDER BY u.id DESC, u.create_date DESC 
2023-01-11 17:26:30.263 DEBUG 14780 --- [nio-8080-exec-4] c.m.m.m.U.batchSelectUserByParamDTOList  : ==> Parameters: 张三三(String), 28(Integer), 李四(String), 27(Integer), 李四(String), 25(Integer), 王小二(String), 18(Integer)
2023-01-11 17:26:30.267 DEBUG 14780 --- [nio-8080-exec-4] c.m.m.m.U.batchSelectUserByParamDTOList  : <==      Total: 3

     讲到这里,差不多就结束了。然而,以 paramDTO对象集合 形式进行批量查询是存在一些小坑的。在测试用例数据中,我特意写了2组重复的数据,在 ServiceImpl.java 文件中,我对 paramDTOList 进行了去重处理,在 mapper.xml 中,我也进行了去重处理, 这都是为什么呢???

      大家可以观看我下一篇文章:  Mybatis以 paramDTO对象集合 进行批量查询去重问题  

      Swagger 接口文档访问地址为:http://localhost:8080/doc.html#/home

      本案例项目Demo地址为: Mybatis框架学习  ,MyBatis-SpringBoot 项目。

      如果大家觉得我的项目还行,可以加一个 Start ,感谢各位老铁了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/157322.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

崔宝秋国际开源经验在小米开花 | 开源英雄

【编者按】崔宝秋的开源人生&#xff0c;来源于内心的真正热爱&#xff0c;和一路的升级打怪。从少时与计算机结缘到成为自由软件信徒&#xff0c;从IBM、雅虎、LinkedIn 到小米这一路走来&#xff0c;从一个开源的追随者成长为开源的推动者&#xff0c;小米的开源文化、丰硕的…

kettle工具连接elasticsearch 7并导入MySQL表数据-简述

一、简述 工作中需要利用kettle开源ETL工具将MySQL数据库中表数据同步到elasticsearch集群中。为此特记录一下操作方式&#xff0c;留作记录和学习。 二、环境 kettle工具&#xff1a;kettle 9.2 elasticsearch集群&#xff1a;7.11.1 集群配置信息&#xff1a; 集群名称&…

Linux-终端命令行

终端(Terminal)命令行仅仅是一个工具&#xff0c;对于命令有许多&#xff0c;而且随着嵌入式领域不断开发&#xff0c;命令会越来越多&#xff0c;我们只需要去了解常用的即可。 对于创建或删除一个文件夹&#xff0c;清理终端&#xff0c;下载文件等等都可以在终端命令行输入…

Nginx 进阶篇

文章目录Nginx 进阶篇五、 服务配置1、 配置成系统服务2、 配置环境变量六、 部署静态资源1、 概述2、 配置指令2.1 listen2.2 server_name2.3 location2.4 root2.5 alias2.6 index2.7 error_page3、 静态资源优化配置语法4、 静态资源压缩模块4.1 Gzip 模块配置指令4.2 配置实…

《Linux运维实战:Centos7.6基于ansible一键离线部署redis6.2.8容器版之哨兵集群》

一、部署背景 由于业务系统的特殊性&#xff0c;我们需要针对不同的客户环境部署redis 哨兵集群&#xff0c;由于大都数用户都是专网环境&#xff0c;无法使用外网&#xff0c;为了更便捷&#xff0c;高效的部署&#xff0c;针对业务系统的特性&#xff0c;我这边编写了基于ans…

唤醒手腕 Go 语言开发学习笔记(基本简介、环境安装)

1. Go语言简介 Go&#xff08;又称 Golang&#xff09;是 Google 的 Robert Griesemer&#xff0c;Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型语言。Go 语言语法与 C 相近&#xff0c;但功能上有&#xff1a;内存安全&#xff0c;GC&#xff08;垃圾回收&#xf…

Java中String类的常见问题

目录 Q1&#xff1a;为什么String类要定义成不可变类型&#xff1f; 方便String对象缓存HashCode值 字符串常量池的需要 衍生问题&#xff1a;String str new String("hello world") 创建了几个对象&#xff1f; 为了保障程序的安全性 Q2&#xff1a;String的…

2022年深度学习在时间序列预测和分类中的研究进展综述

时间序列预测的transformers的衰落和时间序列嵌入方法的兴起&#xff0c;还有异常检测、分类也取得了进步 2022年整个领域在几个不同的方面取得了进展&#xff0c;本文将尝试介绍一些在过去一年左右的时间里出现的更有前景和关键的论文&#xff0c;以及Flow Forecast [FF]预测…

解决Windows莫名其妙地从休眠状态唤醒的问题

因为经常写代码开很多个工作区&#xff0c;电脑经常就是合盖休眠&#xff0c;这样打开就能用&#xff0c;但是总是在我不经意的时候发现电脑风扇在狂转&#xff0c;不知道是哪个应用又在qj我的电源管理计划&#xff0c;今天午休发现电脑风扇狂转&#xff0c;打开发现是windows系…

c语言操作符(下)

前言 &#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏: &#x1f354;&#x1f35f;&#x1f32f; c语言初阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f349;本篇简介:>: 讲解c语言中有关操作符的知识. 金句分享: ✨✨✨行程…

我用python写了个小病毒,老板再也不敢扣我工资啦

名字&#xff1a;阿玥的小东东 学习&#xff1a;python正在学习c 主页&#xff1a;阿玥的小东东 今天做个什么呢&#xff0c;我的好朋友提议做一个关机的代码吧&#xff0c;我这一想&#xff0c;对吼&#xff0c;我以前还做过一个关机代码呢&#xff0c;于是乎&#xff0c;今天…

时序收敛技巧之寄存器复制

1、何时需要复制寄存器&#xff1f; 在设计中的关键路径发现某个寄存器具有高扇出和高延迟时&#xff0c;使用寄存器复制是个不错的实现时序收敛的方法。下图是一个典型的例子&#xff1a; 可以看出&#xff0c;第一个寄存器的 IC(InterConnect) 延迟为 1.476ns&#xff0c;该寄…

seo站内优化的方法有哪些(站内优化和站外优化)

站内部优化什么意思 网站优化公司的内部优化意味着什么&#xff1f;网站内部优化&#xff0c;就是网站关键词优化、内容优化、内链优化等等&#xff0c;网站要有一定的排名和流量&#xff0c;要做到内部优化&#xff0c;要做到最快&#xff0c;最快的优化排名&#xff1f;接下…

「认知」打工人的自我修养

都说认知以外的钱难搞&#xff0c;那认知内的呢&#xff1f; 01互联网内卷年代&#xff0c;作为不着调的普通选手&#xff1b; 在诸多花里胡哨的黑话中&#xff0c;个人最待见的就是"认知"这个词&#xff1b; 认知&#xff0c;有强烈的抽象感&#xff1b; 想要深刻…

Mr. Cappuccino的第37杯咖啡——Kubernetes资源管理

Kubernetes资源管理kubectl常用的命令陈述式管理方法1. 创建一个namespace2. 查询所有namespace3. 在namespace下运行一个pod4. 查询指定namespace下的pod5. 查看指定pod的详细信息6. 删除pod7. 删除namespace声明式管理方法命令式对象配置1. 创建yaml文件2. 基于yaml文件创建资…

【JavaEE】多线程(初阶)

目录 Thread 线程的创建 线程的常见属性 中断线程 等待线程 休眠线程 线程的状态 多线程相比于单线程的优势 Thread 在Java中操作多线程&#xff0c;最常用的类就是Thread。 Thread 类是 JVM 用来管理线程的一个类&#xff0c;换句话说&#xff0c;每个线程都有一个唯一…

一网打尽带环链表问题(手把着手带你理解,木有基础也能看懂!)

目录 0.前言 1.认识带环链表 2.带环链表OJ问题简述 3.判断是否为带环链表 4. 寻找入环节点&#xff08;法一&#xff1a;数学推理的魅力&#xff09; 5. 寻找入环节点&#xff08;暴力拆解带环链表的魄力&#xff09; 6.番外&#xff1a;判断是否为带环链表(fast和slow的…

树上的DP

ACACAC来的如此之快&#xff0c;让我以为还要再调试几个点(h)&#xff0c;本文涉及思路参考&#xff1a;参考文章 嗯,这个题和思路让我对跨父节点的树上链有了一个认识&#xff0c;我们来看一下&#xff1a; 如果说&#xff0c;我们要对这样的一条链进行dpdpdp操作&#xff0c…

[GXYCTF2019]BabysqliV3.0

发现我们随便上传一个以后返回的是 alert(Wrong pass); 密码错误 如果上传一个账号永真的话返回 Not this user! 没有这个用户&#xff0c;所以感觉可以使用盲注&#xff0c;对账号进行盲注 可是题目 ascii(substr((select database()),1,1))>1 也不对 最后才知道是…

电脑组装配件知识

目录 1.电脑硬件基础知识 1.1CPU 1.2内存 ​编辑 1.3硬盘 1.4主板 1.5显卡 ​编辑 1.6显示器 1.7电源 1.8机箱 2.电脑硬件搭配及选购 2.1硬件搭配原则 2.2怎样查询软件或游戏配置 2.3配件购买注意事项 2.4搭配一台普通办公电脑 3.电脑组装 1.电脑硬件基础知识 …