JAVA如何對數據庫執行批量操作


轉載自:   http://linduo168.iteye.com/blog/1887328

在傳統關系型數據庫當中,如何對數據庫執行批量操作呢 ? 我們了解到在JDBC的底層有 executeBatch操作 。

 

實現批處理有兩種方式, 
            第一種方式: Statement.addBatch(sql) (其實是將sql語句 放在了一個 list 集合中。) 
            第二種方式: PreparedStatement.addBatch() (其實是將sql語句 放在了一個 list 集合中。) 

   執行批處理SQL語句 
            executeBatch()方法:執行批處理命令 
            clearBatch()方法:清除批處理命令(實際上是清除 List集合中的SQL語句,否則會造成內存溢出。) 
    接下去比較2種方法的優缺點,可以更好的在實際工作場景中得以更好的應用。 
    第一種方式:Statement.addBatch(sql) 
   采用Statement.addBatch(sql)方式實現批處理的優缺點 
        優點:可以向數據庫發送多條不同的SQL語句。 
        缺點:SQL語句沒有預編譯。當向數據庫發送多條語句相同,但僅參數不同的SQL語句時,需重復寫上很多條SQL語句。 
Demo樣例: 
     @Test 
public void test1() throws SQLException{ 
            Connection conn = null; 
            Statement st = null; 
            ResultSet rs = null; 
            try { 
                    conn = JdbcUtil.getConnection(); 
                    String sql1 = "insert into user(name,password,email,birthday)  values('kkk','123','abc@sina.com','1978-08-08')"; 
                    String sql2 = "update user set password='123456' where id=3"; 
                    st = conn.createStatement(); 
                    st.addBatch(sql1);  //把SQL語句加入到批命令中 
                    st.addBatch(sql2);  //把SQL語句加入到批命令中 
                    st.executeBatch(); 
                    st.clearBatch(); 
            } finally{ 
                 JdbcUtil.free(conn, st, rs); 
            } 


方法二、實現批處理的第二種方式:PreparedStatement.addBatch() 
    優點:發送的是預編譯后的SQL語句,執行效率高。 
    缺點:只能應用在SQL語句相同,但參數不同的批處理中。因此此種形式的批處理經常用於在同一個表中批量插入數據,或批量更新表的數據。 
    Demo樣例: 
@Test 
public void test2() throws SQLException{ 
        conn = JdbcUtil.getConnection(); 
        String sql = "insert into user(name,password,email,birthday) values(?,?,?,?)"; 
        st = conn.prepareStatement(sql); 
        for(int i=0;i<50000;i++){ 
                st.setString(1, "aaa" + i); 
                st.setString(2, "123" + i); 
                st.setString(3, "aaa" + i + "@sina.com"); 
                st.setDate(4,new Date(1980, 10, 10)); 
                st.addBatch(); 
                if(i%1000==0){      //為防止(list集合) 內存溢出:設定每累加1000條數據就向數據庫發送一次 
                        st.executeBatch(); 
                        st.clearBatch(); 
                } 
        } 
        st.executeBatch(); //當剩余的條數小於1000條時就不會被發送到數據庫,所以此處要在發送一次。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM