java数据库批量插入数据的实现
前言
本篇文章将记录几种使用java向mysql数据库中批量插入数据的方法,比如插入1000条,10000条,10万条甚至100万条数据。操作数据库的方式采用Mybatis框架。
输入的数据:
现数据库有一个student表,表中字段如下:
编写student实体类,及其controller和dao层,因为只是插入数据所以不需要加service层。
方法一
最简单的方法就是利用循环,不断执行单条数据的插入指令。
因此在dao中写一个insertStudent方法,并在xml文件中编写sql语句
void insertStudent(Student student);
<insert id="insertStudent" parameterType="com.example.bootdemo.entity.Student"> insert into student (s_name,s_birth,s_sex) values (#{s_name},#{s_birth},#{s_sex}) </insert>
随后在controller中编写循环条用该方法,比如循环插入1000条数据,代码如下:
@ResponseBody @RequestMapping("/insertstudent") public Integer insertStudent(){ System.out.println("开始插入"); long start = System.currentTimeMillis(); /** * 依靠循环插入 */ for (int i = 0; i < 1000; i++) { Student student = new Student(); student.setS_birth("20230206"); student.setS_name("zjd"); student.setS_sex("男"); studentDao.insertStudent(student); } long end = System.currentTimeMillis(); System.out.println("耗时:"+(end-start)); return 1; }
这种方式虽然可以实现,但是效率比较慢,因为每次执行插入都要执行一次sql,速度很慢。
方法二
在所有要插入的数据放在列表中,并在sql中利用foreach进行批量插入。这样执行一次sql就可以插入很多数据。
xml编写中编写sql
<insert id="batchInsertStudent" parameterType="java.util.List"> insert into student (s_name,s_birth,s_sex) values <foreach collection="students" item="student" index="index" separator=","> ( #{student.s_name}, #{student.s_birth}, #{student.s_sex} ) </foreach> </insert>
将数据方法List中执行sql语句。
@ResponseBody @RequestMapping("/insertstudent") public Integer insertStudent(){ System.out.println("开始插入"); long start = System.currentTimeMillis(); /** * 批量插入,大量数据时不推荐使用 */ List<Student> students = new ArrayList<>(count); for(int i=0;i<count;i++){ Student student = new Student(); student.setS_name("zjd"+i); student.setS_birth("20230206"); student.setS_name("zjd"); student.setS_sex("男"); students.add(student); } studentDao.batchInsertStudent(students); long end = System.currentTimeMillis(); System.out.println("耗时:"+(end-start)); return 1; }
这两种方法在数据量很大时都不推荐使用,第一种会很慢,第二种可能会因为数据过多,sql执行失败,直接报错。
方法三
既然第二种在插入大量数据时会报错,那么面对大量数据,我们可以将其分批插入,比如我可以每次直插入3000条数据,执行多次就可以实现大量数据的插入。
代码如下:
@ResponseBody @RequestMapping("/insertstudent") public Integer insertStudent() throws InterruptedException { System.out.println("开始插入"); long start = System.currentTimeMillis(); CountDownLatch countDownLatch = new CountDownLatch(6); for(int i=0;i<6;i++){ List<Student> students = new ArrayList<>(count); int tempCount = 0; for(int n=0;n<count;n++){ if(tempCount==2999){ studentDao.batchInsertStudent(students); tempCount=0; students.clear(); } Student student = new Student(); student.setS_name("zjd"+i); student.setS_birth("20230206"); student.setS_name("zjd"); student.setS_sex("男"); students.add(student); tempCount++; } studentDao.batchInsertStudent(students); long end = System.currentTimeMillis(); System.out.println("耗时:"+(end-start)); countDownLatch.countDown(); } countDownLatch.await(); return 1; }
这样速度也会比单条循环插入要快很多。
到此这篇关于java数据库批量插入数据的实现的文章就介绍到这了,更多相关java 批量插入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
SpringSecurity从数据库中获取用户信息进行验证的案例详解
这篇文章主要介绍了SpringSecurity从数据库中获取用户信息进行验证的案例详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2021-01-01深入讲解spring boot中servlet的启动过程与原理
这篇文章主要给大家介绍了关于spring boot中servlet启动过程与原理的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2018-07-07
最新评论