ibatis的动态sql


1.介绍

 1 <select id="getUsers"
 2 
 3 parameterClass="user"
 4 
 5 resultMap="get-user-result"> 
 6 
 7 select
 8 
 9 id,
10 
11 name,
12 
13 sex
14 
15 from t_user
16 
17 <dynamic prepend="WHERE">
18 
19    <isNotEmpty prepend="AND" property="name">
20 
21        name like #name#
22 
23    isNotEmpty>
24 
25    <isNotEmpty prepend="AND" property="address">
26 
27        address like #address#
28 
29    isNotEmpty>
30 
31 dynamic>
32 
33 select>

      通过dynamic 节点,可以定义了一个动态的WHERE 子句。此WHERE 子句中将可能包含两个针对name 和address 字段的判断条件。而这两个字段是否加入检索取决于用户所提供的查询条件。

      这个节点对应的语义是,如果参数类的"name"属性非空(isNotEmpty,即非空字符串””),则在生成的SQL Where字句中包括判定条件(name like #name#),其中#name#将以参数类的name属性值填充。

      name属性对应的isNotEmpty节点,由于ibatis会自动判定是否需要追加prepend前缀,这里(name like #name#)是WHERE 子句中的第一个条件子句,无需AND 前缀,所以自动省略。

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

一、 一元判定

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

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

一元判定节点有:

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

相反

属性值是否为NULL

相反

如果属性为Collection或者String,其size是否<1,

如果非以上两种类型,则通过

String.valueOf(属性值)

获得其String类型的值后,判断其size是否<1

相反。

二、二元判定

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

compareValue="18">

(age=#age#)

其中,property="age"指定了属性名”age”,compareValue=”18”指明

了判定值为”18”。

上面判定节点isGreaterThan 对应的语义是:如果age 属性大于

18(compareValue),则在SQL中加入(age=#age#)条件。

二元判定节点有:

节点名 属性值与compareValues的关系

相等。

不等。

大于

大于等于

小于

小于等于

2.列子

对于一些特殊符号,如大于号>、小于号< 等需要写在1、动态SQL片段 通过SQL片段达到代码复用
 1  
 2         <sql id="sql_count"> 
 3                 select count(*) 
 4         sql> 
 5         <sql id="sql_select"> 
 6                 select * 
 7         sql> 
 8         <sql id="sql_where"> 
 9                 from icp 
10                 <dynamic prepend="where"> 
11                         <isNotEmpty prepend="and" property="name"> 
12                                 name like '%$name$%' 
13                         isNotEmpty> 
14                         <isNotEmpty prepend="and" property="path"> 
15                                 path like '%path$%' 
16                         isNotEmpty> 
17                         <isNotEmpty prepend="and" property="area_id"> 
18                                 area_id = #area_id# 
19                         isNotEmpty> 
20                         <isNotEmpty prepend="and" property="hided"> 
21                                 hided = #hided# 
22                         isNotEmpty> 
23                 dynamic> 
24                 <dynamic prepend=""> 
25                         <isNotNull property="_start"> 
26                                 <isNotNull property="_size"> 
27                                         limit #_start#, #_size# 
28                                 isNotNull> 
29                         isNotNull> 
30                 dynamic> 
31         sql> 
32         <select id="findByParamsForCount" parameterClass="map" resultClass="int"> 
33                 <include refid="sql_count"/> 
34                 <include refid="sql_where"/> 
35         select> 
36         <select id="findByParams" parameterClass="map" resultMap="icp.result_base"> 
37                 <include refid="sql_select"/> 
38                 <include refid="sql_where"/> 
39 
40         select>
2、数字范围查询 所传参数名称是捏造所得,非数据库字段,比如_img_size_ge、_img_size_lt字段
 1 <isNotEmpty prepend="and" property="_img_size_ge"> 
 2                                  
 3                                 img_size >= #_img_size_ge# 
 4                         ]]> 
 5                         isNotEmpty> 
 6                         <isNotEmpty prepend="and" property="_img_size_lt"> 
 7                                  
 8                                 img_size < #_img_size_lt# 
 9                         ]]> 
10                         isNotEmpty> 
11 
12  

多次使用一个参数也是允许的

 1 <isNotEmpty prepend="and" property="_now"> 
 2                                  
 3                                             execplantime >= #_now# 
 4                                      ]]> 
 5                         isNotEmpty> 
 6                         <isNotEmpty prepend="and" property="_now"> 
 7                                  
 8                                             closeplantime <= #_now# 
 9                                      ]]> 
