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就是典型的一元判定。

一元判定节点有:

<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> 小于等于

2.列子

对于一些特殊符号,如大于号>、小于号< 等需要写在<![CDATA[]]中方可有效,否则失效。
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                                 <![CDATA[
 3                                 img_size >= #_img_size_ge#
 4                         ]]>
 5                         </isNotEmpty>
 6                         <isNotEmpty prepend="and" property="_img_size_lt">
 7                                 <![CDATA[
 8                                 img_size < #_img_size_lt#
 9                         ]]>
10                         </isNotEmpty>
11
12  

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

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

3、时间范围查询

1 <isNotEmpty prepend="" property="_starttime">
2                                 <isNotEmpty prepend="and" property="_endtime">
3                                         <![CDATA[
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                                 <![CDATA[
 3                                 (t.finished=‘11‘    or t.failure=3)
 4                         ]]>
 5                         </isEqual>
 6
 7 <isEqual prepend="and" property="_exeable" compareValue="Y">
 8                                 <![CDATA[
 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>
时间: 2024-10-24 10:44:56

ibatis的动态sql的相关文章

IBatis.net动态SQL语句

在学习动态SQL语句之前,首先必须对条件查询有一定了解,先来学习如何向IBatis.Net的映射文件里传入参数. 一.条件查询 1.传递单个参数 如根据Id查询: <select id="SelectPersonById" resultMap="Person" parameterClass="Int32" > SELECT * FROM Person WHERE Id = #Id# --这样传入一个参数 </select>

IBatis的动态SQL的写法

Ⅰ .动态SQL的写法 开始 <dynamic 条件成立时前面要加的字符串 prepend ="字符串"> prepend="字符串" 判断条件的对象属性名 property="字符串" 如果是属性关键字是比较条件时,字符串存放要比较的值compareValue="字符串"> 结束 </dynamic> Ⅱ.动态SQL的标签 一元标签 <iterate>标签 共同的属性 prepend

ibatis实现动态sql处理

package base; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.sql.Connection; import java.sql.ResultSet; import java.util.Calendar; import java.util.Date; import java.util.List; import java.util.Map; import javax.annotati

MyBatis 和 ibatis的动态SQL语句配置符号,不兼容大于号、小于号等特殊符号问题 X

TEST 在XML映射SQL的文件中,很多情况下会使用到大于号.小于号等特殊符号,这时候如果不进行控制是无法编译通过的,这时候需要用到<![CDATA[  ]]>符号进行说明,将此类符号不进行解析,其实,这个问题不止在MyBatis上通用,而是它通用于任何XML的文件中使用,比如Hibernate.Wabacus.Spring等等等等配置文件中,只要是XML文件就行,此类问题在以后的工作中,经常使用. 案例代码 <select id="findAllKiaAnalysisByC

iBatis动态SQL标签用法

1.动态SQL片段 通过SQL片段达到代码复用 <!-- 动态条件分页查询 -->         <sql id="sql_count">                 select count(*)         </sql>         <sql id="sql_select">                 select *         </sql>         <sql i

ibatis 动态SQL

直接使用JDBC一个非常普遍的问题就是动态SQL.使用参数值.参数本身和数据列都是动态SQL,通常是非常困难的.典型的解决办法就是用上一堆的IF-ELSE条件语句和一连串的字符串连接.对于这个问题,Ibatis提供了一套标准的相对比较清晰的方法来解决一个问题,这里有个简单的例子: <select id="getUserList" resultMap="user"> select * from user <isGreaterThan prepend=

IBATIS动态SQL

直接使用JDBC一个非常普遍的问题就是动态SQL.使用参数值.参数本身和数据列都是动态SQL,通常是非常困难的.典型的解决办法就是用上一堆的IF-ELSE条件语句和一连串的字符串连接.对于这个问题,Ibatis提供了一套标准的相对比较清晰的方法来解决一个问题,这里有个简单的例子: <select id="getUserList" resultMap="user"> select * from user <dynamic prepend="

ibatis动态sql配置启动时提示:The content of elements must consist of well-formed character data...

ibatis动态sql配置启动时提示:The content of elements must consist of well-formed character data... 2012-07-18 11:21wuming3632171 | 浏览 5114 次 ibatis配置如下,高手帮我看看.<select id="exportRecieveData" parameterClass="java.util.HashMap"resultClass="

MyBatis 动态sql详解

MyBatis的动态sql语句 1.if 条件 2.choose , when 和 otherwise条件 3.where 条件 where条件:1.自动加上where.2.如果where子句以and或者or开头,则自动删除第一个and或者or..所以我们不需要自己加where 4.trim 条件 trim条件和where条件类似但是功能更强大:不仅可以替换掉子句开头的and或者or,还提供了加前缀和后缀的功能. 5.forEach循环 6.set 条件 set条件:自动加上set,自动去除最后