今日学习
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实现的批处理操作