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的业务代码:

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

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

/**
     * union查询示范
     * @param queryCondition
     * @return
     */
    List<Map> getSelect(@Param("queryCondition") List<Map> queryCondition);

xml文件的写法:

<select id="getSelect" resultType="java.util.Map">
        <foreach collection="queryCondition" item="condition" separator="union all">
            SELECT ${condition.fields}
            FROM ${condition.tableName}
            where ${condition.joinsql}
        </foreach>
    </select>

这里对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后面的条件使用,大概这样:

<foreach collection="各种集合" item="循环体中的别名" index="index"  open="(" separator="," close=")">
    自定义的各种参数
</foreach>

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

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis中,可以使用foreach标签实现批量插入多条记录。首先需要在SQL语句中使用foreach标签,指定要循环的集合以及循环体中的对象。例如,使用foreach标签插入多条记录的SQL语句如下所示: ```xml <insert id="insertCustomersBatch" parameterType="java.util.List"> insert into STOREROOM_REPERTORY(UUID, CUSTOMERSNAME, CUSTOMERSNO, COMMUNITY, REPERTORY_CODE, REPERTORY_AREA, COLOUR, CREATE_DATE, LOT, STATUS, OPERATOR_DATE) <foreach collection="list" item="item" index="index" separator="union all"> ( SELECT #{item.uuid}, #{item.customersname}, #{item.customersno}, #{item.community}, #{item.repertoryCode}, #{item.repertoryArea}, #{item.colour}, #{item.createDate}, #{item.lot}, #{item.status}, #{item.operatorDate} FROM DUAL ) </foreach> </insert> ``` 在这个例子中,我们通过foreach标签循环遍历了传入的list集合,并将循环体中的item对象的属性值插入到数据库中。在循环体中,可以通过#{item.property}的方式引用item对象的属性值。 需要注意的是,foreach标签有一些属性需要注意: - collection属性指定了要循环遍历的集合,这里是list。 - item属性指定了循环体中的对象,这里是item。 - index属性指定了在循环过程中的索引,这里是index。 - separator属性指定了在每次迭代之间的分隔符,这里是"union all"。 通过以上配置,就可以在MyBatis实现批量插入多条记录的功能了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Mybatis中的foreach循环——循环插入多条数据](https://blog.csdn.net/a498936289/article/details/127994634)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [Mybatisforeach实现批量插入sql写法](https://blog.csdn.net/weixin_50002038/article/details/128605511)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值