IBATIS里的iterate标签提供了遍历List 来动态构造SQL。
主要写下使用的时候的注意点:
在BabyDAOImpl类里面些这么一个方法
/** * 测试iterator */ public List<BabyDO> queryByIds(Map idsMap) throws SQLException { return client.queryForList("queryByIds", idsMap); }
配置的sqlMap如下:
<select id="queryByIds" resultMap="baby-Result" parameterClass="java.util.Map"> select * from Baby where id in ( <!-- iterate标签的property属性是parameterClass里面去找一个属性,这个属性实现了Iterable接口 --> <iterate property="idsList" conjunction=","> #idsList[]# </iterate> ) </select>
这里有两个注意点:
第一点:
注意这里我们一般用 #传入的参数名称[]# 。而不太用$idsList[]$。
这个#和 $ 的区别是:
# 使用的是PreparedStatement 机制,生成的SQL字符串中含有很多?,这些?会被动态的添加参数进去查询
$ 中的变量好比字符串直接替换。
第二点:
<iterate property ……
这个property标签的指应该是 parameterClass里面去找一个属性,这个属性实现了Iterable接口。
如果本是传的就是 一个list,并且就是这个里面需要遍历的,那么不需要 指定property,否则会报错说ArrayList里找不到你说的这个property属性。(上例我传了一个Map进来,在Map里我放了一个idsList这么一个list。所以需要加上property属性)
=================================邪恶的分割线 ==============================
另外一种情况,如果传进来的是个List<BabyDO>,那么代码应该如下:
BabyDAOImpl
/** * 测试iterator */ public List<BabyDO> queryByIds(List<BabyDO> babys) throws SQLException { return client.queryForList("queryByIds", babys); }
SQLMap :
<select id="queryByIds" resultMap="baby-Result" parameterClass="java.util.ArrayList"> select * from Baby where id in ( <!-- iterate标签的property属性是parameterClass里面去找一个属性,这个属性实现了Iterable接口 --> <iterate conjunction=","> #babys[].id# </iterate> ) </select>
这里的注意点:
第一点:
本身传的就是一个ArrayList,所以不需要设置property。
第二点:
我要的是BabyDO当中的id作为遍历条件。所以需要加上“.id”。