批处理:
当我们需要向数据库中插入大量数据时,批处理会将这些数据打成多个批次addBatch(),统一发送给数据库服务器执行executeBatch(),减少与数据库的交互次数提高程序的执行效率。
实现批处理方法:
利用statement对象;
利用PreparedStatement对象;
共同使用的方法
addBatch();
executeBatch();
代码:
package cn.yikuan.batch;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import org.junit.Test;
import cn.tedu.util.JDBCUtils;
/**
* 这个类用来测试jdbc的批处理
* @author Administrator
*
*/
public class BatchTest {
//实现方式一:利用statement对象完成
@Test
public void StatementBatch(){
Connection conn = null;
Statement st = null;
try {
//1.注册驱动
//2.获取数据库连接
conn = JDBCUtils.getConnection();
long t = System.currentTimeMillis();
//)))1.关闭jdbc的事务管理,
conn.setAutoCommit(false);
//3.获取传输器
st = conn.createStatement();
//4.执行sql
for(int i=0;i<1000000;i++){
String sql = "insert into dept values(null,'"+i+"')";
//把sql打包成批次
st.addBatch(sql);
}
//统一发送给服务器执行批
int[] rows = st.executeBatch();
//)))2.手动提交事务
conn.commit();
//5.遍结果集
System.out.println(rows.length);
t = System.currentTimeMillis()-t;
System.out.println(t);
} catch (SQLException e) {
e.printStackTrace();
} finally {
//6.释放资源
JDBCUtils.close(null,st, conn);
}
}
@Test
public void psBatch(){
Connection conn = null;
PreparedStatement ps = null;
try {
//1.注册驱动
//2.获取数据库连接
conn = JDBCUtils.getConnection();
long t = System.currentTimeMillis();
//)))1.关闭jdbc的事务管理,
conn.setAutoCommit(false);
//3.获取传输器;4.执行sql
String sql = "insert into dept values(null,?)";
ps = conn.prepareStatement(sql);
for (int j = 0; j < 1000000; j++) {
ps.setString(1,"ps"+j);
//把sql打成批次
ps.addBatch();
}
//统一发送给数据库服务器
int[] rows = ps.executeBatch();
//)))2.手动提交事务
conn.commit();
//5.遍历结果集
System.out.println(rows.length);
t = System.currentTimeMillis()-t;
System.out.println(t);
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.close(null, ps, conn);
}
}
}
JDBCUtils.java
package cn.yikuan.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ResourceBundle;
/**
* 这个类用来提供JDBC的工具类
* @author Administrator
*
*/
public class JDBCUtils {
//1.私有化构造函数,外界无法直接创建对象
private JDBCUtils(){
}
static ResourceBundle rb = null;
static {
//读取属性文件
rb = ResourceBundle.getBundle("jdbc");
}
//2.提供公共的,静态的,getConnection方法,用来给外界提供数据库连接
public static Connection getConnection(){
try {
//2.1注册驱动
Class.forName(rb.getString("driverClass"));
//2.2获取数据库连接
String url = rb.getString("jdbcUrl");
String user = rb.getString("user");
String password = rb.getString("password");
Connection conn = DriverManager.getConnection(url, user, password);
return conn;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
//3.提供公共的,静态的,close方法,用来释放资源
public static void close(ResultSet rs,Statement st,Connection conn){
//3.1非空判断,防止空指针异常
//3.2手动置为空,保证完全释放
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
rs = null;
}
}
if(st != null){
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
st = null;
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
conn = null;
}
}
}
}
来源:https://www.cnblogs.com/yikuan-919/p/9519832.html