IBATIS里的iterate标签提供了遍历List 来动态构造SQL。
主要写下使用的时候的注意点:
在BabyDAOImpl类里面些这么一个方法
- /**
- * 测试iterator
- */
- public List<BabyDO> queryByIds(Map idsMap) throws SQLException {
- return client.queryForList("queryByIds", idsMap);
- }
/**
* 测试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);
- }
/**
* 测试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”。