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)


相关推荐

  • 卡盟销售官网源码php,卡盟整站程序源码 php版「建议收藏」

    卡盟销售官网源码php,卡盟整站程序源码 php版「建议收藏」卡盟整站源码是该网站的内核程序,内核是Ecshop,类似平台开钻之类整站程序,也是重要的源码文件,其中包含了各种源码类型文件,比较全,安装操作比较简单。卡盟整站源码是一个点卡销售/充值平台程序,可以开钻,自动发货点卡,充值点卡,充值QB,如果自己想搭建卡盟的朋友可以下载使用。卡盟整站程序源码功能模块介绍系统公告、行业新闻、帮助信息、网址导航、用户注册,购卡中心。后台可以进行商品管理、订单管理、用户…

  • oracle的executereader,OracleCommand.ExecuteReader 方法 (System.Data.OracleClient) | Microsoft Docs…

    oracle的executereader,OracleCommand.ExecuteReader 方法 (System.Data.OracleClient) | Microsoft Docs…public:System::Data::OracleClient::OracleDataReader^ExecuteReader(System::Data::CommandBehaviorbehavior);publicSystem.Data.OracleClient.OracleDataReaderExecuteReader(System.Data.CommandBehavior…

  • windows启动、重启nginx

    windows启动、重启nginxwindows中启动、重启nginx命令1.找到nginx的安装目录,在目录上cmd进入黑窗口;2.启动startnginx3.配置文件nginx.conf修改重装载命令nginx-sreload

    2022年10月28日
  • 爬虫(2)之re 爬取淘宝网「建议收藏」

    爬虫(2)之re 爬取淘宝网「建议收藏」我们通过requests可以很轻松地就获得网页上的所有内容,但是这些内容往往会夹杂着许多我们不需要的东西,因此我们需要解析和提取HTML数据。在先前介绍过的解析和提取html内容的库,只能够处理静态文本执行简单的搜索,缺乏灵活性,不能处理动态的文本信息。下面来介绍一下正则表达式。什么是正则表达式?正则表达式是用来简洁表达一组字符串的表达式正则表达式是一种通用的字符串表达框架正则表…

  • 高并发下线程安全的单例模式(最全最经典)

    高并发下线程安全的单例模式(最全最经典)在所有的设计模式中,单例模式是我们在项目开发中最为常见的设计模式之一,而单例模式有很多种实现方式,你是否都了解呢?高并发下如何保证单例模式的线程安全性呢?如何保证序列化后的单例对象在反序列化后任然是单例的呢?这些问题在看了本文之后都会一一的告诉你答案,赶快来阅读吧!

  • linux中hdfs命令_linux下adb配置

    linux中hdfs命令_linux下adb配置Linux下的HDFS命令1.hdfs常用操作的命令格式  hadoopfs-ls对hdfs下一级目录的查看  hadoopfs-lsr对hdfs目录的递归查看  hadoopfs-mkdir创建目录  hadoopfs-put从linux上传文件到hdfs  hadoopfs-get从hdfs下载文件到linux  hadoopfs-text查看文件内容  hadoopfs-rm删除文件  hadoopfs-rm

发表回复

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

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