foreach
标签拼接的insert
语句不是批量新增
相信很多项目中myabtis的新增sql语句是使用foreach
标签拼接,如下写法,但千万要注意这并不批量新增
,
实际上这是一个大的SQL,如果遍历的集合太大, 新增时会导致性能问题.
<insert id="insertBatch" parameterType="com.example.Category" useGeneratedKeys="true" keyProperty="id">
INSERT INTO category (created_at, name, description)
VALUES
<foreach collection="entities" item="entity" separator=",">
(#{entity.createdAt}, #{entity.name}, #{entity.description})
</foreach>
</insert>
那么如何在mybatis中使用批量新增
呢?
- 在Mapper xml文件中编写sql语句
<insert id="insertName">
insert into names (name) values (#{value})
</insert>
- 通过sqlSessionFactory创建支持
批量新增
的SqlSession, 由该SqlSession获取Mapper执行新增
List<String> names = new ArrayList<String>();
names.add("Fred");
names.add("Barney");
names.add("Betty");
names.add("Wilma");
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
try {
NameMapper mapper = sqlSession.getMapper(NameMapper.class);
for (String name : names) {
mapper.insertName(name);
}
sqlSession.commit();
} finally {
sqlSession.close();
}
详情见myabtis github官网相关链接
- https://github.com/mybatis/mybatis-3/issues/484
- https://github.com/mybatis/mybatis-3/wiki/FAQ#how-do-i-code-a-batch-insert