使用mybatis可以动态生成sql,当使用foreach动态生成sql尝尝会遇到如下问题:
先贴代码;
// dao层java代码
List<Post> selectPostIn(List<Long> ids);
// xml配置文件代码
<select id="selectPostIn" resultType="Post" parameterType="list">
SELECT * FROM POST P WHERE ID in
<foreach item="item" index="index"
collection="list" open="(" separator="," close=")">
#{item}
</foreach>
</select>
当list为空时,生成的sql如下:
SELECT * FROM POST P WHERE ID in;
执行后报错,原因是in
后面没有id的数组;
解决方案1:
针对输入的list做非空判断,只有list!=null && list.size()>0
才执行daoList<Post> selectPostIn(List<Long> ids);
,避免sql报错;
解决方案2:
讲xml文件中的parameterType更改为map,即parameterType="map"
,dao层参数也改为map,具体代码如下:
param.put("ids",List<Long> ids);
// dao层java代码
List<Post> selectPostIn(Map<String, Object> param);
// xml配置文件代码
<select id="selectPostIn" resultType="Post" parameterType="map">
SELECT * FROM POST P WHERE 1=1
<if test="ids != null">
and ID in
<foreach item="item" index="index"
collection="ids" open="(" separator="," close=")">
#{item}
</foreach>
</if>
</select>
xml文件取出param参数key=ids的值,xml对ids的值做非null判断,当ids存在是sql语句为SELECT * FROM POST P WHERE 1=1 and ID in (1,2,3);
当ids为null时,sql语句为```
SELECT * FROM POST P WHERE 1=1;
END;
本文为作者原创,如需转载请注明地址[使用foreach动态生成sql的问题](http://www.jianshu.com/p/5f27f0991e90);
如果本文对你有所帮忙,请点个赞,您的支持是我写作的最大动力;