• mybatis使用foreach标签实现union集合操作


    最近遇到一个场景就是Java开发中,需要循环多个表名,然后用同样的查询操作分别查表,最终得到N个表中查询的结果集合。在查询内容不一致时Java中跨表查询常用的是遍历表名集合循环查库,比较耗费资源,效率较低。在查询内容格式一致的情况下,便可以用Java的数据库连接工具模拟mysql中union的操作,这里我用的数据库交互工具是mybatis。

    首先介绍下union:

    在mysql中被称为集合操作,操作类型分为两种:UNION DISTINCT 和  UNION ALL;其中UNION和UNION DISTINCT是一样的功能。UNION功能为合并多个查询的结果并去重,UNION ALL的功能为合并多个查询的结果不去重。

    这里mybatis在实现union操作时,用到的是foreach 标签,foreach标签用于循环语句,它很好的支持了数据和 List、set 接口的集合,并对此提供遍历的功能。最常用的地方就是对于一些 SQL 语句中含有 in 条件,或者批量处理数据需要迭代条件时,可以使用 foreach 。利用foreach这一迭代特性,也满足了union多个表的使用场景,整体思路框架代码如下:

    实现层设置每一个union的查询sql的业务代码:

    1. List queryCondition = new ArrayList<>();
    2. //这里的namelIst代表存储联合查询表名的集合
    3. for (Map nameMap: namelIst) {
    4. Map conditionMap = new HashMap();
    5. //查询内容
    6. String fields = "a.*,b.*";
    7. //拼接表名
    8. String tableName = "table_aaa a ," + nameMap.get("tableName") + "` b";
    9. //查询条件
    10. String joinsql = "a.nameId = b.id ";
    11. //将循环一次的查询条件,表名,内容放入一个集合中,当做union的一个查询部分
    12. conditionMap.put("fields", fields);
    13. conditionMap.put("tableName", tableName);
    14. conditionMap.put("joinsql", joinsql);
    15. //放入总的集合中作为传入mapper查询的条件
    16. queryCondition.add(conditionMap);
    17. }
    18. //执行查询
    19. List pages = this.baseMapper.getSelect(queryCondition);

    传入的查询参数为一个list集合。

    1. /**
    2. * union查询示范
    3. * @param queryCondition
    4. * @return
    5. */
    6. List getSelect(@Param("queryCondition") List queryCondition);

    xml文件的写法:

    这里对foreach标签中的标签进行一下简单的总结:

    foreach 标签有六个属性:item,index,collection,open, close,separator

    属性 作用
    item表示集合中每一个元素或子集合进行迭代循环时的别名
    index    指定一个名字,表示在迭代过程中每次迭代到的位置
    open    表示该语句以什么开始(如in 条件语句,以’('开始)
    close    表示该语句以什么结束(如in 条件语句,以’)'结束。
    separator    表示在每次进行迭代之间以什么符号作为分隔符(如in 条件语句,以‘,’作为分隔符)
    collection    该属性是必选的,但在不同情况下该属性的值是不一样的,主要有以下 3 种情况:
    (1)如果传入的是单参数且参数类型是一个 List,collection 属性值为 list
    (2)如果传入的是单参数且参数类型是一个 array 数组,collection 的属性值为 array
    (3)如果传入的参数是多个,需要把它们封装成一个 Map,当然单参数也可以封装成 Map。Map 的 key 是参数名,collection 属性值是传入的 List 或 array 对象在自己封装的 Map 中的 key。

    通常在使用foreach标签时候,都是用来当做批量查询或者更新,或者where后面的条件使用,大概这样:

    1. "各种集合" item="循环体中的别名" index="index" open="(" separator="," close=")">
    2. 自定义的各种参数

    这里的操作属于mybatis的一个灵活运用,算是一个处理思路,鉴于网上现有相关思路不多,个人完成了测试,可以当做一种解决办法,提高一下程序的执行效率,避免多次连库。

  • 相关阅读:
    设计模式总结(一):创建型模型
    mysql与oracle分页的有什么区别
    labelme安装
    partial的使用,对定制化的想法
    【JUC源码专题】LinkedBlockingDeque 源码分析(JDK8)
    关于Vue本地图片转file传到后端服务器(不通过组件上传)
    题解 【LGR-087】洛谷 7 月月赛 Div.2
    JAVA计算机毕业设计电子书店管理系统Mybatis+系统+数据库+调试部署
    如何使用ChatPPT生成PPT文档
    近似串匹配问题(动态规划)
  • 原文地址:https://blog.csdn.net/httpmc2018/article/details/134506547