ibatis 遍历结构化数据

ibatis <iterate>标签

我们可以在ibatis的 sqlmap包中找到对iterate标签的定义(sql-map-2.dtd)

我们可以看到,iterate标签支持的参数如下:

Iterate 的属性: 
      prepend  - 可被覆盖的 SQL 语句组成部分,添加在语句的前面(可选) 
      property  - 类型为 java.util.List 的用于遍历的元素(必选) 
      open  -  整个遍历内容体开始的字符串,用于定义括号(可选) 
      close  -整个遍历内容体结束的字符串,用于定义括号(可选) 
      conjunction -  每次遍历内容之间的字符串,用于定义 AND 或 OR(可选) 
      遍历类型为 java.util.List的元素。

举例:

<select id="MS-JOB-QUERY-BY-STATES-FROM-NUM" resultClass="java.lang.Integer">
        select /*MS-JOB-QUERY-BY-STATES-FROM-NUM*/ COUNT(1)
            FROM bp_job
            WHERE
                state in
                <iterate property="states" open="(" close=")" conjunction=",">
                    #states[]#
                </iterate>
                LIMIT 1
</select>

遍历List<List<>>嵌套list结构化数据

定义一个学生类的pojo对象

public class Student{

    string name;
    List subject

    Student(string name, List subject){
        this. name = name;
        this. subject = subject;
    }

}

我们希望通过动态拼接得到一个什么样的sql呢:

select  * FROM student WHERE (
(name = '张三' AND subject IN ('数学','英语') )
OR (name = '李四' AND subject IN ('数学','物理') )
OR (name = '王五' AND subject IN ('计算机','英语') )
)

sqlmap中的写法

<select id="MS-JOB-QUERY-BY-STATES-FROM-NUM" resultClass="java.lang.Integer">
        select /*MS-JOB-QUERY-BY-STATES-FROM-NUM*/ COUNT(1)
            FROM student
            WHERE
            <iterate property="student" open="(" close=")" conjunction="OR">
                name = #states[].name# AND subject IN
                <iterate property="states[].subject" open="(" close=")" conjunction=",">
                    #states[].subject[]#
                </iterate>
            </iterate>
</select>

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值