利用addBatch()和executeBatch()批量插入数据
现在有一个需求,将99条学生信息加载到表studentTest中,并且每一条数据都变成十条,总共990条数据
使用连接池来连接数据库,下面是DBCP连接池工具类的代码
package com.demo.spring.util; import org.apache.commons.dbcp2.BasicDataSource; import java.sql.Connection; import java.sql.SQLException; public class DBCPUtil { private static BasicDataSource bds; static { System.out.println("创建连接池"); bds = new BasicDataSource(); // 配置连接池大小 bds.setInitialSize(5); //配置连接信息 bds.setUrl("jdbc:mysql://master:3306/show1?useUnicode=true&characterEncoding=utf-8"); bds.setDriverClassName("com.mysql.jdbc.Driver"); bds.setUsername("root"); bds.setPassword("123456"); } public static Connection getConn(){ System.out.println("获取连接"); try { return bds.getConnection(); } catch (SQLException e) { e.printStackTrace(); } return null; } }
这里需要注意的是,在获取数据库信息时,要在后面配置一下编码格式,否则插入到数据库中的汉字会变成乱码
在数据库名后面加上 ?useUnicode=true&characterEncoding=utf-8
然后就是具体插入数据的代码
package com.demo.spring.test; import com.demo.spring.util.DBCPUtil; import java.io.BufferedReader; import java.io.FileReader; import java.sql.Connection; import java.sql.PreparedStatement; public class BatchMySQL { public static void main(String[] args) throws Exception{ String path="F:\\idea2018.1\\workplace\\spring\\src\\main\\resources\\words\\students.txt"; BufferedReader br = new BufferedReader(new FileReader(path)); String line; Connection conn = null; PreparedStatement ps = null; while((line=br.readLine())!=null){ String[] split = line.split(","); String id = split[0]; String name = split[1]; String age = split[2]; String sex = split[3]; String clazz = split[4]; //插入数据 conn=DBCPUtil.getConn(); String sql = "insert into studentTest values(?,?,?,?,?)"; ps=conn.prepareStatement(sql); //这里是将students文件里面的每一行内容,都变成10条,然后插入数据库中 //为了避免主键重复,所以每一行内容的id都加上for循环的i for(int i=1;i<=10;i++){ String newid = id+i; ps.setString(1,newid); ps.setString(2,name); ps.setString(3,age); ps.setString(4,sex); ps.setString(5,clazz); //students文件里面有99行内容,每一行都变成十行,总计990行 //990行如果一条一条插入速度太慢,所以批量插入 //addBatch()是把若干sql语句装载到一起,然后一次性传送到数据库执行,即是批量处理sql数据的 //将当前循环的sql语句加入addBatch(),一共循环十次,所以一个批次有十行sql语句 ps.addBatch(); } //这里是把一条语句经过for循环后变成的十条语句作为一个批次进行执行 //按批次执行sql语句 ps.executeBatch(); System.out.println("单条数据放大十倍后的批量插入完成"); ps.close(); conn.close(); } br.close(); } }
到数据库中查询
再查询一下行数 select count(*) from studentTest;
批量插入数据成功,另外看一下executeBatch()获取的数组情况
package com.demo.spring.test; import com.demo.spring.util.DBCPUtil; import java.io.BufferedReader; import java.io.FileReader; import java.sql.Connection; import java.sql.PreparedStatement; public class BatchMySQL { public static void main(String[] args) throws Exception{ String path="F:\\idea2018.1\\workplace\\spring\\src\\main\\resources\\words\\students.txt"; BufferedReader br = new BufferedReader(new FileReader(path)); String line; int count=0; Connection conn = null; PreparedStatement ps = null; while((line=br.readLine())!=null){ String[] split = line.split(","); String id = split[0]; String name = split[1]; String age = split[2]; String sex = split[3]; String clazz = split[4]; conn=DBCPUtil.getConn(); String sql = "insert into studentTest values(?,?,?,?,?)"; ps=conn.prepareStatement(sql); for(int i=1;i<=10;i++){ String newid = id+i; ps.setString(1,newid); ps.setString(2,name); ps.setString(3,age); ps.setString(4,sex); ps.setString(5,clazz); ps.addBatch(); } int[] ints = ps.executeBatch(); for (int anInt : ints) { if(anInt==1){ count+=1; } } System.out.println("总共增加了"+count+"条数据"); ps.close(); conn.close(); } br.close(); } }
同样的,创建成功