ibatis的动态sql

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>

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/109452.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • c语言dlsym函数_dlsym

    c语言dlsym函数_dlsym2019独角兽企业重金招聘Python工程师标准>>>…

  • srgb的伽马值_srgb模式和标准模式

    srgb的伽马值_srgb模式和标准模式sRGB标准人眼对亮度的感知不是线性的,其对较暗区域的变化更加敏感参见:ComputerColorisBroken基于人眼该特点,sRGB标准要求图像(各通道为8bits,最多存储256个亮度值)使用编码伽马,把更多地空间用来存储更多暗部区域,来最大化地利用表示亮度的数据位或带宽伽马校正(Gammacorrection)在早期,阴极射线管(CRT)显示器是唯一的电子显示设备,但它的输入电压和显示出来的亮度关系不是线性的,而是一个类似幂律(pow-law)曲线的关系,…

  • Zabbix系列之入门介绍(一)

    Zabbix系列之入门介绍(一)

  • Burpsuite教程(一)Burpsuite 火狐谷歌浏览器抓包教程

    Burpsuite教程(一)Burpsuite 火狐谷歌浏览器抓包教程1.1Web抓包火狐抓包环境需求:火狐浏览器代理插件1.打开测试工具BurpSuite,默认工具拦截功能是开启的,颜色较深,我们点击取消拦截。下图取消拦截状态,数据包可以自由通过:2.按下图顺序点击选显卡来到代理设置3.可以看到默认的代理设置情况,本地代理地址:127.0.0.1,代理端口8080。如果前面没有勾选一定要选择勾选。工具代理设置完毕。4.证书安装,浏览器输输入http://burp/,点击图示位置下载证书5配置证书,打开浏览器并导入证书火狐浏览器开打开证

  • ubuntu20.04 美化_ubuntu19美化

    ubuntu20.04 美化_ubuntu19美化本文目录效果终端文件管理器步骤Ubuntu上的准备工作tweaktool安装火狐浏览器/谷歌浏览器安装插件安装插件下载主题、图标等配置终端的标题栏太大???方案1方案2效果终端文件管理器步骤Ubuntu上的准备工作tweaktool安装sudoaptinstallgnome-tweak-tool火狐浏览器/谷歌浏览器安装插件在浏览器的插件管理界面搜索gnomeshellintegration插件,然后安装。安装插件上面的东西都准备好之后,去gnome插件官网

  • java 设置环境变量

    java 设置环境变量安装JDK向导进行相关参数设置。如图:正在安装程序的相关功能,如图:选择安装的路径,可以自定义,也可以默认路径。如图:成功安装之后,进行测试是否真的成功安装,点击【开始】—-【运行】—-输入CMD,在命令提示符里面输入“Java-version”并按回车键,出现下图,即为安装成功。如图:下面开始配置环境变量,右击【我的电脑】

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号