10                         isNotEmpty>

3、时间范围查询

1 <isNotEmpty prepend="" property="_starttime"> 
2                                 <isNotEmpty prepend="and" property="_endtime"> 
3                                          
4                                         createtime >= #_starttime# 
5                                         and createtime < #_endtime# 
6                                  ]]> 
7                                 isNotEmpty> 
8                         isNotEmpty> 

4、in查询

1 <isNotEmpty prepend="and" property="_in_state"> 
2                                 state in ('$_in_state$') 
3                         isNotEmpty>

5、like查询

1 <isNotEmpty prepend="and" property="chnameone"> 
2                                 (chnameone like '%$chnameone$%' or spellinitial like '%$chnameone$%') 
3                         isNotEmpty> 
4                         <isNotEmpty prepend="and" property="chnametwo"> 
5                                 chnametwo like '%$chnametwo$%' 
6                         isNotEmpty> 

6、or条件

 1 <isEqual prepend="and" property="_exeable" compareValue="N"> 
 2                                  
 3                                 (t.finished='11'    or t.failure=3) 
 4                         ]]> 
 5                         isEqual>
 6 
 7 <isEqual prepend="and" property="_exeable" compareValue="Y"> 
 8                                  
 9                                 t.finished in ('10','19') and t.failure<3 
10                         ]]> 
11                         isEqual>

7、where子查询

 1 <isNotEmpty prepend="" property="exprogramcode"> 
 2                                 <isNotEmpty prepend="" property="isRational"> 
 3                                         <isEqual prepend="and" property="isRational" compareValue="N"> 
 4                                                 code not in 
 5                                                 (select t.contentcode 
 6                                                 from cms_ccm_programcontent t 
 7                                                 where t.contenttype='MZNRLX_MA' 
 8                                                 and t.programcode = #exprogramcode#) 
 9                                         isEqual> 
10                                 isNotEmpty> 
11                         isNotEmpty>
12 
13 <select id="findByProgramcode" parameterClass="string" resultMap="cms_ccm_material.result"> 
14                 select * 
15                 from cms_ccm_material 
16                 where code in 
17                 (select t.contentcode 
18                 from cms_ccm_programcontent t 
19                 where t.contenttype = 'MZNRLX_MA' 
20                 and programcode = #value#) 
21                 order by updatetime desc 
22         select>

9、函数的使用

 1  
 2         <insert id="insert" parameterClass="RuleMaster"> 
 3                 insert into rulemaster( 
 4                 name, 
 5                 createtime, 
 6                 updatetime, 
 7                 remark 
 8                 ) values ( 
 9                 #name#, 
10                 now(), 
11                 now(), 
12                 #remark# 
13                 ) 
14                 <selectKey keyProperty="id" resultClass="long"> 
15                         select LAST_INSERT_ID() 
16                 selectKey> 
17         insert> 
18          
19         <update id="update" parameterClass="RuleMaster"> 
20                 update rulemaster set 
21                 name = #name#, 
22                 updatetime = now(), 
23                 remark = #remark# 
24                 where id = #id# 
25         update>

10、map结果集 

 1  
 2         <sql id="sql_count"> 
 3                 select count(a.*) 
 4         sql> 
 5         <sql id="sql_select"> 
 6                 select a.id                vid, 
 7                 a.img             imgurl, 
 8                 a.img_s         imgfile, 
 9                 b.vfilename vfilename, 
10     b.name            name, 
11                 c.id                sid, 
12                 c.url             url, 
13                 c.filename    filename, 
14                 c.status        status 
15         sql> 
16         <sql id="sql_where"> 
17                 From secfiles c, juji b, videoinfo a 
18                 where 
19                 a.id = b. videoid 
20                 and b.id = c.segmentid 
21                 and c.status = 0 
22                 order by a.id asc,b.id asc,c.sortnum asc 
23                 <dynamic prepend=""> 
24                         <isNotNull property="_start"> 
25                                 <isNotNull property="_size"> 
26                                         limit #_start#, #_size# 
27                                 isNotNull> 
28                         isNotNull> 
29                 dynamic> 
30         sql> 
31          
32         <select id="getUndownFilesForCount" parameterClass="map" resultClass="int"> 
33                 <include refid="sql_count"/> 
34                 <include refid="sql_where"/> 
35         select> 
36          
37         <select id="getUndownFiles" parameterClass="map" resultClass="java.util.HashMap"> 
38                 <include refid="sql_select"/> 
39                 <include refid="sql_where"/> 
40         select>

相关