1、动态SQL片段
通过SQL片段达到代码复用
复制代码
select count(*)
select *
from icp
name like ‘%
n
a
m
e
name
name%’
path like ‘%path$%’
area_id = #area_id#
hided = #hided#
limit #_start#, #_size#
复制代码
2、数字范围查询
所传参数名称是捏造所得,非数据库字段,比如_img_size_ge、_img_size_lt字段
复制代码
<![CDATA[ img_size >= #_img_size_ge# ]]>
<![CDATA[ img_size < #_img_size_lt# ]]>
复制代码
多次使用一个参数也是允许的
复制代码
<![CDATA[ execplantime >= #_now# ]]>
<![CDATA[ closeplantime <= #_now# ]]>
复制代码
3、时间范围查询
复制代码
<![CDATA[ createtime >= #_starttime# and createtime < #_endtime# ]]>
复制代码
4、in查询
<isNotEmpty prepend="and" property="_in_state">
state in ('$_in_state$')
</isNotEmpty>
5、like查询
复制代码
(chnameone like ‘%
c
h
n
a
m
e
o
n
e
chnameone
chnameone%’ or spellinitial like ‘%
c
h
n
a
m
e
o
n
e
chnameone
chnameone%’)
chnametwo like ‘%
c
h
n
a
m
e
t
w
o
chnametwo
chnametwo%’
复制代码
6、or条件
复制代码
<![CDATA[ (t.finished='11' or t.failure=3) ]]>
<isEqual prepend="and" property="_exeable" compareValue="Y">
<![CDATA[
t.finished in ('10','19') and t.failure<3
]]>
</isEqual>
复制代码
7、where子查询
复制代码
code not in
(select t.contentcode
from cms_ccm_programcontent t
where t.contenttype=‘MZNRLX_MA’
and t.programcode = #exprogramcode#)
<select id="findByProgramcode" parameterClass="string" resultMap="cms_ccm_material.result">
select *
from cms_ccm_material
where code in
(select t.contentcode
from cms_ccm_programcontent t
where t.contenttype = 'MZNRLX_MA'
and programcode = #value#)
order by updatetime desc
</select>
复制代码
9、函数的使用
复制代码
<insert id="insert" parameterClass="RuleMaster">
insert into rulemaster(
name,
createtime,
updatetime,
remark
) values (
#name#,
now(),
now(),
#remark#
)
<selectKey keyProperty="id" resultClass="long">
select LAST_INSERT_ID()
</selectKey>
</insert>
<!-- 更新 -->
<update id="update" parameterClass="RuleMaster">
update rulemaster set
name = #name#,
updatetime = now(),
remark = #remark#
where id = #id#
</update>
复制代码
10、map结果集
复制代码
<sql id="sql_count">
select count(a.*)
</sql>
<sql id="sql_select">
select a.id vid,
a.img imgurl,
a.img_s imgfile,
b.vfilename vfilename,
b.name name,
c.id sid,
c.url url,
c.filename filename,
c.status status
</sql>
<sql id="sql_where">
From secfiles c, juji b, videoinfo a
where
a.id = b. videoid
and b.id = c.segmentid
and c.status = 0
order by a.id asc,b.id asc,c.sortnum asc
<dynamic prepend="">
<isNotNull property="_start">
<isNotNull property="_size">
limit #_start#, #_size#
</isNotNull>
</isNotNull>
</dynamic>
</sql>
<!-- 返回没有下载的记录总数 -->
<select id="getUndownFilesForCount" parameterClass="map" resultClass="int">
<include refid="sql_count"/>
<include refid="sql_where"/>
</select>
<!-- 返回没有下载的记录 -->
<select id="getUndownFiles" parameterClass="map" resultClass="java.util.HashMap">
<include refid="sql_select"/>
<include refid="sql_where"/>
</select>
复制代码
原文:http://zhaohe162.blog.163.com/blog/static/3821679720115275181509/
直接使用JDBC一个非常普遍的问题就是动态SQL。使用参数值、参数本身和数据列都是动态SQL,通常是非常困难的。典型的解决办法就是用上一堆的IF-ELSE条件语句和一连串的字符串连接。对于这个问题,Ibatis提供了一套标准的相对比较清晰的方法来解决一个问题,这里有个简单的例子:
复制代码
select * from user
<isGreaterThan prepend="and" property="id" compareValue="0">
where user_id = #userId#
</isGreaterThan>
order by createTime desc
</select>
复制代码
上面的例子中,根据参数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,做到重用的地步,还是上面那个例子:
复制代码
<dynamic prepend="WHERE">
<isGreaterThan prepend="and" property="id" compareValue="0">
where user_id = #userId#
</isGreaterThan>
select * from user
<!-- 引入动态的查询条件 -->
<include refid="queryCondition"/>
order by createTime desc
</select>
复制代码
这个使用的话是否更加的具有公用性能,这就是Ibatis带来的便利。
在Ibatis中,动态的条件元素包含一下几种:二元条件元素、一元条件元素和其他条件元素:
(1)、二元条件元素:将一个属性值和静态值或另一个属性值比较,如果条件为真,元素将被包容在查询SQL语句中。
二元条件元素的属性:
perpend——可被覆盖的SQL语句组成部分,添加在语句的前面(可选)
property——是比较的属性(必选)
compareProperty——另一个用于和前者比较的属性(必选或选择compareValue)
compareValue——用于比较的值(必选或选择compareProperty)
比较属性值和静态值或另一个属性值是否相等。
比较属性值和静态值或另一个属性值是否不相等。
比较属性值是否大于静态值或另一个属性值。
比较属性值是否大于等于静态值或另一个属性值。
比较属性值是否小于静态值或另一个属性值。
比较属性值是否小于等于静态值或另一个属性值。
举个小例子:
<isLessEqual prepend=”AND” property=”age” compareValue=”18”>
ADOLESCENT = ‘TRUE’
</isLessEqual>
如果大于等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)
小例子:
<isNotEmpty prepend="AND" property="firstName" >
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的元素。
例子:
username=#userNameList[]#
注意:使用时,在List元素名后面包括方括号[]非常重要,方括号[]将对象标记为List,以防解析器简单地将List输出成String。
以上讲述了关于Ibatis的动态SQL的功能,是否觉得非常强大,并且优雅呢?那还犹豫什么呢?行动起来。