mybatis批量插入的三种方式以及速度分析

1首先构建一个实体类

public class Student {
    private Integer id;
    private String name;
    private Integer age;
    private Integer sex;
}

2创建Mapper

@Mapper
public interface StudentDao {
    // 单条插入
    int insert (Student student);
    //批量插入
    int inserts (@Param("students") List<Student> students);
}

3进行测试

3.1 用for循环进行批量插入

// 第一种 用for循环
   // 先构造10万条数据
        List<Student> students =new ArrayList<>();
        for(int i=100000;i<=200000;i++){
            Student student =new Student();
            student.setId(i);
            student.setName("学生"+i);
            student.setAge(18);
            student.setSex(0);
            students.add(student);
        }
        Long start =System.currentTimeMillis();
        // 用for循环一条一条的插入
        for(Student student:students){
            studentDao.insert(student);
        }
        System.out.println(System.currentTimeMillis()-start);

xml

<insert id="insert" parameterType="com.example.myproject.entity.Student">
    INSERT INTO student (id, name, age,sex)
    VALUES(#{id}, #{name}, #{age},#{sex})
    </insert>

耗时368645(和机器有关)
3.2 第二种 用sqlsession 批量插入

  @Autowired
    SqlSessionTemplate sqlSessionTemplate;
     @Test
    void mytest2() {
        // 先构造10万条数据
        List<Student> students =new ArrayList<>();
        for(int i=200001;i<=300000;i++){
            Student student =new Student();
            student.setId(i);
            student.setName("学生"+i);
            student.setAge(18);
            student.setSex(0);
            students.add(student);
        }
        // 拿到sqsession,设置批量
        SqlSession sqlSession = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH);
        // sqlSession创建Mapper对象,必须
        StudentDao studentDao1 =sqlSession.getMapper(StudentDao.class);
        
        Long start =System.currentTimeMillis();
        for(Student student:students){
        // 此时并没有提交
            studentDao1.insert(student);
        }
        // 一次提交
        sqlSession.commit();
        System.out.println(System.currentTimeMillis()-start);
        // 记得关闭sqlsession
        sqlSession.close();
    }

xml和前面一样

<insert id="insert" parameterType="com.example.myproject.entity.Student">
    INSERT INTO student (id, name, age,sex)
    VALUES(#{id}, #{name}, #{age},#{sex})
    </insert>

耗时322568(和机器有关)
3.3用foreach

   // 构造10万条数据
        List<Student> students =new ArrayList<>();
        for(int i=300001;i<=400000;i++){
            Student student =new Student();
            student.setId(i);
            student.setName("学生"+i);
            student.setAge(18);
            student.setSex(0);
            students.add(student);
        }
        Long start =System.currentTimeMillis();
      // 批量插入
        studentDao.inserts(students);

        System.out.println(System.currentTimeMillis()-start);

xml

<insert id="inserts" parameterType="java.util.List">
        INSERT INTO student
        (id, name, age,sex)
        VALUES
        <foreach collection ="students" item="student" separator =",">
            (#{student.id}, #{student.name}, #{student.age}, #{student.sex})
        </foreach >
    </insert>

耗时4416(和机器有关)
通过三种方式的对比,我们可以看到用foreach是最快的,但是需要注意的是
foreach方式能够批量执行的数量是有限的,这个和mysql的允许的SQL语句的长度,以及批量上传的速度有关,用for循环每一次都与数据库进行连接和断开连接非常消耗资源不建议使用,用sqlsession是一种比较好的方式,具体情况看自己的需求。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值