数据库--MyBatis的(insert,update,delete)三种批量操作

转自:http://blog.csdn.net/starywx/article/details/23268465

前段时间由于项目赶期没顾上开发过程中的性能问题,现对部分代码进行优化的过程中发现在数据量大的情况下对数据的操作反应似乎有些慢,就想到对数据库DML操作的时候进行批量操作。说道这里也想到自己在一次面试的时候别问道过批量操作数据的问题。
现对运用说明记录如下:
批量插入insert
方法一:
<insert id="insertbatch" parameterType="java.util.List">
  <selectKey keyProperty="id" order="AFTER"
  resultType="int">
  SELECT LAST_INSERT_ID()
  </selectKey>
   INSERT INTO  sourcedoc (
sdate, sweek,
      roomno, daysched, nightsched,
      adminsched, vacationsched, programdept,
      programname
)values
<foreach collection="list" item="item" index="index" separator=",">
(
#{item.sdate},#{item.sweek},#{item.roomno},
#{item.daysched},#{item.nightsched},#{item.adminsched},
#{item.vacationsched},#{item.programdept},#{item.programname}
        )
</foreach>
</insert>

方法二:
<insert id="batchInsert" parameterType="ArrayList">
insert into table1(sdate,sweek,roomno,daysched,nightsched,adminsched,vacationsched,programdept,programname)
<foreach collection="list" item="item" index="index" separator="union all">
select #{item.sdate,jdbcType=VARCHAR},
#{item.sweek,jdbcType=VARCHAR},
#{item.roomno,jdbcType=VARCHAR},
#{item.nightsched,jdbcType=VARCHAR},
#{item.adminsched,jdbcType=VARCHAR},
#{item.vacationsched,jdbcType=VARCHAR},
#{item.programdept,jdbcType=VARCHAR},0,0,
#{item.programname,jdbcType=VARCHAR} from dual
</foreach>
</insert>

可以考虑用union all来实现批量插入。
例如:
insert into XX_TABLE(XX,XX,XX)select ‘xx‘,‘xx‘,‘xx‘ union all select ‘xx‘,‘xx‘,‘xx‘ union all select ‘xx‘,‘xx‘,‘xx‘ ...
先拼装好语句再动态传入insert into XX_TABLE(XX,XX,XX)后面部分
 
批量删除(delete)
<!-- 通过主键集合批量删除记录 -->
<delete id="batchRemoveUserByPks" parameterType="java.util.List">
DELETE FROM LD_USER WHERE ID in
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
#{item}
</foreach>
</delete>
 
批量修改(update)
 <update id="updateOrders" parameterType="java.util.List">
 update orders set state = ‘0‘ where no in
 <foreach collection="list" item="nos" open="(" separator="," close=")">
  #{nos}
 </foreach>
 </update>
 
MyBatis中in子句  in 参数 使用方法
1.只有一个参数
参数的类型要声明为List或Array
Sql配置如下:
<select id="selectProduct" resultMap="Map">
SELECT * FROM PRODUCT
WHERE PRODUCTNO IN
      <foreach item="productNo" index="index" collection="参数的类型List或array">
                   #{productNo}
     </foreach>
</select>
 
2.多个参数
首先要将多个参数写入同一个map,将map作为一个参数传入mapper
Sql配置如下:
<select id="selectSoucedoc" resultMap="Map">
SELECT *
FROM PRODUCT
WHERE PRODUCTNO IN
     <foreach item="id" index="index" collection="map中集合参数的名称">
            #{id}
    </foreach>
</select>

批量数据操作的体会
 MyBatis的前身就是著名的Ibatis,不知何故脱离了Apache改名为MyBatis。
 MyBatis所说是轻量级的ORM框架,在网上看过一个测试报告,感觉相比于Hibernate来说,优势并不明显。
下面说一下比较有趣的现象,根据MyBatis的官方文档,在获得sqlSession时,它有为批量更新而专门准备的:

session = sessionFactory.openSession();//用于普通update
session = sessionFactory.openSession(ExecutorType.BATCH, true);//用于批量update

 一般来说,对MYSQL数据库批量操作时速度取决于,是为每一个处理分别建立一个连接,还是为这一批处理一共建立一个连接。按MyBatis的手册说明,选择ExecutorType.BATCH意味着,获得的sqlSession会批量执行所有更新语句。不过我测试了一下,批量插入1000条数据,发觉ExecutorType.BATCH方式的效率居然比普通的方式差很多。我测试用的Mapper中的insert配置如下,再用for循环插入1000条记录:

<insert id="insert" parameterType="sdc.mybatis.test.Student">
insert into student (id, name, sex,
address, telephone, t_id
)
values (#{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR},
#{sex,jdbcType=VARCHAR},
#{address,jdbcType=VARCHAR}, #{telephone,jdbcType=VARCHAR}, #{tId,jdbcType=INTEGER}
)
</insert>

