粤嵌打卡第60天(Mybatis高级进阶部分之--------批处理)

今日学习

Mybatis实现批量操作的三种方式

  • 基于SqlSession的ExecutorType进行批量操作(一次可以操作大量数据,常用)
  • 基于Mysql方式一:借助foreach标签使用 insert into table values()方式批量操作(一次添加少量数据,比方式二效率高,常用)
  • 基于Mysql方式二:借助Mysql数据库连接属性allowMultiQueries=true的方式批量操作(效率低下,不常用)

1、基于SqlSession的ExecutorType进行批量操作

dao层关键代码示例:

PersonMapper.java
public int addPerson(User user);


映射映射层关键代码示例:

PersonMapper.xml
 <insert id="addPerson" parameterType="person">
    insert into person(username,email,gender) VALUES (#{username},#{email},#{gender})
  </insert>


测试层关键代码示例:

public void testBatchForExecutor()
    {
        /*
        创建sqlSession对象
        批处理操作:使用SqlSession里 ExecutorType的BATCH方法
        */
        SqlSession sqlSession = this.getSqlSessionFactory().openSession(ExecutorType.BATCH);

        PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class);
        //添加10000条记录
        for (int i = 0; i <10000 ; i++)
        {
            personMapper.addPerson(new User("jerry","bj"));
        }

        sqlSession.commit();

        sqlSession.close();
    }

2、 基于Mysql方式一:借助foreach标签使用 insert into table values()方式批量操作(一次添加少量数据,比方式二效率高,常用)

dao层关键代码示例:

PersonMapper.java
//@Param 给集合起别名
public int addPersons(@Param("persons") List<Person> persons);


映射配置层代码示例(以逗号分隔的方式,效率高):

  <insert id="addPersons">
    insert into person(username,email,gender) VALUES
    <foreach collection="persons" item="person" separator=",">
      (#{person.username},#{person.email},#{person.gender})
    </foreach>
  </insert>

测试代码示例:

    public void processMybatisBatch()
    {
        SqlSession sqlSession = this.getSqlSessionFactory().openSession();
        PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class);

        List<Person> persons=new ArrayList<Person>();

        for (int i = 0; i <1000 ; i++)
        {
            Person person=new Person("jerry"+i,"email@"+i,"f");
            persons.add(person);
        }
     personMapper.addPersons(persons);
        sqlSession.commit();
    }

3、基于Mysql方式二:借助Mysql数据库连接属性allowMultiQueries=true的方式批量操作(效率低下,不常用)

方式二是基于MySql的特性操作的(将设置allowMultiQueries=true的连接属性才能使用此属性,否则无法使用)

jdbc.url=jdbc:mysql://localhost:3306/mybatis?allowMultiQueries=true

dao层示例代码与方式一一致

映射配置层代码示例(以分号结尾,效率低):

 <insert id="addPersons">
   <foreach collection="persons" item="person" separator=";">
      insert into person(username,email,gender) VALUES
     (#{person.username},#{person.email},#{person.gender})
    </foreach>
 </insert>

测试代码与方式一一致:


敲黑板
Mybatis实现批处理操作一般使用基于SqlSession的ExecutorType进行批量操作(一次可以操作大量数据,常用)
基于Mysql的方式一比方式二效率高
基于Mysql方式二在使用时,必须在配置文件的url后设置属性值allowMultiQueries=true,方可使用。


写在最后

推荐自己的Github地址:https://github.com/Lmobject

您的关注与点赞是对作者最大的支持与鼓励。谢谢!!!

下一篇博客:基于Mybatis底层JDBC实现的批处理操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值