已经封装好的通用的批处理语句:
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;
/**
* 是一个工具类:
* 作用:用于封装通用的获取连接、通用的增删改、通用的查询
* 版本:v0.0.0.1
* 方法:getConn();
* close();
* 问题:
* OCP:对扩展开放,对修改的关闭;
* 现在数据库myjdbc,该库名,修改代码;用户 名 密码要改,也需要修改代码.
* 升级:
* 需要读取到db.properties的文件的内容;
* 需要的技术:io
* Properties集合类;
*/
public class JDBCUtilTwo {
//成员变量;
static Properties prop=new Properties();
static String className=null;
static String url=null;
static String uname=null;
static String pwd=null;
//1.静态代码块,加载数据库的驱动,此处是mysql驱动;
static {
try {
FileReader reader=new FileReader("db.properties");
prop.load(reader);
//getProperty():获取的从文件读取的key;
className=prop.getProperty("className");
url=prop.getProperty("url");
uname=prop.getProperty("uname");
pwd=prop.getProperty("pwd");
Class.forName(className);
} catch (ClassNotFoundException | FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//2.获取链接;获取一个连接对象;
public static Connection getConn(){
Connection connection = null;
try {
connection = DriverManager.getConnection(url, uname, pwd);
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
//3.关闭对象,结果集对象、语句对象、链接对象;
public static void close(ResultSet rs, Statement st, Connection conn){
if(rs!=null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(st!=null)
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
if(conn!=null)
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
普通插入方式,耗时比较长:
/**
* 执行时间:23 9786毫秒
* @throws SQLException
*/
@Test
public void test021() throws SQLException {
Connection conn = JDBCUtilTwo.getConn();
//常规语句对象+普通方式
Statement st = conn.createStatement();
//1万条数据;
long startTime=System.currentTimeMillis();
for (int i = 5; i < 10005; i++) {
String sql="insert t_user(username,passworld)values('tom','tom')";
st.executeUpdate(sql);
}
st.close();
conn.close();
long endTime=System.currentTimeMillis();
System.out.println("执行时间:"+(endTime-startTime)+"毫秒");
}
Statement方式添加批处理,时间还比较慢。
/**
* 使用批处理来进行操作;
* 执行时间:21 4194毫秒 2468毫秒
* @throws SQLException
*/
@Test
public void test022() throws SQLException {
Connection conn = JDBCUtilTwo.getConn();
//设置链接,自动提交事务为false。
conn.setAutoCommit(false);
//常规语句对象+普通方式
Statement st = conn.createStatement();
//1万条数据;
String sql="insert t_user(username,passworld)values('tom','tom')";
long startTime=System.currentTimeMillis();
for (int i = 1; i <10010 ; i++) {
//将sql语句,添加到批处理里面;
st.addBatch(sql);
//在某个时间节点,执行一次批处理;
if(i%2000==0) {
st.executeBatch(); //执行批处理
st.clearBatch(); //清空一下批处理;
}
}
st.executeBatch(); //执行批处理
st.clearBatch(); //清空一下批处理;
//提交事务;
conn.commit();
JDBCUtilTwo.close(null,st,conn);
long endTime=System.currentTimeMillis();
System.out.println("执行时间:"+(endTime-startTime)+"毫秒");
}
时间还比较慢:可以在配置文件,修改mysql批处理为true。
className=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/myjdbc?rewriteBatchedStatements=true
uname=root
pwd=root
再修改事务自动提交为false,会大幅度提交效率。
预编译语句方式,批处理:
/**
* 执行时间:22 0170毫秒 1711毫秒
* @throws SQLException
*/
@Test
public void test023() throws SQLException {
Connection conn = JDBCUtilTwo.getConn();
String sql="insert t_user(username,passworld)values(?,?)";
PreparedStatement pst = conn.prepareStatement(sql);
long startTime=System.currentTimeMillis();
for (int i = 2; i < 10002; i++) {
pst.setString(1,"u"+i);
pst.setString(2,"p"+i);
//添加到批处理里面;
pst.addBatch();
if(i%2000==0){
pst.executeBatch();
pst.clearBatch();
}
}
pst.executeBatch();
pst.clearBatch();
JDBCUtilTwo.close(null,pst,conn);
long endTime=System.currentTimeMillis();
System.out.println("执行时间:"+(endTime-startTime)+"毫秒");
}