向數據庫里插入10000條數據,分別使用三種插入方式,比較三種方式效率,第一種用時3000ms,第二種用時1500ms,第三種800ms,第三種效率最高。
package com.zhanghw.mybatisbatch; import com.zhanghw.mybatisbatch.entity.User; import com.zhanghw.mybatisbatch.mapper.UserMapper; import org.apache.ibatis.session.ExecutorType; import org.apache.ibatis.session.SqlSession; import org.junit.Test; import org.junit.runner.RunWith; import org.mybatis.spring.SqlSessionTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import java.util.ArrayList; import java.util.List; @RunWith(SpringRunner.class) @SpringBootTest public class MybatisBatchApplicationTests { @Autowired private UserMapper userMapper; @Autowired private SqlSessionTemplate sqlSessionTemplate; /** * 通過簡單循環批量插入 * @throws Exception */ @Test public void testInsertBatch1() throws Exception { long start = System.currentTimeMillis(); for (int i = 0; i < 10000; i++) { User user = User.builder().age(i).name("zhangsan" + i).password(i + "xxxx").sex("男").build(); int insert = userMapper.insert(user); System.out.println(insert); } long end = System.currentTimeMillis(); System.out.println("-------時間3188--------" + (start - end) + "---------------"); } /** * session使用批量模式插入數據 */ @Test public void testInsertBatch2() { long start = System.currentTimeMillis(); //跟上述sql區別,將session設置為批量形式 SqlSession sqlSession = sqlSessionTemplate.getSqlSessionFactory() .openSession(ExecutorType.BATCH, false); UserMapper mapper = sqlSession.getMapper(UserMapper.class); for (int i = 0; i < 10000; i++) { User user = User.builder().age(i).name("zhangsan" + i).password(i + "xxxx").sex("男").build(); int insert = mapper.insert(user); System.out.println(insert); } sqlSession.commit(); long end = System.currentTimeMillis(); System.out.println("----時間1535-----------" + (start - end) + "---------------"); } /** * 通過foreach標簽完成批量插入 */ @Test public void testInsertBatch3() { long start = System.currentTimeMillis(); List<User> list = new ArrayList<>(); for (int i = 0; i < 10000; i++) { User user = User.builder().age(i).name("zhangsan" + i).password(i + "xxxx").sex("男").build(); list.add(user); } int i = userMapper.insertBatch(list); System.out.println(i); long end = System.currentTimeMillis(); System.out.println("----時間824-----------" + (start - end) + "---------------"); } }
對應的mapper:
package com.zhanghw.mybatisbatch.mapper; import com.zhanghw.mybatisbatch.entity.User; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; @Mapper public interface UserMapper { public int insert(User user); public int insertBatch(@Param("list") List<User> list); }
對應mapper的xml配置:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.zhanghw.mybatisbatch.mapper.UserMapper"> <insert id="insert"> INSERT INTO user ( name,password,sex,age) VALUES( #{name}, #{password}, #{sex}, #{age}) </insert> <insert id="insertBatch" parameterType="com.zhanghw.mybatisbatch.entity.User"> INSERT INTO user (name,password,sex,age) VALUES <foreach collection ="list" item="user" separator =","> (#{user.name}, #{user.password}, #{user.sex}, #{user.age}) </foreach > </insert> </mapper>