开发过程中遇到问题:
1.项目开发过程中在xml配置文件中使用$tableName$时,报"列名无效"错误,后来经过查询,发现是ibatis缓存
了上一次查询的表结构的原因。解决办法:只需要在元素中添加 remapResults="true" 即可。
1 <select id="select" resultClass="java.util.HashMap" > 2 select * from $tableName$ where id=#id# 3 </select>
该查询结果映射到HashMap中,第一次使用这个语句是没有问题,但是当使用这个语句查询别的表时,报错为“列名无效”,
分析之后原因为ibatis对上个表的结构进行了映射缓存,从结果集到HashMap的映射时按照缓存中表字段进行装载。
使用remapResults这个属性,可以重新映射结果集
1 <select id="select" resultClass="java.util.HashMap" remapResults="true" > 2 select * from $tableName$ where id=#id# 3 </select>
2:在ibatis的配置文件中,经常会使用parameterClass="java.util.Map",这种用法是可以的,因为map是接口
是多态的典型用法,但是如果这样写resultClass="java.util.Map"就会报错,不能实例化对象,就是ibatis不能把
查询到的数据映射到map接口上,解决方法:修改成resultClass="java.util.HashMap"即可。
3:项目中遇到ibatis中parameterClass = "java.util.List" 时,那么sql语句拼接如下:
1 <select id="selectSqlId" parameterClass="java.util.List" resultClass="java.util.HashMap"> 2 SELECT * 3 FROM table_name 4 WHERE name IN 5 <iterate close=")" open="(" conjunction=","> 6 #[]# 7 </iterate> 8 </select>
4:isNull、isNotNull、isEmpty、isNotEmpty、isEquals
则几种判断元素在ibatis中用的很多,isNotNull和isNotEmpty用的比较多,
比如在select的where条件里,如果字段存在就拼接,不存在就不拼接
1 <select id="selectSqlId" parameterClass="java.util.Map"> 2 select * from tableName 3 where 1=1 4 <isNotNull prepend="AND" property="id"> 5 id = #id# 6 </isNotNull> 7 <isNotNull prepend="AND" property="name"> 8 name = #name# 9 </isNotNull> 10 </select>
就是如果id存在,就拼接上id这个查询条件,不存在就没有这个条件限制,name也是这样。
isNotEmpty的用法和isNotNull一样,只是稍微有一点区别,就是isNotEmpty包括空字符串和null
而isNotNull只包括null。
isNULL和isEmpty的用法相反。
isEquals:判断是否等于,等于的话就走这条分支,如下:
1 <update id="updateSqlId" parameterClass="java.lang.String"> 2 update table_name set update_date = sysdate 3 <isEquals prepend="," property="id1"> 4 id1=#value# 5 </isEquals> 6 <isEquals prepend="," property="id2"> 7 id2=#value# 8 </isEquals> 9 </update>
可以根据具体情况灵活应用。