Statement及PreparedStatement執行多個sql


    這兩個對象的區別:
1.Statement它更適合執行不同sql的批處理,它沒有提供預處理功能,性能比較低。
2.PreparedStatement它適合執行相同的批處理,它提供了預處理功能,屬性比較高。 
          /**
      *  @param args
      *  @throws SQLException
      *  @throws ClassNotFoundException
      */
      public  static  void main(String[] args)  throws ClassNotFoundException,
                SQLException {
            // 定義sql 語句
           String sql1 = "create table person(id int,name varchar(20))";
           String sql2 = "insert into person values(1,'tom')";
           String sql3 = "insert into person values(2,'fox')";
           String sql4 = "insert into person values(3,'tony')";
           String sql5 = "update person set name='張三' where id=1";
           String sql6 = "delete from person where id=3";
 
           Connection conn = jdbcUtils. getConnection();
           Statement st = conn.createStatement();
 
            // 添加批處理sql
           st.addBatch(sql1);
           st.addBatch(sql2);
           st.addBatch(sql3);
           st.addBatch(sql4);
           st.addBatch(sql5);
           st.addBatch(sql6);
 
            // 執行批處理sql
           st.executeBatch();
           st.clearBatch();
           st.close();
            conn.close();
 
     }
 
 
使用版本高一點的 jdbc的jar包時加入參數可開啟緩存在url中加參數:
?useServerPrepStmts=true&cachePrepStmts=true&rewriteBatchedStatements=true
     /**
      *  @param args
      *  @throws SQLException
      *  @throws ClassNotFoundException
      */
      public  static  void main(String[] args)  throws ClassNotFoundException,
                SQLException {
           String sqlString = "insert into person values(?,?)";
           Connection conn = jdbcUtils.  getConnection();
           PreparedStatement pst = conn.prepareStatement(sqlString);
             long l = System.  currentTimeMillis();
             for (  int i = 0; i < 10000; i++) {
                pst.setInt(1, i);
                pst.setString(2, "name" + i);
                pst.addBatch();
                  if (i % 1000 == 0) {
                     pst.executeBatch();
                     pst.clearBatch(); // 清空緩存
                }
           }
           pst.executeBatch();
           pst.close();
           conn.close();
           System.  out.println(System.  currentTimeMillis() - l);
     }
 
 

方法:

  1.  
    public static Connection getConnection(){
  2.  
    try {
  3.  
    Class.forName( "com.mysql.jdbc.Driver");
  4.  
    ct = DriverManager.getConnection( "jdbc:mysql://127.0.0.1:3306/test","squirrel","xiaoyang");
  5.  
    } catch (Exception e) {
  6.  
    e.printStackTrace();
  7.  
    }
  8.  
    return ct;
  9.  
    }
  10.  
     
  11.  
    /**釋放數據庫鏈接資源:注意數據庫資源關閉的順序*/
  12.  
    public static void closeConnection(){
  13.  
     
  14.  
    try { //注意關閉數據庫資源的先后順序
  15.  
    if(rs!=null){
  16.  
    rs.close();
  17.  
    } if(ps!=null){
  18.  
    ps.close();
  19.  
    } if(ct!=null){
  20.  
    ct.close();
  21.  
    }
  22.  
    } catch (SQLException e) {
  23.  
    e.printStackTrace();
  24.  
    }
  25.  
    }
  26.  
     

測試方法:

  1.  
    /**
  2.  
    * PreparedStatement批量執行sql
  3.  
    */
  4.  
    public static void excuteBatchInsertDatabase(){
  5.  
     
  6.  
    ct=getConnection();
  7.  
     
  8.  
    try {
  9.  
    ct.setAutoCommit( false);
  10.  
    ps=ct.prepareStatement( "insert into user(name,passwd,age,gender) values(?,?,?,?)");
  11.  
     
  12.  
    ps.setString( 1, "BBBB");
  13.  
    ps.setString( 2, "BBBB");
  14.  
    ps.setInt( 3, 20);
  15.  
    ps.setString( 4, "F");
  16.  
    ps.addBatch();
  17.  
     
  18.  
    ps.setString( 1, "BBBB");
  19.  
    ps.setString( 2, "BBBB");
  20.  
    ps.setInt( 3, 20);
  21.  
    ps.setString( 4, "F");
  22.  
    ps.addBatch();
  23.  
     
  24.  
    /**
  25.  
    * 等價於sql語句:
  26.  
    * insert into user(name,passwd,age,gender) values
  27.  
    * ("BBBB","BBBB",20,'F'),
  28.  
    * ("BBBB","BBBB",20,'F');
  29.  
    */
  30.  
    ps.executeBatch(); //批量執行sql,避免因此單次的insert操作建立多個Connection浪費資源
  31.  
    ct.commit();
  32.  
    } catch (Exception e) {
  33.  
    e.printStackTrace();
  34.  
    try {
  35.  
    ct.rollback();
  36.  
    } catch (SQLException e1) {
  37.  
    e1.printStackTrace();
  38.  
    }
  39.  
    } finally{
  40.  
    closeConnection();
  41.  
    }
  42.  
    }

執行excuteBatchInsertDatabase()方法數據庫記錄:

這里寫圖片描述

數據庫數據記錄表明:sql語句批量執行成功

注意:

批量查詢最好交由一個事務組控制,如果出現操作異常可以進行事務回滾,不至於造成部分數據更新部分數據更新失敗的尷尬局面,避免你臟數據污染數據庫

 

  • 由於 PreparedStatement 對象已預編譯過,所以其執行速度要快於 Statement 對象。因此,多次執行的 SQL 語句經常創建為 PreparedStatement 對象,以提高效率
  • Statement用於執行靜態的sql語句
  • 由於PreparedStatement創建對象消耗資源比較高,所以只執行 一次的sql語句,不使用PreparedStatement

  • 主要目的減少執行計划次數,防止sql注入
  • jdbc 元數據 meta  ,ResultSet.xxx
  • Mysql jdbc 關閉自動提交事務 可提升性能 conn.setAutoCommit(false) ,
  • 歸還conn時 須提前設置為.setAutoCommit(true)
  • rollback()回滾 
  • 批量處理:一次向數據庫發送多個SQL語句時,可以減少通信開銷,從而提高性能。

 

 

 


免責聲明!

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



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