java執行多條SQL語句

來源:互聯網
上載者:User

標籤:style   blog   io   ar   os   使用   sp   java   for   

一次執行多條SQL的技術要點如下:
  • DatabaseMetaData介面是描述有關資料庫的整體綜合資訊,由於DatabaseMetaData是介面,所以沒有構造方法,故不能使用new來建立DatabaseMetaData對象,但是可以通過Connection的getMetaData()方法建立。例如:DatabaseMetaData md=con.getMetaData()。

  • DatabaseMetaData類的supportsBatchUpdates方法用於判斷此資料庫是否支援批次更新。其傳回值類型為boolean,如果此資料庫支援批次更新,則返回true;否則返回false。

  • Statement的addBatch(String sql)方法將給定的SQL命令添加到此Statement對象的當前命令列表中,此方法可多次調用。

  • Statement的executeBatch()方法的作用是將一批命令提交給資料庫來執行,如果全部命令執行成功,則返回更新計數組成的數組。

1.java處理事務的程式 

  在與資料庫操作時,如果執行多條更新的SQL語句(如:update或insert語句),在執行第一條後如果出現異常或電腦斷電, 則後面的SQL語句執行不了,這時候設定我們自己提交SQL語句,不讓JDBC自動認可,格式為:

conn.setAutoCommit(false);stmt.addBatch("insert into people values(078,‘ding‘,‘duo‘)"); stmt.addBatch("insert into people values(30,‘nokia‘,‘ddd‘)"); stmt.executeBatch(); 執行多條SQL語句;conn.commit(); //事務提交//恢複自動認可模式conn.setAutoCommit(true);....if (con != null) { con.rollback(); con.setAutoCommit(true); } //如果發現異常,則採取復原

  

如果多條語句重複,只是參數不變的話可以這樣

特殊情況:如果是只是參數不變,如下也是一樣的

PreparedStatement ps=conn.prepareStatement("insert into temp values(?)");ps.setInt(1, 100);ps.addBatch();ps.setInt(1, 200);ps.addBatch();ps.executeBatch();
 例子:
package net.xsoftlab.dict; import java.sql.Connection;import java.sql.DatabaseMetaData;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement; public class Batch {     /** 判斷資料庫是否支援批處理 */    public static boolean supportBatch(Connection con) {        try {            // 得到資料庫的中繼資料            DatabaseMetaData md = con.getMetaData();            return md.supportsBatchUpdates();        } catch (SQLException e) {            e.printStackTrace();        }        return false;    }     /** 執行一批SQL語句 */    public static int[] goBatch(Connection con, String[] sqls) throws Exception {        if (sqls == null) {            return null;        }        Statement sm = null;        try {            sm = con.createStatement();            for (int i = 0; i < sqls.length; i++) {                sm.addBatch(sqls[i]);// 將所有的SQL語句添加到Statement中            }            // 一次執行多條SQL語句            return sm.executeBatch();        } catch (SQLException e) {            e.printStackTrace();        } finally {            sm.close();        }        return null;    }     public static void main(String[] args) throws Exception {        System.out.println("沒有執行批處理時的資料為:");        query();        String[] sqls = new String[3];        sqls[0] = "UPDATE staff SET depart=‘Personnel‘ where name=‘mali‘";        sqls[1] = "INSERT INTO staff (name, age, sex,address, depart, worklen,wage) VALUES (‘mali  ‘, 27, ‘w‘, ‘china‘,‘Technology‘,‘2‘,‘2300‘)";        sqls[2] = "DELETE FROM staff where name=‘marry‘";         Connection con = null;        try {            con = getConnection();// 獲得資料庫連接            boolean supportBatch = supportBatch(con); // 判斷是否支援批處理            System.out.println("支援批處理? " + supportBatch);            if (supportBatch) {                 int[] results = goBatch(con, sqls);// 執行一批SQL語句                // 分析執行的結果                for (int i = 0; i < sqls.length; i++) {                    if (results[i] >= 0) {                        System.out.println("語句: " + sqls[i] + " 執行成功,影響了"                                + results[i] + "行資料");                    } else if (results[i] == Statement.SUCCESS_NO_INFO) {                        System.out.println("語句: " + sqls[i] + " 執行成功,影響的行數未知");                    } else if (results[i] == Statement.EXECUTE_FAILED) {                        System.out.println("語句: " + sqls[i] + " 執行失敗");                    }                }            }        } catch (ClassNotFoundException e1) {            throw e1;        } catch (SQLException e2) {            throw e2;        } finally {            con.close();// 關閉資料庫連接        }        System.out.println("執行批處理後的資料為:");        query();    }     public static Connection getConnection() {// 資料庫連接        Connection con = null;        try {            Class.forName("com.mysql.jdbc.Driver");// 載入Mysql資料驅動            con = DriverManager.getConnection(                    "jdbc:mysql://localhost:3306/myuser", "root", "123456");// 建立資料連線        } catch (Exception e) {            System.out.println("資料庫連接失敗");        }        return con;    }     public static void query() throws Exception {// 查詢所有的資料        Connection con = getConnection();        Statement st = con.createStatement();        ResultSet rs = st.executeQuery("select * from staff");        while (rs.next()) {            String name = rs.getString("name");            int age = rs.getInt("age");            String sex = rs.getString("sex");            String address = rs.getString("address");            String depart = rs.getString("depart");            String worklen = rs.getString("worklen");            String wage = rs.getString("wage");            System.out.println(name + " " + age + " " + sex + " " + address                    + " " + depart + " " + worklen + " " + wage);        }    } }

程式解讀:

  1. support_Batch()方法判斷資料庫是否支援SQL語句的批處理。通過Connection的getMetaData方法獲得資料庫的中繼資料對象DatabaseMetaData,再調用DatabaseMetaData supportsBatchUpdates方法判斷資料庫是否支援批處理。

  2. startBatch()方法執行一組SQL語句。首先建立執行SQL語句的Statement對象,通過Statement類的addBatch方法將待執行SQL語句添加到執行緩衝區中,再調用executeBatch方法將執行緩衝區中的SQL語句全部執行,返回一個整型數組,如果數組元素的值大於等於0,則表示該語句執行成功,該值表示了執行該SQL語句修改的記錄的行數;如果數組元素的值等於Statement.SUCCESS_NO_INFO常量,表示該語句也執行成功,但不知道具體修改了多少條記錄;如果數組元素的值等於Statement.EXECUTE_FAILED常量,表示該語句執行失敗。

  3. getConnection()方法封裝了資料庫的串連方式。如果在程式中需要使用資料庫,直接調用此方法即可。

  4. query()方法的作用是查詢資料庫,傳入執行查詢語句的Statement對象和待執行的SQL語句,通過Statement的executeQuery方法執行SQL語句,返回一個ResultSet對象。再調用ResultSet的next()方法,根據欄位名將資料取出,並列印在控制台上。

 2.寫成預存程序 

java執行多條SQL語句

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.