MyBatis批量数据插入
一、MyBatis对于批量插入的支持
- 借助foreach标签使用insert into table values()
- 借助MySQL数据库连接属性allowMultiQueries=true
1.1 PersonMapper
public int addPersons(@Param("persons") List<Person> persons);
1.2 PersonMapper.xml
根据MySQL的insert语句规则结合foreach去写SQL语句,collection中的是person对象,person。XX便可以取得属性值
<insert id="addPersons">
insert into person(username,email,gender) VALUES
<foreach collection="persons" item="person" separator=",">
(#{person.username},#{person.email},#{person.gender})
</foreach>
</insert>
<!--或者以下-->
<insert id="addPersons">
<foreach collection="persons" item="person" separator=";">
insert into person(username,email,gender) VALUES
(#{person.username},#{person.email},#{person.gender})
</foreach>
</insert>
二、基于SqlSession的Executor Type进行批量添加
因为利用foreach去拼接批量插入语句的时候,批量插入的数据量越多,拼接的语句越长,数据库引擎解析的时候会负担较大,所以数据量较大的时候可以利用Executor Type
通过查看API可知可以在Setting中设置,但是Setting是全局配置,如果全部语句都采用批处理就不合理的,所以需要在单个SQL语句中实现批处理,则接触单个sqlsession
2.1 PersonMapper.xml
<insert id="addPerson" parameterType="person">
insert into person(username,email,gender) VALUES (#{username},#{email},#{gender})
</insert>
2.2 test,在openSession中传入参数ExecutorType.BATCH
SqlSession sqlSession = this.getSqlSessionFactory().openSession(ExecutorType.BATCH);