千家信息网

Mybatis怎么批量导入数据

发表于:2025-01-18 作者:千家信息网编辑
千家信息网最后更新 2025年01月18日,这篇文章主要介绍了Mybatis怎么批量导入数据,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. 循环插入mapper.xml:
千家信息网最后更新 2025年01月18日Mybatis怎么批量导入数据

这篇文章主要介绍了Mybatis怎么批量导入数据,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

1. 循环插入

mapper.xml:

      INSERT INTO tb_student (name, age, phone, address, class_id) VALUES (#{name},#{age},#{phone},#{address},#{classId})  

mapper接口:

public interface StudentMapper {    int insert(Student student);}

测试代码:

@SpringBootTestclass DemoApplicationTests {        @Resource        private StudentMapper studentMapper;        @Test        public void testInsert(){                //数据生成                List studentList = createData(100);                //循环插入                long start = System.currentTimeMillis();                studentList.stream().forEach(student -> studentMapper.insert(student));                System.out.println(System.currentTimeMillis() - start);        }        private List createData(int size){                List studentList = new ArrayList<>();                Student student;                for(int i = 0; i < size; i++){                        student = new Student();                        student.setName("小王" + i);                        student.setAge(18);                        student.setClassId(1);                        student.setPhone("1585xxxx669");                        student.setAddress("未知");                        studentList.add(student);                }                return studentList;        }}

2. foreach标签

mapper.xml:

      INSERT INTO tb_student (name, age, phone, address, class_id) VALUES (#{name},#{age},#{phone},#{address},#{classId})        INSERT INTO tb_student (name, age, phone, address, class_id) VALUES            (#{item.name},#{item.age},#{item.phone},#{item.address},#{item.classId})      

mapper接口:

public interface StudentMapper {    int insert(Student student);    int insertBatch(List studentList);}

测试代码:

@SpringBootTestclass DemoApplicationTests {        @Resource        private StudentMapper studentMapper;        @Test        public void testInsertByForeachTag(){                //数据生成                List studentList = createData(100);                //使用foreach标签,拼接SQL插入                long start = System.currentTimeMillis();                studentMapper.insertBatch(studentList);                System.out.println(System.currentTimeMillis() - start);        }        private List createData(int size){                List studentList = new ArrayList<>();                Student student;                for(int i = 0; i < size; i++){                        student = new Student();                        student.setName("小王" + i);                        student.setAge(18);                        student.setClassId(1);                        student.setPhone("1585xxxx669");                        student.setAddress("未知");                        studentList.add(student);                }                return studentList;        }}

3. 批处理

测试代码:

@SpringBootTestclass DemoApplicationTests {        @Autowired        private SqlSessionFactory sqlSessionFactory;        @Test        public void testInsertBatch(){                //数据生成                List studentList = createData(100);                //使用批处理                long start = System.currentTimeMillis();                SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH,false);                StudentMapper studentMapperNew = sqlSession.getMapper(StudentMapper.class);                studentList.stream().forEach(student -> studentMapperNew.insert(student));                sqlSession.commit();                sqlSession.clearCache();                System.out.println(System.currentTimeMillis() - start);        }        private List createData(int size){                List studentList = new ArrayList<>();                Student student;                for(int i = 0; i < size; i++){                        student = new Student();                        student.setName("小王" + i);                        student.setAge(18);                        student.setClassId(1);                        student.setPhone("1585xxxx669");                        student.setAddress("未知");                        studentList.add(student);                }                return studentList;        }}

三种方式的对比

MySQL服务器版本:5.6.4

其他依赖版本如下:

        4.0.0                        org.springframework.boot                spring-boot-starter-parent                2.4.4                                 com.buhe        demo        0.0.1-SNAPSHOT        demo        Demo project for Spring Boot                        1.8                                                        org.springframework.boot                        spring-boot-starter-web                                                        org.springframework.boot                        spring-boot-starter-test                        test                                                        mysql                        mysql-connector-java                        5.1.41                                                        org.mybatis.spring.boot                        mybatis-spring-boot-starter                        1.3.1                                                                                                        org.springframework.boot                                spring-boot-maven-plugin                                                                                                                src/main/java                                                                        **/*.xml                                                                                

三种插入方式在不同数据量下的表现,测试结果:

插入方式10条100条500条1000条
循环插入496ms3330ms15584ms33755ms
foreach标签268ms366ms392ms684ms
批处理222ms244ms364ms426ms

三种方式中,批处理的方式效率是最高的,尤其是在数据量大的情况下尤为明显。

其次是foreach标签,foreach标签是通过拼接SQL语句的方式完成批量操作的。但是当拼接的SQL过多,导致SQL大小超过了MySQL服务器中max_allowed_packet变量的值时,会导致操作失败,抛出PacketTooBigException异常。

最后是循环插入的方式,这种方式在数据量小的时候可以使用,在数据量大的情况下效率要低很多。

感谢你能够认真阅读完这篇文章,希望小编分享的"Mybatis怎么批量导入数据"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

0