问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

ibatis动态sql语句能不能进行iterate嵌套,如何使用

发布网友 发布时间:2022-04-07 17:47

我来回答

2个回答

懂视网 时间:2022-04-07 22:08

 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>

 

ibatis的动态sql

标签:

热心网友 时间:2022-04-07 19:16

没有的吧,我记得mybatis中是可以执行2条sql的,应该ibatis也可以才是。第一条sql中的返回值是可以作为第二条sql的条件执行的。
<updateid="insertProct-ORACLE" parameterClass="com.domain.Proct">
<selectKey resultClass="int" keyProperty="seqno" >
select seqno from table where .. for update
</selectKey>
update table set seqno = seqno+1

</update>
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
谷歌浏览器怎么设置成中文_谷歌浏览器设置中文语言 【谷歌浏览器技巧】谷歌浏览器如何更改语言? 史上最全ETF全解 证券ETF是深市的吗 怎样把莲藕肉丸子做的好吃? 高三语文小说赏析小说形象分析与答题技巧 人物形象题答题技巧 借助什么分析小说的人物形象 脖子旁边疼是什么原因 在群里不是好友怎么把群里人建另一个群 一直担心手机有病毒,哪些软件可以对手机对手机进行全面扫描,且扫描的安全到位? 华为nova75G原装充电器正品多少钱? 让自己开心的方法有哪些 让自己开心的方法有哪些? 有什么办法可以让自己开心起来?? 让自己开心的方法有几种? novel6se和novel6充电器一样吗? 十个让自己开心方法 让自己开心的方法有哪些?! 怎么让自己开心起来,不要经常想一些难受的事情? 有哪些让自己开心的方式?怎样学会“共情”? 粮食类哪种蛋白质含量最高 华为电脑死机了怎么办 也不能关机了 体虚赢瘦的人,有没有办法补身体? 《饥荒》新手必备实用技巧大全 详解怎么玩 时至今日,比特币价格还有上升空间吗? 饥荒试金石怎么找 求解这是什么(饥荒新手) 战胜疫情,来个大菜庆祝一下,甲鱼牛鞭炖鸡公蛋,补好身体开工! 饥荒海难猪人房怎么拆 有什么软件可以扫描附近的手机 触动touch恶灵摩托怎样在形象卡里显示出来? touch恶灵骑士套装怎么得? 恶灵骑士中恶灵骑的摩托车是什么牌子的? 乐高漫威超级英雄的恶灵骑士摩托车怎么弄 工装全包多少钱一平方 全包装修主要包含哪些 touch仙灵萌兔是有了套装后就有坐骑了吗? 最简单的工装要多少钱一个平方 恶灵骑士里的摩托到底是什么型号? 灵魂战车2恶灵骑士的摩托为什么不能变形?而在第一部的摩托却能变形。 设计费一般多少钱一平方? 谁知道恶灵骑士的摩托车是什么牌子和型号? 恶灵骑士里的摩托车是什么品牌什么型号的 西安工装公司哪家好?西安工装价格多少钱一平? GTA5恶灵骑士mod按哪个键召唤地狱摩托? 灵魂战车2男主角骑得摩托车是什么牌子什么型号? 水电工装多少钱一平米 复仇者联盟 英雄集结的时候 绿巨人骑的一个破烂的摩托车来的 那摩托车是什么牌子哪个型号的 怎么在excel表格中怎么镶入图片 推荐经典的漫画吧