Mybatis高级进阶部分之--------批处理

6,503 阅读1分钟

今日学习

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地址:github.com/Lmobject

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

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