ibatis框架提供的动态SQL功能详解

ibatis框架的<dynamic>标签用来动态生成SQL,一般在SQL语句的查询条件和更新部分结合<isNotEmpty>,<isEmpty>,<isNotEqual>标签使用。

update t_consumer
		<dynamic prepend="SET ">
			<isNotEmpty property="isNew" prepend=","> focus_number = focus_number + 1
			</isNotEmpty>
			<isNotEmpty property="supportValue" prepend=","> support_value = support_value + #supportValue#
			</isNotEmpty>
		</dynamic>
		where id = #id#

注意点:1. prepend是添加在动态语句的前面

               , 添加在"focus_number = focus_number+1"前面

               2. dynamic中首个prepend被忽略

               按照注意点1说法,语句update t_consumer set ,focus_number=focus_number+1就会出现问题了。其实若  <isNotEmpty>写在<dynamic>里,且包含prepend,第一个isNotEmpty的prepend会被忽略

 

ibatis框架的<include>标签可以引用Mapper.xml已定义的SQL模块, 提升抽象性, 避免重复内容

<sql id="selectItem_fragment">
   id,itemId,userId
</sql>

<select id="selectItemList">
  select <include refid="selectItem_fragment"/> where itemId=2
</select>

 

ibatis框架的<iterate>标签用来批量执行语句。在批量查询和批量插入等场景中使用

<iterate property="",conjunction="",open="",close="",prepend=""/>
属性名描述
property访问的属性名,必须是List类型
conjunction循环结束后添加的符号
open 循环的开始符号
close循环的结束符号
prepend 加在open指定的符号之前的符号

ibatis iterate标签使用示例

1.批量查询

< select  id ="iterate_query"  parameterClass ="java.util.List" >   
    <![CDATA[  
        selelct * from t_video_activity where id=1 
    ]]>   
    < iterate  prepend ="prepend"  conjunction ="conn"  open ="open"  colse ="close" >   
        <![CDATA[  
            #v[]#  
        ]]>
    </ iterate >   
</ select >

假设传入的List类型参数v,内容为[1,2,3]。如上的配置将生成以下SQL语句:

selelct * from t_video_activity where id=1 prepend  open 1 conn 2 conn 3 close

2.批量插入

A.不使用open/close属性

< insert  id ="iterate_insert1"  parameterClass ="java.util.List" >   
    <![CDATA[  
        insert into t_video_activity(col1, col2, col3) values  
    ]]>    
    < iterate  conjunction ="," >   
        <![CDATA[  
            (#list[].col1 #, # list[].col2 #, # list[].col3#)  
        ]]>   
    </ iterate >   
</ insert > 

上面的配置将得到一个sql语句:

insert  into t_video_activity( col1, col2, col3 ) values  (?, ?, ?) , (?, ?, ?) , (?, ?, ?)

B.使用open/close属性

< insert  id="iterate_insert2"  parameterClass ="java.util.List" >    
   <![CDATA[  
        insert into t_video_activity(col1,col2,col3) values  
    ]]> 
    < iterate  conjunction =","  open ="("  close =")" >   
        <![CDATA[  
              #test[].col1#, # test[].col2#, # test[].col3#
        ]]>   
    </ iterate >   
</ insert > 

上面的配置将得到一个sql语句:

insert  into t_video_activity( col1, col2, col3 ) values  (?, ?, ?, ?, ?, ?,?, ?, ?)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值