1、动态SQL片段
通过SQL片段达到代码复用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
<! -- 动态条件分页查询 -->
<sql id= "sql_count" >
select count (*)
</sql>
<sql id= "sql_select" >
select *
</sql>
<sql id= "sql_where" >
from icp
< dynamic prepend= "where" >
<isNotEmpty prepend= "and" property= "name" >
name like '%$name$%'
</isNotEmpty>
<isNotEmpty prepend= "and" property= "path" >
path like '%path$%'
</isNotEmpty>
<isNotEmpty prepend= "and" property= "area_id" >
area_id = #area_id#
</isNotEmpty>
<isNotEmpty prepend= "and" property= "hided" >
hided = #hided#
</isNotEmpty>
</ dynamic >
< dynamic prepend= "" >
<isNotNull property= "_start" >
<isNotNull property= "_size" >
limit #_start#, #_size#
</isNotNull>
</isNotNull>
</ dynamic >
</sql>
< select id= "findByParamsForCount" parameterClass= "map" resultClass= "int" >
<include refid= "sql_count" />
<include refid= "sql_where" />
</ select >
< select id= "findByParams" parameterClass= "map" resultMap= "icp.result_base" >
<include refid= "sql_select" />
<include refid= "sql_where" />
</ select >
|
2、数字范围查询
所传参数名称是捏造所得,非数据库字段,比如_img_size_ge、_img_size_lt字段
1
2
3
4
5
6
7
8
9
10
|
<isNotEmpty prepend= "and" property= "_img_size_ge" >
<![CDATA[
img_size >= #_img_size_ge#
]]>
</isNotEmpty>
<isNotEmpty prepend= "and" property= "_img_size_lt" >
<![CDATA[
img_size < #_img_size_lt#
]]>
</isNotEmpty>
|
多次使用一个参数也是允许的
1
2
3
4
5
6
7
8
9
10
|
<isNotEmpty prepend= "and" property= "_now" >
<![CDATA[
execplantime >= #_now#
]]>
</isNotEmpty>
<isNotEmpty prepend= "and" property= "_now" >
<![CDATA[
closeplantime <= #_now#
]]>
</isNotEmpty>
|
3、时间范围查询
1
2
3
4
5
6
7
8
|
<isNotEmpty prepend= "" property= "_starttime" >
<isNotEmpty prepend= "and" property= "_endtime" >
<![CDATA[
createtime >= #_starttime#
and createtime < #_endtime#
]]>
</isNotEmpty>
</isNotEmpty>
|
4、in查询
1
2
3
|
<isNotEmpty prepend= "and" property= "_in_state" >
state in ( '$_in_state$' )
</isNotEmpty>
|
5、like查询
1
2
3
4
5
6
|
<isNotEmpty prepend= "and" property= "chnameone" >
(chnameone like '%$chnameone$%' or spellinitial like '%$chnameone$%' )
</isNotEmpty>
<isNotEmpty prepend= "and" property= "chnametwo" >
chnametwo like '%$chnametwo$%'
</isNotEmpty>
|
6、or条件
1
2
3
4
5
6
7
8
9
10
11
|
<isEqual prepend= "and" property= "_exeable" compareValue= "N" >
<![CDATA[
(t.finished= '11' or t.failure=3)
]]>
</isEqual>
<isEqual prepend= "and" property= "_exeable" compareValue= "Y" >
<![CDATA[
t.finished in ( '10' , '19' ) and t.failure<3
]]>
</isEqual>
|
7、where子查询
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
<isNotEmpty prepend= "" property= "exprogramcode" >
<isNotEmpty prepend= "" property= "isRational" >
<isEqual prepend= "and" property= "isRational" compareValue= "N" >
code not in
( select t.contentcode
from cms_ccm_programcontent t
where t.contenttype= 'MZNRLX_MA'
and t.programcode = #exprogramcode#)
</isEqual>
</isNotEmpty>
</isNotEmpty>
< 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、函数的使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
<! -- 添加 -->
< 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结果集
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
<! -- 动态条件分页查询 -->
<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 >
|
11、trim
trim是更灵活的去处多余关键字的标签,他可以实践where和set的效果。
where例子的等效trim语句:
Xml代码
1
2
3
4
5
6
7
8
9
10
11
12
|
<! -- 查询学生list,like姓名,=性别 -->
< select id= "getStudentListWhere" parameterType= "StudentEntity" resultMap= "studentResultMap" >
SELECT * from STUDENT_TBL ST
<trim prefix= "WHERE" prefixOverrides= "AND|OR" >
<if test= "studentName!=null and studentName!='' " >
ST.STUDENT_NAME LIKE CONCAT(CONCAT( '%' , #{studentName}), '%' )
</if>
<if test= "studentSex!= null and studentSex!= '' " >
AND ST.STUDENT_SEX = #{studentSex}
</if>
</trim>
</ select >
|
set例子的等效trim语句:
Xml代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<! -- 更新学生信息 -->
< update id= "updateStudent" parameterType= "StudentEntity" >
UPDATE STUDENT_TBL
<trim prefix= "SET" suffixOverrides= "," >
<if test= "studentName!=null and studentName!='' " >
STUDENT_TBL.STUDENT_NAME = #{studentName},
</if>
<if test= "studentSex!=null and studentSex!='' " >
STUDENT_TBL.STUDENT_SEX = #{studentSex},
</if>
<if test= "studentBirthday!=null " >
STUDENT_TBL.STUDENT_BIRTHDAY = #{studentBirthday},
</if>
<if test= "classEntity!=null and classEntity.classID!=null and classEntity.classID!='' " >
STUDENT_TBL.CLASS_ID = #{classEntity.classID}
</if>
</trim>
WHERE STUDENT_TBL.STUDENT_ID = #{studentID};
</ update >
|
12、choose (when, otherwise)
有时候我们并不想应用所有的条件,而只是想从多个选项中选择一个。MyBatis提供了choose 元素,按顺序判断when中的条件出否成立,如果有一个成立,则choose结束。当choose中所有when的条件都不满则时,则执行 otherwise中的sql。类似于Java 的switch 语句,choose为switch,when为case,otherwise则为default。
if是与(and)的关系,而choose是或(or)的关系。
例如下面例子,同样把所有可以限制的条件都写上,方面使用。选择条件顺序,when标签的从上到下的书写顺序:
Xml代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
<! -- 查询学生list,like姓名、或=性别、或=生日、或=班级,使用choose -->
< select id= "getStudentListChooseEntity" parameterType= "StudentEntity" resultMap= "studentResultMap" >
SELECT * from STUDENT_TBL ST
< where >
<choose>
< when test= "studentName!=null and studentName!='' " >
ST.STUDENT_NAME LIKE CONCAT(CONCAT( '%' , #{studentName}), '%' )
</ when >
< when test= "studentSex!= null and studentSex!= '' " >
AND ST.STUDENT_SEX = #{studentSex}
</ when >
< when test= "studentBirthday!=null" >
AND ST.STUDENT_BIRTHDAY = #{studentBirthday}
</ when >
< when test= "classEntity!=null and classEntity.classID !=null and classEntity.classID!='' " >
AND ST.CLASS_ID = #{classEntity.classID}
</ when >
<otherwise>
</otherwise>
</choose>
</ where >
</ select >
|
以上所述是小编给大家介绍的MyBatis动态SQL标签用法实例详解,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!
原文链接:http://blog.csdn.net/luojishan1/article/details/74837875