关于数据库批量插入时sql语句级的优化,我特意测试了两种方式,在StudentMapper中配置了两种insert模式。第一种对应insert value1,insert value2,,,,;第二种对应insert values (value1, value2,....)。发现后者果然比前者快很多啊。下面是两种insert模式,及测试结果对应图:

<!-- 批量 ,传入一个长度为1000的list -->
insert into student ( <include refid="Base_Column_List"/> )
values
<foreach collection="list" item="item" index="index" separator=",">
(null,#{item.name},#{item.sex},#{item.address},#{item.telephone},#{item.tId})
</foreach>
</insert>
<!-- 在外部for循环调用一千次 -->
<insert id="insert" parameterType="sdc.mybatis.test.Student">
insert into student (id, name, sex,
address, telephone, t_id
)
values (#{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR},
#{sex,jdbcType=VARCHAR},
#{address,jdbcType=VARCHAR}, #{telephone,jdbcType=VARCHAR}, #{tId,jdbcType=INTEGER}
)
</insert>

  

时间: 2024-07-30 18:14:33

数据库--MyBatis的(insert,update,delete)三种批量操作的相关文章

数据库编程3 Oracle 子查询 insert update delete 事务 回收站 字段操作 企业级项目案例

[本文谢绝转载原文来自http://990487026.blog.51cto.com] <大纲> 数据库编程3 Oracle 子查询 insert update delete 事务 回收站 字段操作 企业级项目案例 实验所用数据表 子查询,解决一步不能求解 查询工资比scott高的员工信息: 子查询知识体系搭建: 解释3,查询部门是sales的员工信息: 方法1:子查询 [方法2]:多表: 优化考虑: 解释4[select],只能放单行子查询 解释4[from] 考题:显示员工姓名,薪水 解释

mybatis insert update delete返回都是整型 0,1,增,删,改要提交事物

mybatis insert update delete返回都是整型 0,1, 没有扔 增,删,改要提交事物 原文地址:https://www.cnblogs.com/gzhbk/p/9499293.html

LINQ体验(9)——LINQ to SQL语句之Insert/Update/Delete操作

我们继续讲解LINQ to SQL语句,这篇我们来讨论Insert/Update/Delete操作.这个在我们的程序中最为常用了.我们直接看例子. Insert/Update/Delete操作 插入(Insert) 1.简单形式 说明:new一个对象,使用InsertOnSubmit方法将其加入到对应的集合中,使用SubmitChanges()提交到数据库. NorthwindDataContext db = new NorthwindDataContext(); var newCustomer

linux下mysql Insert update delete 事务 用户管理

linux下mysql Insert update delete  事务 用户管理 1.INSERT插入语句格式: INSERT INTO tb_name (字段1, 字段2, ...) VALUES (值1,值2, ...)[,(值1, 值2, ...),...]; INSERT INTO 表名 SET 字段1=值1,字段2=值2,...; INSERT INTO 表名 (字段1,字段2,...) SELECT (字段1,字段2,...) FROM 表名 [WHERE 条件]; 2.REPLA

元素类型为 &quot;mapper&quot; 的内容必须匹配 &quot;(cache-ref|cache|resultMap*|parameterMap*|sql*|insert*|update*|delete*|select)

在配置ssm框架的时候,写mapper映射文件的时候会出现 元素类型为 "mapper" 的内容必须匹配 "(cache-ref|cache|resultMap*|parameterMap*|sql*|insert*|update*|delete*|select) 有时候编译的时候会出现这个bug,是因为在前面写了注释.导致了执行顺序的问题.需要把一些注释删掉,就可以正常执行了. /*mapper动态开发*/ <mapper namespace="com.ss

mybatis 模糊查询 like的三种方式

第一种 public void selectBykeyWord(String keyword) { String id = "%" + keyword + "%"; String roleType = "%" + keyword + "%"; String roleName = "%" + keyword + "%"; userDao.selectBykeyWord(id,roleNam

Mybatis传多个参数(三种解决方案)

第一种方案 DAO层的函数方法 Public User selectUser(String name,String area); 对应的Mapper.xml <select id="selectUser" resultMap="BaseResultMap"> select * from user_user_t where user_name = #{0} and user_area=#{1} </select> 其中,#{0}代表接收的是da

mybatis 中 foreach collection的三种用法

转载:http://blog.sina.com.cn/s/blog_b0d90e8c0102v1q1.html 传参参考:http://www.cnblogs.com/ruiati/p/6410339.html foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合. foreach元素的属性主要有 item,index,collection,open,separator,close. item表示集合中每一个元素进行迭代时的别名,    index指 定一个名字,用于表示

mysql之insert,update,delete

测试数据 1.product表 CREATE table product( id INT(10) PRIMARY KEY NOT NULL, name VARCHAR(20) NOT NULL, function VARCHAR(50) DEFAULT NULL , company VARCHAR(20) NOT NULL, address VARCHAR(50) DEFAULT NULL ); 1.medicine表 CREATE table medicine( id INT(10) PRIM