ibatis 搭配oracle做批量插入小结
2012-12-12 08:52
405 查看
比如,经常遇到的情况是,要把表A中的符合条件的数据全部取出来,形成一个结果集,
然后针对结果集中的每一条数据,循环插入到数据表B中去,除了传统的在JAVA代码中
FOR循环来做外,在ibatis 2中,还增加了iterate标签,可以用来生成循环要执行的语句,介绍如下:
<iterate
property="" /*可选,
从传入的参数集合中使用属性名去获取值,
这个必须是一个List类型,
否则会出现OutofRangeException,
通常是参数使用java.util.Map时才使用,
如果传入的参数本身是一个java.util.List, 不能只用这个属性.
conjunction="" /*可选,
iterate可以看作是一个循环,
这个属性指定每一次循环结束后添加的符号,
比如使每次循环是OR的, 则设置这个属性为OR*/
open="" /*可选, 循环的开始符号*/
close="" /*可选, 循环的结束符号*/
prepend="" /*可选, 加在open指定的符号之前的符号*/
>
</iterate>
例子:
<iterate prepend=”AND” property=”userNameList” open=”(”
close=”)” conjunction=”OR”>
username=#userNameList[]#
</iterate>
这个时候,会生成如下形式的语句:
(username=xxx1 or username=xxx2 or username=xxx3)
因为open,close中指定了括号,conjunction则指定了分割是用or,
又如:
id in
<iterate prepend="" property="ids"
open="(" close=")" conjunction="," >
#ids[]#
</iterate>
生成为:
id in (xx1,xx2,xx3,.....),
注意:使用<iterate>时,在List元素名后面包括方括号[]非常重要,方括号[]将对象标记为List,
以防解析器简单地将List输出成String。
再来看几个例子:
1) 删除的:
<delete id="delete">
delete from t_table where key in
<iterate property="keys" conjunction="," open="(" close=")">
#keys[]#
</iterate>
</delete>
2 ) update:
如果传用的参数是自己定义的类,如:
<update id="sqlMap" parameterClass="example.test">
UPDATE TBL_COMPANY
SET ADDRESS = #address#
WHERE COMPANY_ID IN
<iterate conjunction="," open="(" close=")" property="companyIds" >
#companyIds[]#
</iterate>
</update>
生成Sql语句: UPDATE TBL_COMPANY SET ADDRESS='address' WHERE COMPANY_ID IN ( 45, 50, 70)
其中:companyIds是example.test类中的list属性。
3) 批量插入,oracle中可以用insert all into,比如:
<insert id="insertintoragroupra" parameterClass="map">
insert all
<iterate conjunction=" " property="ragrouppreinsert">
into GROUP_ASSETRA
(RISKID, GROUPID,GROUPNAME,AV,RALISTID)
values
(
F_GETSEQ(),#ragrouppreinsert[].groupId#,#ragrouppreinsert[].groupname#,#ragrouppreinsert[].av#,
#ralistId#
)
</iterate>
select * from dual
</insert>
注意:比如这里parameterClass="map"中,表明传入的是一个MAP,这个MAP中
可以包含内容很丰富的东西了,比如:
map.put("ragrouppreinsert",list) //这里ragrouppreinsert"存放的是一个LIST结果集了
map.put("ralistId",ralistId)
//这里另外设置一个要批量增加到group_assetra表中的数据
注意在上面的语句中,因为要将结果集合list中的每一条记录对应的字段插入到
GROUP_ASSETRA中,所以要使用#ragrouppreinsert[].groupId#的写法,
而把map中的ralistId插进去,则只需要#ralistId#就可以了,这样其实就是
插入到group_assetra表中的每一个ralistid字段都是相同的值了
F_GETSEQ()是一个函数,获得GROUP_ASSETRA表中的每次的序列,
具体其中遇到的问题,参考不错的一篇讲oracle insert all into的文:
http://yangtingkun.itpub.net/post/468/188133
<!-- 批量添加消息 -->
<insert id="addMessageBatch" parameterClass="java.util.Map">
Insert into messages
<iterate property="statusList" conjunction=" UNION ALL ">
SELECT (SELECT rawtohex(sys_guid()) AS messageId FROM DUAL),#statusList[]#,0,0,#link#,#title#,#content#,#createDate# from dual
</iterate>
</insert>
然后针对结果集中的每一条数据,循环插入到数据表B中去,除了传统的在JAVA代码中
FOR循环来做外,在ibatis 2中,还增加了iterate标签,可以用来生成循环要执行的语句,介绍如下:
<iterate
property="" /*可选,
从传入的参数集合中使用属性名去获取值,
这个必须是一个List类型,
否则会出现OutofRangeException,
通常是参数使用java.util.Map时才使用,
如果传入的参数本身是一个java.util.List, 不能只用这个属性.
conjunction="" /*可选,
iterate可以看作是一个循环,
这个属性指定每一次循环结束后添加的符号,
比如使每次循环是OR的, 则设置这个属性为OR*/
open="" /*可选, 循环的开始符号*/
close="" /*可选, 循环的结束符号*/
prepend="" /*可选, 加在open指定的符号之前的符号*/
>
</iterate>
例子:
<iterate prepend=”AND” property=”userNameList” open=”(”
close=”)” conjunction=”OR”>
username=#userNameList[]#
</iterate>
这个时候,会生成如下形式的语句:
(username=xxx1 or username=xxx2 or username=xxx3)
因为open,close中指定了括号,conjunction则指定了分割是用or,
又如:
id in
<iterate prepend="" property="ids"
open="(" close=")" conjunction="," >
#ids[]#
</iterate>
生成为:
id in (xx1,xx2,xx3,.....),
注意:使用<iterate>时,在List元素名后面包括方括号[]非常重要,方括号[]将对象标记为List,
以防解析器简单地将List输出成String。
再来看几个例子:
1) 删除的:
<delete id="delete">
delete from t_table where key in
<iterate property="keys" conjunction="," open="(" close=")">
#keys[]#
</iterate>
</delete>
2 ) update:
如果传用的参数是自己定义的类,如:
<update id="sqlMap" parameterClass="example.test">
UPDATE TBL_COMPANY
SET ADDRESS = #address#
WHERE COMPANY_ID IN
<iterate conjunction="," open="(" close=")" property="companyIds" >
#companyIds[]#
</iterate>
</update>
生成Sql语句: UPDATE TBL_COMPANY SET ADDRESS='address' WHERE COMPANY_ID IN ( 45, 50, 70)
其中:companyIds是example.test类中的list属性。
3) 批量插入,oracle中可以用insert all into,比如:
<insert id="insertintoragroupra" parameterClass="map">
insert all
<iterate conjunction=" " property="ragrouppreinsert">
into GROUP_ASSETRA
(RISKID, GROUPID,GROUPNAME,AV,RALISTID)
values
(
F_GETSEQ(),#ragrouppreinsert[].groupId#,#ragrouppreinsert[].groupname#,#ragrouppreinsert[].av#,
#ralistId#
)
</iterate>
select * from dual
</insert>
注意:比如这里parameterClass="map"中,表明传入的是一个MAP,这个MAP中
可以包含内容很丰富的东西了,比如:
map.put("ragrouppreinsert",list) //这里ragrouppreinsert"存放的是一个LIST结果集了
map.put("ralistId",ralistId)
//这里另外设置一个要批量增加到group_assetra表中的数据
注意在上面的语句中,因为要将结果集合list中的每一条记录对应的字段插入到
GROUP_ASSETRA中,所以要使用#ragrouppreinsert[].groupId#的写法,
而把map中的ralistId插进去,则只需要#ralistId#就可以了,这样其实就是
插入到group_assetra表中的每一个ralistid字段都是相同的值了
F_GETSEQ()是一个函数,获得GROUP_ASSETRA表中的每次的序列,
具体其中遇到的问题,参考不错的一篇讲oracle insert all into的文:
http://yangtingkun.itpub.net/post/468/188133
<!-- 批量添加消息 -->
<insert id="addMessageBatch" parameterClass="java.util.Map">
Insert into messages
<iterate property="statusList" conjunction=" UNION ALL ">
SELECT (SELECT rawtohex(sys_guid()) AS messageId FROM DUAL),#statusList[]#,0,0,#link#,#title#,#content#,#createDate# from dual
</iterate>
</insert>
相关文章推荐
- 点评 ibatis+oracle 批量插入的三种方法.
- ibatis 批量插入[类对象]到 oracle 数据库
- 点评 ibatis+oracle 批量插入的三种方法.
- ibatis 批量插入[类对象]到 oracle 数据库
- 点评 ibatis+oracle 批量插入的三种方法
- Mybatis的批量插入(oracle、MySQL)
- 利用Ibatis执行批量插入更新数据库操作
- Java Web编程入门--Mybatis+Oracle批量插入
- ibatis批量插入-iterate标签应用
- oracle+mybatis 使用动态Sql当插入字段不确定的情况下实现批量insert
- oracle 执行sql文件脚本,批量插入或批量更新
- ibatis批量插入
- ibatis批量插入 批量删除 -iterate标签应用
- Oracle 批量插入数据
- 【JAVA】oracle批量插入数据操作
- Mybatis 批量插入带oracle序列例子+ORA-02287: 此处不允许序号
- ibatis 在oracle中不重复插入
- oracle 批量插入和批量更新
- Oracle批量插入测试数据
- Java批量插入Oracle语句执行过程。