引用:忘了
当需要成批插入或者更新记录时。可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理。通常情况下比单独提交处理更有效率
JDBC的批量处理语句包括下面两个方法:
addBatch(String):添加需要批量处理的SQL语句或是参数;
executeBatch();执行批量处理语句;
通常我们会遇到两种批量执行SQL语句的情况:
多条SQL语句的批量处理;
一个SQL语句的批量传参;
测试代码:
1 import java.sql.Connection; 2 import java.sql.Date; 3 import java.sql.PreparedStatement; 4 import java.sql.Statement; 5 6 import org.junit.Test; 7 8 import xuezaipiao1.JDBC_Tools; 9 /** 10 * 向Oracle 的 temp 数据表中添加 10万 条记录 11 * 测试如何插入,用时最短 12 */ 13 14 public class JDBCTest { 15 16 /** 17 * 18 * 1.使用 Statement . 19 * 测试用时:35535 20 */ 21 @Test 22 public void testBbatchStatement() { 23 Connection conn = null; 24 Statement statement = null; 25 String sql = null; 26 try { 27 conn = JDBC_Tools.getConnection(); 28 JDBC_Tools.beginTx(conn); 29 30 long beginTime = System.currentTimeMillis(); 31 statement = conn.createStatement(); 32 for(int i = 0;i<100000;i++){ 33 sql = "INSERT INTO temp values("+(i+1) 34 +",'name_"+(i+1)+"','13-6月 -15')"; 35 statement.executeUpdate(sql); 36 } 37 long endTime = System.currentTimeMillis(); 38 System.out.println("Time : "+(endTime - beginTime)); 39 JDBC_Tools.commit(conn); 40 } catch (Exception e) { 41 e.printStackTrace(); 42 JDBC_Tools.rollback(conn); 43 }finally{ 44 JDBC_Tools.relaseSource(conn, statement); 45 } 46 } 47 48 /** 49 * 使用PreparedStatement 50 * 测试用时:9717 51 */ 52 @Test 53 public void testBbatchPreparedStatement() { 54 Connection conn = null; 55 PreparedStatement ps = null; 56 String sql = null; 57 try { 58 conn = JDBC_Tools.getConnection(); 59 JDBC_Tools.beginTx(conn); 60 61 long beginTime = System.currentTimeMillis(); 62 sql = "INSERT INTO temp values(?,?,?)"; 63 ps = conn.prepareStatement(sql); 64 Date date = new Date(new java.util.Date().getTime()); 65 for(int i = 0;i<100000;i++){ 66 ps.setInt(1, i+1); 67 ps.setString(2, "name_"+i); 68 ps.setDate(3, date); 69 ps.executeUpdate();//9717 70 } 71 long endTime = System.currentTimeMillis(); 72 System.out.println("Time : "+(endTime - beginTime)); 73 JDBC_Tools.commit(conn); 74 } catch (Exception e) { 75 76 e.printStackTrace(); 77 JDBC_Tools.rollback(conn); 78 }finally{ 79 JDBC_Tools.relaseSource(conn, ps); 80 } 81 } 82 83 /** 84 * 测试用时 : 658 85 */ 86 @Test 87 public void testBbatch() { 88 Connection conn = null; 89 PreparedStatement ps = null; 90 String sql = null; 91 try { 92 conn = JDBC_Tools.getConnection(); 93 JDBC_Tools.beginTx(conn); 94 95 long beginTime = System.currentTimeMillis(); 96 sql = "INSERT INTO temp values(?,?,?)"; 97 ps = conn.prepareStatement(sql); 98 Date date = new Date(new java.util.Date().getTime()); 99 for(int i = 0;i<100000;i++){ 100 ps.setInt(1, i+1); 101 ps.setString(2, "name_"+i); 102 ps.setDate(3, date); 103 104 //积攒SQL 105 ps.addBatch(); 106 107 //当积攒到一定程度,就执行一次,并且清空记录 108 if((i+1) % 300==0){ 109 ps.executeBatch(); 110 ps.clearBatch(); 111 } 112 } 113 //总条数不是批量值整数倍,则还需要在执行一次 114 if(100000 % 300 != 0){ 115 ps.executeBatch(); 116 ps.clearBatch(); 117 } 118 long endTime = System.currentTimeMillis(); 119 System.out.println("Time : "+(endTime - beginTime)); 120 JDBC_Tools.commit(conn); 121 } catch (Exception e) { 122 123 e.printStackTrace(); 124 JDBC_Tools.rollback(conn); 125 }finally{ 126 JDBC_Tools.relaseSource(conn, ps); 127 } 128 } 129 }