ibatis动态sql
2016-06-08 09:22
218 查看
转自:http://www.cnblogs.com/phoebus0501/archive/2011/05/16/2048126.html
直接使用JDBC一个非常普遍的问题就是动态SQL。使用参数值、参数本身和数据列都是动态SQL,通常是非常困难的。典型的解决办法就是用上一堆的
IF-ELSE条件语句和一连串的字符串连接。对于这个问题,Ibatis提供了一套标准的相对比较清晰的方法来解决一个问题,这里有个简单的例子:
< select id="getUserList" resultMap="user" >
select * from user
< isGreaterThan prepend="and" property="id" compareValue="0"
>
where user_id = #userId#
</ isGreaterThan >
order
by createTime desc
</
select >
$中间的变量就是直接替换成值的
#会根据变量的类型来进行替换
比如articleTitle的类型是string, 值是"标题"的时候
$articleTitle$ = 标题
#articleTitle# = '标题'
上面的例子中,根据参数bean“id”属性的不同情况,可创建两个可能的语句。如果参数“id”大于0,将创建下面的语句:
select * from user where user_id =
? order by createTime desc
或者,如果“id”参数小于等于0,将创建下面的语句:
select * from user order by
createTime desc
以上的这个例子是否可以看出Ibatis里提供的简单的写法来实现了复杂拖沓的动态SQL呢?我们在做查询的时候,对于同一个表,甚至可以用来定义一个动态SQL,做到重用的地步,还是上面那个例子:
where user_id = #userId#
这个使用的话是否更加的具有公用性能,这就是Ibatis带来的便利。
在Ibatis中,动态的条件元素包含一下几种:二元条件元素、一元条件元素和其他条件元素:
(1)、二元条件元素:将一个属性值和静态值或另一个属性值比较,如果条件为真,元素将被包容在查询SQL语句中。
二元条件元素的属性:
perpend——可被覆盖的SQL语句组成部分,添加在语句的前面(可选)
property——是比较的属性(必选)
compareProperty——另一个用于和前者比较的属性(必选或选择compareValue)
compareValue——用于比较的值(必选或选择compareProperty)
举个小例子:
ADOLESCENT = ‘TRUE’
如果大于等18岁时,则为成年人
(2)、一元条件元素:一元条件元素检查属性的状态是否符合特定的条件。
一元条件元素的属性:
prepend——可被覆盖的SQL语句组成部分,添加在语句前面(可选)
property——被比较的属性(必选)
小例子:
FIRST_NAME=#firstName#
(3)、其他元素条件
(a).Parameter Present:这些元素检查参数对象是否存在
Parameter Present条件的属性
prepend - 可被覆盖的SQL语句组成部分,添加在语句的前面(可选)
(b)、Iterate:这属性遍历整个集合,并为List集合中的元素重复元素体的内容。
Iterate的属性:
prepend - 可被覆盖的SQL语句组成部分,添加在语句的前面(可选)
property - 类型为java.util.List的用于遍历的元素(必选)
open - 整个遍历内容体开始的字符串,用于定义括号(可选)
close -整个遍历内容体结束的字符串,用于定义括号(可选)
conjunction - 每次遍历内容之间的字符串,用于定义AND或OR(可选)
直接使用JDBC一个非常普遍的问题就是动态SQL。使用参数值、参数本身和数据列都是动态SQL,通常是非常困难的。典型的解决办法就是用上一堆的
IF-ELSE条件语句和一连串的字符串连接。对于这个问题,Ibatis提供了一套标准的相对比较清晰的方法来解决一个问题,这里有个简单的例子:
< select id="getUserList" resultMap="user" >
select * from user
< isGreaterThan prepend="and" property="id" compareValue="0"
>
where user_id = #userId#
</ isGreaterThan >
order
by createTime desc
</
select >
$中间的变量就是直接替换成值的
#会根据变量的类型来进行替换
比如articleTitle的类型是string, 值是"标题"的时候
$articleTitle$ = 标题
#articleTitle# = '标题'
上面的例子中,根据参数bean“id”属性的不同情况,可创建两个可能的语句。如果参数“id”大于0,将创建下面的语句:
select * from user where user_id =
? order by createTime desc
或者,如果“id”参数小于等于0,将创建下面的语句:
select * from user order by
createTime desc
以上的这个例子是否可以看出Ibatis里提供的简单的写法来实现了复杂拖沓的动态SQL呢?我们在做查询的时候,对于同一个表,甚至可以用来定义一个动态SQL,做到重用的地步,还是上面那个例子:
where user_id = #userId#
这个使用的话是否更加的具有公用性能,这就是Ibatis带来的便利。
在Ibatis中,动态的条件元素包含一下几种:二元条件元素、一元条件元素和其他条件元素:
(1)、二元条件元素:将一个属性值和静态值或另一个属性值比较,如果条件为真,元素将被包容在查询SQL语句中。
二元条件元素的属性:
perpend——可被覆盖的SQL语句组成部分,添加在语句的前面(可选)
property——是比较的属性(必选)
compareProperty——另一个用于和前者比较的属性(必选或选择compareValue)
compareValue——用于比较的值(必选或选择compareProperty)
比较属性值和静态值或另一个属性值是否相等。 | |
比较属性值和静态值或另一个属性值是否不相等。 | |
比较属性值是否大于静态值或另一个属性值。 | |
比较属性值是否大于等于静态值或另一个属性值。 | |
比较属性值是否小于静态值或另一个属性值。 | |
比较属性值是否小于等于静态值或另一个属性值。 |
ADOLESCENT = ‘TRUE’
如果大于等18岁时,则为成年人
(2)、一元条件元素:一元条件元素检查属性的状态是否符合特定的条件。
一元条件元素的属性:
prepend——可被覆盖的SQL语句组成部分,添加在语句前面(可选)
property——被比较的属性(必选)
检查是否存在该属性(存在parameter bean的属性) | |
检查是否不存在该属性(不存在parameter bean的属性) | |
检查属性是否为null | |
检查属性是否不为null | |
检查Collection.size()的值,属性的String或String.valueOf()值,是否为null或空(“”或size() < 1) | |
检查Collection.size()的值,属性的String或String.valueOf()值,是否不为null或不为空(“”或size() > 0) |
FIRST_NAME=#firstName#
(3)、其他元素条件
(a).Parameter Present:这些元素检查参数对象是否存在
Parameter Present条件的属性
prepend - 可被覆盖的SQL语句组成部分,添加在语句的前面(可选)
检查是否存在参数对象(不为null) | |
例子: EMPLOYEE_TYPE = ‘DEFAULT’ |
(b)、Iterate:这属性遍历整个集合,并为List集合中的元素重复元素体的内容。
Iterate的属性:
prepend - 可被覆盖的SQL语句组成部分,添加在语句的前面(可选)
property - 类型为java.util.List的用于遍历的元素(必选)
open - 整个遍历内容体开始的字符串,用于定义括号(可选)
close -整个遍历内容体结束的字符串,用于定义括号(可选)
conjunction - 每次遍历内容之间的字符串,用于定义AND或OR(可选)
遍历类型为java.util.List的元素。 例子: open="(" close=")" conjunction="OR"> username=#userNameList[]# 注意:使用时,在List元素名后面包括方括号[]非常重要,方括号[]将对象标记为List,以防解析器简单地将List输出成String。 |
相关文章推荐
- Oracle获取时间或者月份列表
- Microsoft SQL Server 2012(附序列号)
- SQL Server中的@@ROWCOUNT
- SQLYog快捷键大全
- 查询oralce ebs请求情况
- [ERROR] /usr/local/mysql/bin/mysqld: Sort aborted: Server shutdown in progress
- 不装oracle客户端,用plsql连oracle
- Sql Server 中的 @@ERROR
- sqlite查询数据库去除重复记录
- mysql相关问题
- 一个非常标准的Java连接Oracle数据库的示例代码
- oracle存储过程---获取数据库中到指定经纬度距离的坐标
- Oracle 建表
- mysql建立部分索引
- SQL获取本周、本月、本季度的记录的语句
- MemSQL 取代 HDFS 与 Spark 结合,性能大幅提升
- Mysql有关存储过程与触发器详解:
- MySQL数据库事务隔离级别(Transaction Isolation Level)-详细实例!
- Sqlserver查询数据库文件大小和剩余空间
- 数据库2