MyBatis的几种批量操作

MyBatis中批量插入

方法一:

<insert id="insertbatch" parameterType="java.util.List">
    <selectKey keyProperty="fetchTime" order="BEFORE" resultType="java.lang.String">
        SELECT CURRENT_TIMESTAMP()
    </selectKey>
    insert into kangaiduoyaodian ( depart1, depart2, product_name,
    generic_name, img, product_specification, unit,
    approval_certificate, manufacturer, marketPrice, vipPrice,
    website, fetch_time, productdesc ) values
    <foreach collection="list" item="item" index="index" separator=",">
        ( #{item.depart1}, #{item.depart2}, #{item.productName},
        #{item.genericName}, #{item.img},
        #{item.productSpecification}, #{item.unit},
        #{item.approvalCertificate}, #{item.manufacturer},
        #{item.marketprice}, #{item.vipprice}, #{item.website},
        #{fetchTime}, #{item.productdesc} )
    </foreach>
</insert>

方法二:

<insert id="batchInsertB2B" parameterType="ArrayList">
    insert into
    xxxxtable(hkgs,hkgsjsda,office,asdf,ddd,ffff,supfullName,classtype,agent_type,remark)
    <foreach collection="list" item="item" index="index" separator="union all">
        select #{item.hkgs,jdbcType=VARCHAR},
        #{item.hkgsjsda,jdbcType=VARCHAR},
        #{item.office,jdbcType=VARCHAR},
        #{item.asdf,jdbcType=VARCHAR},
        #{item.ddd,jdbcType=VARCHAR},
        #{item.ffff,jdbcType=VARCHAR},
        #{item.supfullName,jdbcType=VARCHAR},0,0,
        #{item.remark,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)后面部分

MyBatis中批量删除

<!-- 通过主键集合批量删除记录 -->
<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>

MyBatis中in子句

mybatis 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="selectProduct" resultMap="Map">

    SELECT * FROM PRODUCT WHERE PRODUCTNO IN
    <foreach item="productNo" index="index" collection="map中集合参数的名称">
        #{productNo}
    </foreach>
</select>

MyBatis批量修改

<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的关于批量数据操作的体会!

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">
    <!-- WARNING - @mbggenerated This element is automatically generated by
        3 MyBatis Generator, do not modify. This element was generated on Mon May
        09 4 11:09:37 CST 2011. -->
    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>

我不清楚原因在哪里,就配置了MyBatis的log4j,想查看下日志。下载了 log4j.jar 和 commons-logging.jar 并配置到项目的类路径,然后在代码路径下新建文件log4j.properties,内容如下:

log4j.rootLogger=DEBUG, stdout

# SqlMap logging configuration...
log4j.logger.com.ibatis=DEBUG
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.cache.CacheModel=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientImpl=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.builder.xml.SqlMapParser=DEBUG
log4j.logger.com.ibatis.common.util.StopWatch=DEBUG
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG

# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

然后再次测试普通的sqlSession,发现日志内容中虽然插入了1000条数据,但只新建了一次连接,最后又关闭了该连接(日志如下)。也就是说MyBatis中的普通sqlSession好像已经对批量插入默认是一次连接中完成,那么还提供ExecutorType.BATCH方式干什么,况且该方式好像效率也不行,或者是我使用ExecutorType.BATCH方式不对??

DEBUG [main] - Created connection 3502256.
DEBUG [main] - ooo Connection Opened
DEBUG [main] - ==> Executing: insert into student ( name, sex, address, telephone, t_id ) values ( ?, ?, ?, ?, ? )
DEBUG [main] - ==> Parameters: 新人0(String), male(String), addr0(String), dd(String),3(Integer)
DEBUG [main] - ==> Executing: insert into student ( name, sex, address, telephone, t_id ) values ( ?, ?, ?, ?, ? )
DEBUG [main] - ==> Parameters: 新人1(String), male(String),
...............
...............
DEBUG [main] - xxx Connection Closed
DEBUG [main] - Returned connection 3502256 to pool.

最后一点是关于数据库批量插入时sql语句级的优化,我特意测试了两种方式,在StudentMapper中配置了两种insert模式。第一种对应insert value1,insert value2,,,,;第二种对应insert values (value1, value2,....)。发现后者果然比前者快很多啊。下面是两种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>
<!-- 批量 ,传入一个长度为1000的list -->
<insert id="insertBatch">
    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>

本文转自:http://topmanopensource.iteye.com/blog/1833001

时间: 2024-12-18 03:19:25

MyBatis的几种批量操作的相关文章

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

转自:http://blog.csdn.net/starywx/article/details/23268465 前段时间由于项目赶期没顾上开发过程中的性能问题,现对部分代码进行优化的过程中发现在数据量大的情况下对数据的操作反应似乎有些慢,就想到对数据库DML操作的时候进行批量操作.说道这里也想到自己在一次面试的时候别问道过批量操作数据的问题. 现对运用说明记录如下: 批量插入insert 方法一: <insert id="insertbatch" parameterType=&

Spring之ORM(spring 与mybatis的三种整合实例)

我们知道spring没有提供orm框架但是,提供了很好的和orm框架这个的代沟,我们可以和流行的orm框架进行整合,本文主要介绍Spring与Mybatis三种常用整合方法,需要的整合架包是mybatis-spring.jar,可以通过连接下载http://download.csdn.net/detail/qh_java/8431455 :  1.采用数据映射器(MapperFactoryBean)的方式,不用写mybatis映射文件,采用注解方式提供相应的sql语句和输入参数. (1).Spr

MyBatis学习总结_10_批量操作

一.mybatis中的批量操作    批量操作核心就是一次传入多个数据然后进行相关操作,增删改查中掌握其中一个其他的也不成问题 1.最新在做的短信平台,要批量插入群发的短信记录: 当然批量操作还有:批量删除,更新,插入,更新. 批量删除: <delete id= "deleteBatchByXXX" parameterType= "list"> delete from 表名 where groupon_id in <foreach collecti

关于MyBatis的两种写法

刚接触MyBatis是在Jike的视频中学习的,但是之后又发现和项目中的MyBatis的用法不太一致.上网找了好多资料,发现网上的教程分为两种写法: 第一种,是jike视频中的写法,写好map.xml文件之后,在MyBatis基本配置文件指定好这个map文件的位置后就直接 User user = (User) session.selectOne("selectUser", "3"); 第二种就是 mapper接口式,叫做面向接口编程. 先定义一个UserMapper

Mybatis逆向工程之三种实现方法

1.逆向工程之原始方法 (1)下载两个jar包:mysql-connector-java(6.x版本及以上的和5.x版本有所区别,主要是驱动和时区:详情参见:https://blog.csdn.net/csugonghang/article/details/79435033).mybatis-generator-core (2)创建generatorConfig.xml文件,以下是样例: <?xml version="1.0" encoding="UTF-8"

Mybatis中三种关联关系的实现

三种关联关系:一对多,一对一,多对多 两种查询方式:嵌套查询,连接查询(也可称作:多表单独查询,多表连接查询) 每一种关联关系都可以通过嵌套查询和连接查询来实现. 嵌套查询相当于进行了两次查询,而连接查询将两张表连接然后再进行查询,这样只进行了一次查询 由于数据表要对实体类进行映射,所以每一种关联关系中都需要在java类中定义属性来进行关联,可以通过如图关联: 一对一查询 数据表实现:通过A表的主键引用B表的主键作为外键,就是说在A中主键和外键同一字段. 查询方式:嵌套查询,连接查询: 关系:丈

课时2:Spring整合MyBatis的几种方式 前面一个课时已经讲了一种思路了

.1)第二种方式 :就是省略掉第一种方式的实现类 1. 在在第一种方式的基础上改造 1.2 dao的实现类可以删除了 1.3 改造spring配置文件 <bean id="studentDao" class="org.mybatis.spring.mapper.MapperFactoryBean"> <property name="mapperInterface" value="net.bdqn.hbz.dao.ISt

springmvc+mybatis的两种配置和应用方式

一.不用写dao层实现的方式 1.导入依赖包,我的pom.xml文件配置如下: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/

mybatis的两种Dao开发方式

使用MyBatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper动态代理开发方法 原始Dao 使用MyBatis开发DAO实现以下的功能:根据用户id查询一个用户信息 SqlSession中封装了对数据库的操作,如:查询.插入.更新.删除等. 通过SqlSessionFactory创建SqlSession,而SqlSessionFactory是通过SqlSessionFactoryBuilder进行创建. SqlSessionFactoryBuilder用于创建SqlSessio