zoukankan      html  css  js  c++  java
  • 关于Mybatis三种批量插入方式对比

    第一种:普通for循环插入

    @Test
    public void testInsertBatch2() throws Exception {
        long start = System.currentTimeMillis();
        User user;
        SqlSession sqlSession = sqlSessionTemplate.getSqlSessionFactory().openSession(false);
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        for (int i = 0; i < 500; i++) {
            user = new User();
            user.setId("test" + i);
            user.setName("name" + i);
            user.setDelFlag("0");
            mapper.insert(user);
        }
        sqlSession.commit();
        long end = System.currentTimeMillis();
        System.out.println("---------------" + (start - end) + "---------------");
    }
    
    xml配置
    <insert id="insert">
        INSERT INTO t_user (id, name, del_flag)
              VALUES(#{id}, #{name}, #{delFlag})
    </insert>

    第二种:mybatis BATCH模式插入

    @Test
    public void testInsertBatch2() throws Exception {
        long start = System.currentTimeMillis();
        User user;
        SqlSession sqlSession = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH, false);//跟上述sql区别
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        for (int i = 0; i < 500; i++) {
            user = new User();
            user.setId("test" + i);
            user.setName("name" + i);
            user.setDelFlag("0");
            mapper.insert(user);
        }
        sqlSession.commit();
        long end = System.currentTimeMillis();
        System.out.println("---------------" + (start - end) + "---------------");
    }
    
    xml配置
    <insert id="insert">
        INSERT INTO t_user (id, name, del_flag)
              VALUES(#{id}, #{name}, #{delFlag})
    </insert>

    第三种:foreach方式插入

    @Test
    public void testInsertBatch() throws Exception {
        long start = System.currentTimeMillis();
        List<User> list = new ArrayList<>();
        User user;
        for (int i = 0; i < 10000; i++) {
            user = new User();
            user.setId("test" + i);
            user.setName("name" + i);
            user.setDelFlag("0");
            list.add(user);
        }
        userService.insertBatch(list);
        long end = System.currentTimeMillis();
        System.out.println("---------------" + (start - end) + "---------------");
    }
    
    xml配置
    <insert id="insertBatch">
        INSERT INTO t_user
                (id, name, del_flag)
        VALUES
        <foreach collection ="list" item="user" separator =",">
             (#{user.id}, #{user.name}, #{user.delFlag})
        </foreach >
    </insert>

    总结:

    mysql默认接受sql的大小是1048576(1M),即第三种方式若数据量超过1M会报如下异常:(可通过调整MySQL安装目录下的my.ini文件中[mysqld]段的"max_allowed_packet = 1M")

  • 相关阅读:
    AJAX请求头Content-type
    原 layer父子页面交互
    layer.closeAll()无法关闭弹窗的解决办法之一
    成员函数的重载,覆盖与隐藏
    const限定符用法汇总
    构造函数和析构函数的调用时机
    MFC 消息映射、分派和传递
    C++对象模型
    函数指针与虚函数表
    数据类型与内存映像
  • 原文地址:https://www.cnblogs.com/ZJOE80/p/12181762.html
Copyright © 2011-2022 走看看