使用mybatis可以動態(tài)生成sql,當(dāng)使用foreach動態(tài)生成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>
當(dāng)list為空時,生成的sql如下:
SELECT * FROM POST P WHERE ID in;
執(zhí)行后報錯,原因是in后面沒有id的數(shù)組;
解決方案1:
針對輸入的list做非空判斷,只有list!=null && list.size()>0 才執(zhí)行daoList<Post> selectPostIn(List<Long> ids);,避免sql報錯;
解決方案2:
講xml文件中的parameterType更改為map,即parameterType="map",dao層參數(shù)也改為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參數(shù)key=ids的值,xml對ids的值做非null判斷,當(dāng)ids存在是sql語句為SELECT * FROM POST P WHERE 1=1 and ID in (1,2,3);當(dāng)ids為null時,sql語句為```
SELECT * FROM POST P WHERE 1=1;
END;
本文為作者原創(chuàng),如需轉(zhuǎn)載請注明地址[使用foreach動態(tài)生成sql的問題](http://www.itdecent.cn/p/5f27f0991e90);
如果本文對你有所幫忙,請點個贊,您的支持是我寫作的最大動力;