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 (?, ?, ?, ?, ?, ?,?, ?, ?)