格言:好记性不如烂笔头
最近用到mybatis 批量插入和查询操作,现在把配置文件批量操作部分记录如下,为了日后查阅;
<select id="selectByIds" parameterType="long"
resultMap="TrackingMessageinfoDOResultMap">
select
<include refid="MybatisTrackingMessageinfoDAO_all_column_fields"></include>
from tracking_messageinfo
where id in
<foreach collection="list" item="tmiDOId" index="index" open="("
close=")" separator=",">
#{tmiDOId}
</foreach>
</select>
<insert id="insertBatch" parameterType="java.util.List"
useGeneratedKeys="true">
insert into tracking_messageinfo(
logEvent,resolution,operatorSystem,browser,colorDepth,flashVersion,javaEnabled,device,localIp,trackerCode,categroy,theme,userId,ip,region,sessionId,trackTime,guid,referrer,url,cookieId
)
values
<foreach collection="list" item="tmiDO" index="index"
separator=",">
(
#{tmiDO.logEvent},#{tmiDO.resolution},
#{tmiDO.operatorSystem},#{tmiDO.browser},#{tmiDO.colorDepth},
#{tmiDO.flashVersion},#{tmiDO.javaEnabled},#{tmiDO.device},
#{tmiDO.localIp},#{tmiDO.trackerCode},#{tmiDO.categroy},#{tmiDO.theme},
#{tmiDO.userId},#{tmiDO.ip},#{tmiDO.region},#{tmiDO.sessionId},#{tmiDO.trackTime},
#{tmiDO.guid},#{tmiDO.referrer},#{tmiDO.url},#{tmiDO.cookieId}
)
</foreach>
</insert>
<!-- select标签和 insert标签批量插入的区别 :useGeneratedKeys="true" -->
<!-- <select id="insertBatch" parameterType="java.util.List">
insert into
tracking_messageinfo(
logEvent,resolution,operatorSystem,browser,colorDepth,flashVersion,javaEnabled,device,localIp,trackerCode,categroy,theme,userId,ip,region,sessionId,trackTime,guid,referrer,url,cookieId
) values
<foreach collection="list" item="tmiDO" index="index"
separator=",">
( #{tmiDO.logEvent},#{tmiDO.resolution},
#{tmiDO.operatorSystem},#{tmiDO.browser},#{tmiDO.colorDepth},
#{tmiDO.flashVersion},#{tmiDO.javaEnabled},#{tmiDO.device},
#{tmiDO.localIp},#{tmiDO.trackerCode},#{tmiDO.categroy},#{tmiDO.theme},
#{tmiDO.userId},#{tmiDO.ip},#{tmiDO.region},#{tmiDO.sessionId},#{tmiDO.trackTime},
#{tmiDO.guid},#{tmiDO.referrer},#{tmiDO.url},#{tmiDO.cookieId} )
</foreach>
</select> -->
<insert id="insertBatch1" parameterType="com.meitun.tracking.domain.TrackingMessageinfoDO"
useGeneratedKeys="true">
insert into tracking_messageinfo(
logEvent,resolution,operatorSystem,browser,colorDepth,flashVersion,javaEnabled,device,localIp,trackerCode,categroy,theme,userId,ip,region,sessionId,trackTime,guid,referrer,url,cookieId
)values
<foreach collection="list" item="tmiDO" index="index"
separator=",">
(
<include refid="MybatisTrackingMessageinfoDAO_parameter_fields"></include>
<!-- 不用 <![CTATA[<include refid="MybatisTrackingMessageinfoDAO_parameter_fields"></include>]]> 也可以
#{tmiDO.logEvent},#{tmiDO.resolution},
#{tmiDO.operatorSystem},#{tmiDO.browser},#{tmiDO.colorDepth},
#{tmiDO.flashVersion},#{tmiDO.javaEnabled},#{tmiDO.device},
#{tmiDO.localIp},#{tmiDO.trackerCode},#{tmiDO.categroy},#{tmiDO.theme},
#{tmiDO.userId},#{tmiDO.ip},#{tmiDO.region},#{tmiDO.sessionId},#{tmiDO.trackTime},
#{tmiDO.guid},#{tmiDO.referrer},#{tmiDO.url},#{tmiDO.cookieId} -->
)
</foreach>
</insert>
以上的每个方法,包括注释掉了的方法都可以正常运行(去掉注释后),只是为了学习,留待以后查阅才这么写。
另外,引入网上找的一篇博客的文章:
http://quinnhe.iteye.com/blog/2068314
要做批量插入数据库,首先得知道该数据库对批量插入所支持的语法。每个数据库批量插入的语法都不一样,我介绍两种。
MySQL:1、INSERT INTO TABLE_NAME(ID,NAME)VALUES(1,'张三'),(2,'李四')
2、INSERT INTO TABLE_NAME(ID,NAME)VALUES(1,'张三');INSERT INTO TABLE_NAME(ID,NAME)VALUES(2,'李四')
Oracle:1、INSERT INTO TABLE_NAME (ID,NAME) (SELECT 1,'张三' from dual) union all (SELECT 2,'李四' from dual)
2、INSERT INTO TABLE_NAME (ID,NAME) VALUES(1,'张三');INSERT INTO TABLE_NAME(ID,NAME)VALUES(2,'李四')
4条SQL都是数据库支持的写法。两者的第二种是不推荐的写法,因为不管效率还是可读性上都远差于第一种
当然,还有更重要的一点,Mybatis不支持第二种写法,因为mybatis的一个事务只支持一条SQL
所以,Mybatis里写法只能取两者的第一种,代码如下
MySQL
<select id="batchSave" parameterType="java.util.List"> INSERT INTO TABLE_NAME(ID,NAME) VALUES <foreach collection="list" item="itm" separator=","> (#{itm.id},#{itm.name}) </foreach> </select>
ORACLE:
<select id="batchSave" parameterType="java.util.List"> INSERT INTO TABLE_NAME(ID,NAME) <foreach collection="list" item="itm" separator="union all"> (SELECT #{itm.id},#{itm.name} FROM DUAL) </foreach> </select>
注意事项: 这里要注意了,标签一定得是<SELECT>,不能是<INSERT>或者<UPDATE>,否则就要报错。。
引文结束。
对于上面引文中的主意事项,我用的是mysql数据库,经过验证<select> 和<insert> 标签都可以完成批量插入操作,批量更新没有试验过,想来也是一样的。
还有,经别人验证,oracle数据库必须是<select>标签,否则报错。
这个问题留待以后再研究。