一,ibatis 的<isNotNull>标签。
当属性不为空的时候可以插入。这个时候你是否有过疑问。
如果属性为原生类型
(例如int类型)怎么办?
查看了Ibatis的文档可以发现如果原生类型的话,那么这个标签就显得力不从心了。为什么?
因为原生类型肯定有值,不可能为空。
比如有这么个DO类:
public class BabyDO implements Serializable {
private static final long serialVersionUID = -579987226803641422L;
private int id;
private String name; // 姓名
private SexEnum sex; // 性别
private Date birthday; // 生日
private String hobby; // 喜好
private int age; // 年龄 注意这里是原生类型
private List<AddressDO> address; // 地址复杂类型
// getters and setters 省略
然后有这么个XML代码:
<update id="updateBabysPartitialByParams" parameterClass="baby">
update Baby set
<dynamic prepend=" ">
<isNotNull property="name" prepend='",">
name=#name#
</isNotNull>
<isNotNull property="sex" prepend=",">
sex=#sex#
</isNotNull>
<isNotNull property="birthday" prepend=",">
birthday=#birthday#
</isNotNull>
<isNotNull property="hobby" prepend=",">
hobby=#hobby#
</isNotNull>
<isNotNull property="age" prepend=",">
age=#age#
</isNotNull>
</dynamic>
where id = #id#
</update>
那么isNotNull将不起任何作用。
读者可以自己尝试一下。
那么同时可想而知 <isNotEmpty>这个标签对原生类型也是不起作用的。读者可以再度尝试将<isNotNull>标签改成<isNotEmpty>标签。
二,你可能已经注意到上面的XML中有个<dynamic prepend=" ">
这个是不是多余的?
我曾有这种疑惑,但是当你把他去掉的时候错误也随之而来了。
看了日志居然打印出这种SQL来:
2009-09-21 21:47:14,873 DEBUG [java.sql.PreparedStatement] - {pstm-100001} Executing Statement: update Baby set , name=? , age=? where id > 10
跟踪了好久代码没看懂,到底是哪里的问题,可能我读代码的能力有限。所以查了google,终于找到原因了:
http://issues.apache.org/jira/browse/IBATIS-430
显然已经有人发现了这个现象,并提出了疑问。最终代码到底什么问题我确实是没找到,但是这个现象的确是存在的。
于是在使用的时候就要注意了 。
1,dynamic标签 如果要使标签里面的内容的第一个prepend无效,那么必须要有dynamic标签的prepend属性即使是空的
2,dynamic标签的prepend属性还不能真的为空,至少要一个空格!!!
尝试到这里我还真是有点吐血,看到很早有人提的这个BUG,却没有人去修正。
分享到:
相关推荐
IBATIS动态查询语句.doc
Ibatis查询语句里,可以使用多表查询,返回多个表的值.doc
iBatis最全的动态SQL语句,你需要的都有,资源在于大家共享
ibatis16个常用sql语句
Ibatis复杂查询语句.doc
ibatis中使用安全的拼接语句,动态查询,大于、小于、等于.doc
因为要下载其它的文件,所以从网站复制了一些其它的资源进行上传。但是这个资源是相当有用的。这里感谢之前总结相关技术的人员。谢谢
ibatis_动态查询条件详解及需要注意的地方
NULL 博文链接:https://raymondwang1314.iteye.com/blog/1195820
这个文件中包含了许多ibatis的查询语句,能够让你很清楚的知道,如何实现动态的查询。
ibatis常用的sql语句,很全的一篇文档。。。
在ibatis日志信息中打印SQL语句的方法(个人总结)
ibatis常用sql语句,简单易懂,方便查询,初学者宝典
ibatis查询语句配对.doc
ibatis动态多条件组合查询 实例 说明
Ibatis多表查询,一个小小的多表查询实例教你如何用ibatis进行多表查询
Ibatis多表查询
操作数据库 iBATIS查询,java 和spring的配置方法
ibatis集成memcached做缓存 可用..经验证过
最近遇到需要批量update数据的问题,一开始...原因是for循环每次update一条语句,都是一次连接过程。遇到大批数据更新的时候,效率就可想而知了。在google上找了一遍,发现ibatis里有对批量update的支持,挺好的东西。