利用addBatch()和executeBatch()批量插入数据
- addBatch()将多条sql语句装载在一起
- executeBatch()将addBatch()装载在一起的多条sql语句一次性执行,并返回一个数组,每执行成功一次就在数组中添加一个1,否则添加一个0
现在有一个需求,将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();
}
}
同样的,创建成功