批处理:
当我们需要向数据库中插入大量数据时,批处理会将这些数据打成多个批次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