`
hekuilove
  • 浏览: 156320 次
  • 性别: Icon_minigender_1
  • 来自: 魔都
社区版块
存档分类
最新评论

Mybatis批量插入Oracle、MySQL

 
阅读更多


要做批量插入数据库,首先得知道该数据库对批量插入所支持的语法。每个数据库批量插入的语法都不一样,我介绍两种。

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>,否则就要报错。。
不要问哥为什么会报错,哥也不知道,哈哈哈哈哈啊哈哈哈。。。(太懒,不想去查资料了,有兴趣的可以去查下)
1
0
分享到:
评论
1 楼 weijs 2014-05-20  
你提到的两个第一种在sql server下都有问题,MYSQL的是写法SQL SERVER不支持,ORACLE那个写法,如果一次拼接的串太长会报错
附我自己在工作的写法及测试结果:
<insert id="xxxx" parameterType="java.util.List" > 
<!-- 注意 insert into uc_user_relationship_t values 不要写在循环里,其次 #{ur.username} 的方式,其中ur 是item的值 -->
        <!-- 上边的注释在使用mysql时有效 -->
        <!-- 插入前检查没有有效的关系记录才允许添加好友  -->
        <foreach collection="list" index="index" item="ur" separator=";">
        if not exists (select 1 from tableName where xxxxx)
        insert into xxxx (xxxx) values
            (#{ur.userName}, #{ur.friendName}...)
    </foreach> 
    </insert>
   
同一台服务器(公司开发机I3+4G内存),先测试SIMPLE,然后重启应用测试BATCH,在插入前后分别记录时间来计算时间差,LOG4J中将级别调为ERROR

时间单位:毫秒

8000条  <setting name="defaultExecutorType" value="SIMPLE" />

6563
4281
3984
3828
3890
3828
3813
3750
3890
4157

8000条  <setting name="defaultExecutorType" value="BATCH" />
781
547
547
516
453
531
421
485
437
406

相关推荐

Global site tag (gtag.js) - Google Analytics