SELECT count(web_sys_module.module_Id) FROM web_sys_module WHERE 1=1
<isNotEmpty prepend="AND" property="module_Id">
<![CDATA[ web_sys_module.module_Id = #module_Id# ]]>
</isNotEmpty>
我想问下这个<isNotEmpty prepend="AND" property="module_Id">和
<![CDATA[ web_sys_module.module_Id = #module_Id# ]]>都是什么意思.才看ibatis,求懂的帮忙解惑,谢谢.
解决方案 »
- JSP 登陆时session丢失?
- baidu笔试题: 1900个员工,至少有多少个员工同年同月同日生
- 如何使用.properties类型的文件
- 宇宙霹雳无敌超级世界最虚心的请求一个问题....关于日历的..欢迎进来!
- 关于WebSphere的配置问题
- 看谁能回答这个问题?在线等着..........
- 有没有人看孙卫琴的<<精通struts>>?有个问题向请教大家
- ---Hibernate的局限性:如果我的表结构需要动态改变怎么办?---
- 关于使用jdom后xml加载到dom后如何提取相应的数据问题
- TOPIC和 QUEUE 有什么区别?
- struts2 国际化18n
- 关于乱码的问题:tomcat的默认编码改过了
<![CDATA[……]]> :通过这个节点可以避免sql中与xml规范相冲突的字符对xml映射文件的合法性造成影响。
#属性名# :在运行期会由传入的参数使用对应的get方法获取值并填充。
【动态Mapped Statement】
在复杂查询过程中,我们经常需要根据用户的选择决定查询条件,这里发生变化的并不只是SQL中的参数,包括select语句中所包括的字段和限制条件,都可能发生变化。考虑到这个问题,ibatis引入了动态映射机制,即在statement定义中,根据不同的查询参数,设定对应的SQL语句。
下面是一个使用动态映射的例子:
<select id="Ibatis.queryByQuery" parameterClass="User" resultMap="user">
select
<include refid="user.all" />
from t_user
<dynamic prepend="where">
<isNotEmpty prepend="and" property="name">
(name like '%$name$%')
</isNotEmpty>
<isNotNull prepend="and" property="sex">
(sex = #sex,handler=GenderTypeHandler#)
</isNotNull>
<isGreaterThan prepend="and" property="age" compareValue=”0”>
(age = #age#)
</isGreaterThan>
</dynamic>
</select>
上面的例子中,<dynamic>元素划分出SQL语句的动态部分。动态部分可以包含任意多的条件标签元素,条件标签决定是否在语句中包含其中的SQL代码。所有的条件标签元素将根据传给动态查询Statement的参数对象的情况来工作。<dynamic>元素和条件元素都有“prepend”属性,它是动态SQL代码的一部分,在必要情况下,可以被父元素的“prepend”属性覆盖。上面的例子中,prepend属性“where”将覆盖第一个为“真”的条件元素。这对于确保生成正确的SQL语句是有必要的。例如,在第一个为“真”的条件元素中,“AND”是不需要的,事实上,加上它肯定会出错。以下小节讨论不同的条件元素,包括二元条件元素,一元条件元素和其他动态元素。
二元条件元素
二元条件元素将一个属性值和一个静态值或另一个属性值比较,如果条件为“真”,元素体的内容将被包括在查询SQL语句中。
节点名 含义
<isEqual> 比较属性值和静态值或另一个属性值是否相等。
<isNotEqual> 比较属性值和静态值或另一个属性值是否不相等。
<isGreaterThan> 比较属性值是否大于静态值或另一个属性值。
<isGreaterEqual> 大于等于
<isLessThan> 小于
<isLessEqual> 小于等于
其中每个节点有以下属性:
prepend :可被覆盖的sql语句组成部分,添加在语句的前面(可选)
property : 被比较的属性(必选)
compareProperty :另一个用于和前者比较的属性(必选或选择compareValue)
compareValue :用于比较的值(必选或选择compareProperty)
一元条件元素
一元条件元素检查属性的状态是否符合特定的条件。
节点名 含义
<isPropertyAvailable> 检查是否存在该属性。
<isNotPropertyAvailable> 检查是否不存在该属性。
<isNull> 检查属性是否为null。
<isNotNull> 检查属性是否不为null。
<isEmpty> 检查Collection,属性的String等值是否为null或空。
<isNotEmpty> 检查Collection,属性的String等值是否不为null或不空。
一元条件元素的属性:
prepend :可被覆盖的sql语句组成部分,添加在语句的前面(可选)
property : 被比较的属性(必选)
其他元素
Parameter Present : 检查参数对象是否存在
它有一个属性为prepend。
节点名 含义
<isParameterPresent > 检查是否存在参数对象(不为null)。
<isNotParameterPresent > 检查是否不存在参数对象(参数对象为null)。
Iterate : 遍历整个集合,并为List集合中的元素重复元素体的内容。
它有以下5个属性:
prepend :可被覆盖的sql语句组成部分,添加在语句的前面(可选)
property :类型为java.util.List的用于遍历的元素(必选)
open :整个遍历内容体开始的字符串,用于定义括号(可选)
close : 整个遍历内容体结束的字符串,用于定义括号(可选)
conjunction :每次遍历内容之间的字符串,用于定义AND或OR(可选)
节点名 含义
<iterate > 遍历类型为java.util.List的元素。
<iterate prepend="AND" property="userNameList"
open="(" close=")" conjunction="OR">
username=#userNameList[]#
</iterate>
注意:使用<iterate>时,在List元素名后面包括方括号[]非常重要,方括号[]将对象标记为List,以防解析器简单的将List输出成String。
以上内容对sqlMap所涉及到的配置相关的内容做了一个总结。
<!--就是个sql拼接的问题 -->
<isNotEmpty prepend="AND" property="module_Id">
<![CDATA[ web_sys_module.module_Id = #module_Id# ]]>
</isNotEmpty>
//用代码写一写<isNotEmpty>...</isNotEmpty>大概就是这样
String sqlString = "select * ...."; //假设这是你前面的sql
//<isNotEmpty> 就像下面这样
if (!module_Id.equals(null) && module_Id.length > 1) {
sqlString += "web_sys_module.module_Id = #module_Id#";
}至于这个<![CDATA[....]]>
是屏蔽特殊字符用的,如果sql中出现了特殊字符, 可以用这个把sql框起来,特殊字符就失效了.