sql中的>=等符号在ibatis中的运用方法。 ibatis sql xml 语法

因为ibatis的sql配置文件是xml格式的,所以不允许出现类似“>”这样的字符,但是都可以使用<![CDATA[ ]]>符号进行说明,将此类符号不进行解析,所以你可以写成这个:

<![CDATA[ AND substring(convert(varchar(8),createTime,112),1,6) <= #btnYearMonth# ]]>就可以了。

==========================================================================

下面也接着说说ibatis中使用安全的拼接语句,动态查询,大于、小于、等于:

在ibatis中使用安全的拼接语句,动态查询

ibatis比JDBC的优势之一,安全高效

说明文字在注释中

<select id="selectAllProducts" parameterClass="Product" resultMap="ProductResult">

select id,note from Product

<dynamic prepend="WHERE">

<!-- isNotNull判断参数是否存在,Integer类型 -->

<isNotNull property="id">

<!-- isGreaterThan判断参数是否大于compareValue,isGreaterEquals是大于等于 -->

<isGreaterThan prepend=" and " property="id" compareValue="0">

id = #id#

</isGreaterThan>

</isNotNull>

<!-- isNotEmpty判断字串不为空,isEmpty可以判断字串为空 -->

<isNotEmpty prepend=" and " property="note">

<!-- 模糊查询不能用#,#在是用prepareStatement的?插入参数,$是文本替换 -->

note like '%$note$%'

</isNotEmpty>

</dynamic>

</select>

用Map传参数

<select id="selectAllProducts" parameterClass="java.util.HashMap" resultMap="ProductResult">

select id,note from Product

<dynamic prepend="WHERE">

<!-- isPropertyAvailable判断属性是否有效 -->

<isPropertyAvailable property="id">

<isNotNull property="id">

<!-- isLessThan判断参数是否小于compareValue,isLessEquals是小于等于 -->

<isLessThan prepend=" and " property="id" compareValue="10">

id = #id#

</isLessThan>

</isNotNull>

</isPropertyAvailable>

</dynamic>

</select>

/*动态SQL的参数有

属性关键字

含义

<isEqual>

如果参数相等于值则查询条件有效。

<isNotEqual>

如果参数不等于值则查询条件有效。

<isGreaterThan>

如果参数大于值则查询条件有效。

<isGreaterEqual>

如果参数等于值则查询条件有效。

<isLessEqual>

如果参数小于值则查询条件有效。如下所示:

<isLessEqual prepend = ”AND” property = ”age” compareValue = ”18” >

ADOLESCENT = ‘TRUE’

</isLessEqual>

<isPropertyAvailable>

如果参数有使用则查询条件有效。

<isNotPropertyAvailable>

如果参数没有使用则查询条件有效。

<isNull>

如果参数为NULL则查询条件有效。

<isNotNull>

如果参数不为NULL则查询条件有效。

<isEmpty>

如果参数为空则查询条件有效。

<isNotEmpty>

如果参数不为空则查询条件有效。参数的数据类型为Collection、String 时参数不为NULL或“”。如下所示:

<isNotEmpty prepend=”AND” property=”firstName” >

FIRST_NAME=#firstName#

</isNotEmpty>

<isParameterPresent>

如果参数类不为NULL则查询条件有效。

<isNotParameterPresent>

Checks to see if the parameter object is not present (null). Example Usage:

<isNotParameterPresent prepend=”AND”>

EMPLOYEE_TYPE = ‘DEFAULT’

</isNotParameterPresent>

在复杂查询过程中,我们常常需要根据用户的选择决定查询条件,这里发生变化的并不只是SQL 中的参数,包括Select 语句中所包括的字段和限定条件,都可能发生变化。典型情况,如在一个复杂的组合查询页面,我们必须根据用户的选择和输入决定查询的条件组合。

一个典型的页面如下:

对于这个组合查询页面,根据用户选择填写的内容,我们应为其生成不同的查询语句。如用户没有填写任何信息即提交查询请求,我们应该返回所有记录:

Select * from t_user;

如用户只在页面上填写了姓名“Erica”,我们应该生成类似:

Select * from t_user where name like ‘%Erica%’ ;的SQL查询语句。

如用户只在页面上填写了地址“Beijing”,我们应该生成类似:

Select * from t_user where address like ‘%Beijing%”;的SQL。

而如果用户同时填写了姓名和地址(”Erica”&’Beijing’),则我们应生成类似:

Select * from t_user where name like ‘%Erica%’ and address like ‘%Beijing%”的SQL查询语句。

对于ibatis 这样需要预先指定SQL 语句的ORM 实现而言,传统的做法无非通过if-else 语句对输入参数加以判定,然后针对用户选择调用不同的statement 定义。对于上面这种简单的情况(两种查询条件的排列组合,共4 种情况)而言,statement 的重复定义工作已经让人不厌其烦,而对于动辄拥有七八个查询条件,乃至十几个查询条件

的排列组合而言,琐碎反复的statement定义实在让人不堪承受。

考虑到这个问题,ibatis引入了动态映射机制,即在statement定义中,根据不同的

查询参数,设定对应的SQL语句。

还是以上面的示例为例:

<select id="getUsers"

parameterClass="user"

resultMap="get-user-result">

select

id,

name,

sex

from t_user

<dynamic prepend="WHERE">

<isNotEmpty prepend="AND" property="name">

(name like #name#)

</isNotEmpty>

<isNotEmpty prepend="AND" property="address">

(address like #address#)

</isNotEmpty>

</dynamic>

</select>

通过dynamic 节点,我们定义了一个动态的WHERE 子句。此WHERE 子句中将

可能包含两个针对name 和address 字段的判断条件。而这两个字段是否加入检索取决于用户所提供的查询条件(字段是否为空[isNotEmpty])。

对于一个典型的Web程序而言,我们通过HttpServletRequest获得表单中的字段名并将其设入查询参数,如:

user.setName(request.getParameter("name"));

user.setAddress(request.getParameter("address"));

sqlMap.queryForList("User.getUsers", user);

在执行queryForList("User.getUsers", user)时,ibatis 即根据配置文

件中设定的SQL动态生成规则,创建相应的SQL语句。

上面的示例中,我们通过判定节点isNotEmpty,指定了关于name 和address 属

性的动态规则:

<isNotEmpty prepend="AND" property="name">

(name like #name#)

</isNotEmpty>

这个节点对应的语义是,如果参数类的"name"属性非空(isNotEmpty,即非空

字符串””),则在生成的SQL Where字句中包括判定条件(name like #name#),其

中#name#将以参数类的name属性值填充。

Address属性的判定生成与name属性完全相同,这里就不再赘述。

这样,我们通过在statement 定义中引入dynamic 节点,很简单的实现了SQL 判定子句的动态生成,对于复杂的组合查询而言,这将带来极大的便利。判定节点的定义可以非常灵活,我们甚至可以使用嵌套的判定节点来实现复杂的动态映射,如:

<isNotEmpty prepend="AND" property="name">

( name=#name#

<isNotEmpty prepend="AND" property="address">

address=#address#

</isNotEmpty>

)

</isNotEmpty>

这段定义规定,只有用户提供了姓名信息时,才能结合地址数据进行查询(如果只提供地址数据,而将姓名信息忽略,将依然被视为全检索)。Dynamic节点和判定节点中的prepend属性,指明了本节点中定义的SQL子句在

主体SQL中出现时的前缀。如:

<dynamic prepend="WHERE">

<isNotEmpty prepend="AND" property="name">

(name like #name#)

</isNotEmpty>

<isNotEmpty prepend="AND" property="address">

(address like #address#)

</isNotEmpty>

</dynamic>

假设"name"属性的值为“Erica”, "address"属性的值为“Beijing”,则会生成类似下面的SQL子句(实际运行期将生成带占位符的PreparedStatement,之后再为其填充数据):

WHERE (name like ‘Beijing’) AND (address like ‘Beijing’)

其中WHERE 之后的语句是在dynamic 节点中所定义,因此以dynamic 节点的prepend设置("WHERE")作为前缀,而其中的”AND”,实际上是address属性所对应的isNotEmpty节点的prepend设定,它引领了对应节点中定义的SQL子句。至于name属性对应的isNotEmpty节点,由于ibatis会自动判定是否需要追加prepend前缀,这里(name like #name#)是WHERE 子句中的第一个条件子句,无需AND 前缀,所以自动省略。

判定节点并非仅限于isNotEmpty,ibatis中提供了丰富的判定定义功能。判定节点分两类:

? 一元判定

一元判定是针对属性值本身的判定,如属性是否为NULL,是否为空值等。

上面示例中isNotEmpty就是典型的一元判定。

一元判定节点有:

节点名 描述

<isPropertyAvailable> 参数类中是否提供了此属性

<isNotPropertyAvailable> 与<isPropertyAvailable>相反

<isNull> 属性值是否为NULL

<isNotNull> 与<isNull>相反

<isEmpty> 如果属性为Collection或者String,其size是否<1,如果非以上两种类型,则通过String.valueOf(属性值)

获得其String类型的值后,判断其size是否<1<isNotEmpty> 与<isEmpty>相反。

? 二元判定

二元判定有两个判定参数,一是属性名,而是判定值,如

<isGreaterThan prepend="AND" property="age"

compareValue="18">

(age=#age#)

</isGreaterThan>

其中,property="age"指定了属性名”age”,compareValue=”18”指明了判定值为”18”。上面判定节点isGreaterThan 对应的语义是:如果age 属性大于18(compareValue),则在SQL中加入(age=#age#)条件。

二元判定节点有:

节点名 属性值与compareValues的关系

<isEqual> 相等。

<isNotEqual> 不等。

<isGreaterThan> 大于

<isGreaterEqual> 大于等于

<isLessThan> 小于

<isLessEqual> 小于等于

  

爱华网本文地址 » http://www.413yy.cn/a/25101013/182178.html

更多阅读

灭苍蝇的最好方法。 什么药灭苍蝇最好

灭苍蝇的最好方法。——简介苍蝇这种动物由于携带多种病原微生物传播而危害人类,你是不是很想消灭呢?由于苍蝇不像蚊子,苍蝇反应非常快,你很难打到,其他的灭苍蝇产品又有些贵,买来就为了灭家里面的偶尔几只苍蝇觉得很浪费,今天萌萌教大家一

缓解高考压力的最佳方法。 缓解高考压力的方法

在高三学生的复习备考中,压力大的呼声不绝于耳,再加上家长对子女的过高期望和社会的多元化价值取向,使得高三学生经常体验到更为广泛的内心冲突和压力。实际上解决高三学生的心理问题,需要家长,教师,特别是学生自己的协作和完善。 ? 一

电风扇不转的维修方法 电风扇电机维修视频

电风扇不转的维修方法——简介风扇使用中出现损坏或者故障是正常的,在它的风叶转不动的时候,我们应该怎么去修理,下面介绍几种电风扇不转的维修方法。电风扇不转的维修方法——方法/步骤电风扇不转的维修方法 1、很多时候引起风扇风叶

护唇的有效方法 有效保护视力的方法

不管是艳丽的红唇,还是粉嘟嘟的裸唇,都是女性之所在。各种唇膏、唇彩、唇蜜也是爱美女性的心爱之物。如此重要的不为,要怎么样才能贴心呵护好呢?今天就跟大家分享护唇的有效方法。护唇的有效方法——步骤/方法护唇的有效方法 1、在干

改善睡眠的简单方法 改善睡眠的小方法

随着社会的快速发展,人们生活压力在不断增加,失眠成为了人们普遍存在的问题,那有什么方法可以改善睡眠,看看下面为大家介绍的改善失眠的简单方法。改善睡眠的简单方法——食疗改善改善睡眠的简单方法 1、牛奶:牛奶中含有两种催眠物质:一种

声明:《sql中的>=等符号在ibatis中的运用方法。 ibatis sql xml 语法》为网友忍受你的坏脾气分享!如侵犯到您的合法权益请联系我们删除