前言
在上一篇中提到了这么一个问题:
for(Integer id : ids) {
userDao.deleteUserById(id);
}
但我们需要批量删除的时候,这样会不停的获取数据库连接,资源消耗是很大的。
接下来就利用Mybatis的动态SQL功能,去验证一下这个问题(传送门:动态SQL)。
首先搭建Mybatis环境和日志环境搭建mybatis环境和日志环境(参考第一篇和第二篇),并创建如下一张表tb_user(id、姓名)和相应的持久层对象:
批量新增
A.利用想当然的方式测试
mapper文件和dao层接口
<insert id="saveUser" parameterType="com.zepal.mybatis.domain.User" useGeneratedKeys="true">
INSERT INTO tb_user (user_name, user_age) VALUEs (#{userName}, #{userAge});
</insert>
int saveUser(User user);
测试程序和结果
public class Test {
public static void main(String[] args) {
InputStream is = Test.class.getResourceAsStream("/mybatis/mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new
SqlSessionFactoryBuilder().build(is);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserDao userDao = sqlSession.getMapper(UserDao.class);
long start_time = System.currentTimeMillis();
for(int i=0;i<10000;i++) {
User user = new User();
user.setUserName("name"+i);
user.setUserAge(i);
userDao.saveUser(user);
System.out.println("===循环执行中===");
}
sqlSession.commit();
sqlSession.close();
System.out.println("耗时 : " + (System.currentTimeMillis()-start_time));
}
}
耗时 : 9414
增加1000条数据用了近10S钟。
B.利用动态SQL批量执行
mapper文件和dao层接口
<insert id="saveUserWithBatch" parameterType="list" useGeneratedKeys="true">
INSERT INTO tb_user (user_name, user_age) VALUES
<foreach collection="list" item="item" separator="," close=";">
(#{item.userName},#{item.userA