mybatis(ibatis)中的动态sql<dynamic prepend="where"><isNotEmpty>的讲解
来源:互联网 发布:淘宝中国质造入口 编辑:程序博客网 时间:2024/05/21 13:55
ibatis的文档中,关于动态SQL的举例如下:
当需要使用根据传入参数的值来动态组装SQL时,可以使用dynamic标签。
dynamic元素可以包含多个条件比较元素,并且按照条件比较元素的表述对参数值进行比较,来组装动态SQL。
这里主要的条件比较元素包含isGreaterThan、isNotNull、isEmpty……
dynamic元素和条件比较元素,都是组成动态SQL的一部分,其中的prepend属性根据实际情况的需要辅助的组装动态SQL。
以上面的statement为例:
1)dynamic的prepend只要检测到第一个为“真”的条件比较元素,则覆盖其prepend属性并组装where关键字为动态SQL的一部分。
2)isNotNull的prepend只要检测到参数值满足比较条件,则前置组装and关键字为动态SQL的一部分。
注意一点:上面的例子中,ibtis文档中说 - dynamic元素中的prepend属性“where”将覆盖第一个为“真”的条件比较元素(即isGreaterThan)的prepend属性
按照这个理解,则第一个为“真”的条件比较元素(即isGreaterThan)的prepend属性是不需要的,或者“and”是不需要的,(ibatis文档中的原文是 For example, in the case of the first true condition, there is no need for the AND, and in fact it would break the statement) 则修改上述例子为
事实上,这样修改的结果导致最终SQL 变为
“select * from ACCOUNT where ACC_ID = #id# ACC_LAST_NAME = #lastName#”
明显是有问题的。
跟踪源码发现,ibatis在检测sqlTag的时候,调用了如下方法
dynamic要覆盖第一个为“真”的条件比较元素的prepend属性,首先需要检测该tag的prepend是否可用(tag.isPrependAvailable()),如果不可用的话,即便该比较条件为“真”,则不会覆盖,只是单独的添加该比较条件元素下的SQL
由此可以看出,prepend可用的前提是prepend属性值已经设置,并且长度>0。
这样的话就不难理解上述修改后的statement,为何SQL变更为“select * from ACCOUNT where ACC_ID = #id# ACC_LAST_NAME = #lastName#”?因为ACC_LAST_NAME = #lastName#的前置prepend,被作为第一个为真的比较条件给删除了。
正确的写法应该是
或者
- <statement id="someName" parameterClass="Account" resultMap="account-result" >
- select * from ACCOUNT
- <dynamic prepend="where">
- <isGreaterThan prepend="and" property="id" compareValue="0">
- ACC_ID = #id#
- </isGreaterThan>
- <isNotNull prepend="and" property="lastName">
- ACC_LAST_NAME = #lastName#
- </isNotNull>
- <isNotEmpty></ isNotEmpty>
- </dynamic>
- order by ACC_LAST_NAME
- </statement>
当需要使用根据传入参数的值来动态组装SQL时,可以使用dynamic标签。
dynamic元素可以包含多个条件比较元素,并且按照条件比较元素的表述对参数值进行比较,来组装动态SQL。
这里主要的条件比较元素包含isGreaterThan、isNotNull、isEmpty……
dynamic元素和条件比较元素,都是组成动态SQL的一部分,其中的prepend属性根据实际情况的需要辅助的组装动态SQL。
以上面的statement为例:
1)dynamic的prepend只要检测到第一个为“真”的条件比较元素,则覆盖其prepend属性并组装where关键字为动态SQL的一部分。
2)isNotNull的prepend只要检测到参数值满足比较条件,则前置组装and关键字为动态SQL的一部分。
注意一点:上面的例子中,ibtis文档中说 - dynamic元素中的prepend属性“where”将覆盖第一个为“真”的条件比较元素(即isGreaterThan)的prepend属性
按照这个理解,则第一个为“真”的条件比较元素(即isGreaterThan)的prepend属性是不需要的,或者“and”是不需要的,(ibatis文档中的原文是 For example, in the case of the first true condition, there is no need for the AND, and in fact it would break the statement) 则修改上述例子为
- <statement id="someName" parameterClass="Account" resultMap="account-result" >
- select * from ACCOUNT
- <dynamic prepend="where">
- <isGreaterThan property="id" compareValue="0">
- ACC_ID = #id#
- </isGreaterThan>
- <isNotNull prepend="and" property="lastName">
- ACC_LAST_NAME = #lastName#
- </isNotNull>
- </dynamic>
- order by ACC_LAST_NAME
- </statement>
事实上,这样修改的结果导致最终SQL 变为
“select * from ACCOUNT where ACC_ID = #id# ACC_LAST_NAME = #lastName#”
明显是有问题的。
跟踪源码发现,ibatis在检测sqlTag的时候,调用了如下方法
- public void pushRemoveFirstPrependMarker(SqlTag tag) {
- if(tag.getHandler() instanceof DynamicTagHandler) {
- // this was added to retain default behavior
- if(tag.isPrependAvailable()) {
- removeFirstPrependStack.addFirst(
- new RemoveFirstPrependMarker(tag,true));
- } else {
- removeFirstPrependStack.addFirst(
- new RemoveFirstPrependMarker(tag,false));
- }
- ……
dynamic要覆盖第一个为“真”的条件比较元素的prepend属性,首先需要检测该tag的prepend是否可用(tag.isPrependAvailable()),如果不可用的话,即便该比较条件为“真”,则不会覆盖,只是单独的添加该比较条件元素下的SQL
- public boolean isPrependAvailable() {
- return prependAttr != null && prependAttr.length() > 0;
- }
由此可以看出,prepend可用的前提是prepend属性值已经设置,并且长度>0。
这样的话就不难理解上述修改后的statement,为何SQL变更为“select * from ACCOUNT where ACC_ID = #id# ACC_LAST_NAME = #lastName#”?因为ACC_LAST_NAME = #lastName#的前置prepend,被作为第一个为真的比较条件给删除了。
正确的写法应该是
- <isGreaterThan prepend="and" property="id" compareValue="0">
或者
- <isGreaterThan prepend=" " property="id" compareValue="0">
1 0
- mybatis(ibatis)中的动态sql<dynamic prepend="where"><isNotEmpty>的讲解
- mybati(ibatis)中的动态sql <dynamic prepend="where">的详解
- ibatIS的<dynamic prepend="WHERE">原理,是判断前一个AND字母是否存在
- ibatis 动态sql prepend
- ibatis动态语句中的prepend
- Ibatis中的动态SQL:isNotNull,isPropertyAvailable,isNotEmpty用法
- Ibatis中的动态SQL:isNotNull,isPropertyAvailable,isNotEmpty用法
- Ibatis中的动态SQL:isNotNull,isPropertyAvailable,isNotEmpty用法
- Ibatis中的动态SQL:isNotNull,isPropertyAvailable,isNotEmpty用法
- sql,ibatis文件不允许在where后添加1=1这样的无用条件,where可以写在prepend属性里
- mybatis--动态sql中的where语句
- iBatis 动态SQL (Dynamic SQL)
- ibatis中的动态SQL:isNotNull,isPropertyAvailable,isNotEmpty,isGreaterThan等标签用法
- Mybatis中动态SQL(if,where,foreach 的使用)
- Mybatis中动态SQL(if,where,foreach 的使用)
- mybatis动态SQL的<where>标签
- mybatis动态sql查询Dynamic SQL之if,foreach,choose,trim,where,set
- ibatis使用dynamic配置动态sql时的问题
- poj 1260 Pearls
- C#中string[]数组和list<string>泛型的相互转换 【转】
- UI学习 -绘制文字功能练习
- poj 3087 Shuffle'm Up
- 【MFC入门】之七 MFC中创建应用程序资源之工具条资源的创建以及使用
- mybatis(ibatis)中的动态sql<dynamic prepend="where"><isNotEmpty>的讲解
- Android中Uri的使用
- linux下程序被Killed
- MySQL基础知识一
- 方格取数
- 暑假集训 8.12 sdutoj3375 数据结构实验之查找三:树的种类统计 (简单字符排序二叉树)
- linux 下安装 mysql5.6.30
- web 性能测试中的几个关键指标:并发用户数,QPS,用户平均请求等待时间
- HDU 5455 (模拟判断)