JDBC-預編譯-批量寫入

說明:

數據庫:mysql

庫名:test

表名:user

字段:name varchar(50);id int.

一、JDBC
我們知道,要做一個jdbc查詢操作要經歷如下步驟:
1、加載類驅動
Class.forName("com.mysql.jdbc.Driver");
2、獲取連接connection
String user = "root";
String pass = "root";
String url = "jdbc:mysql://localhost:3306/test";
Connection conn = DriverManager.getConection(user, pass, url);
3、創建語句對象
Statement stmt = conn.CreateStatment();
4、執行jdbc操作(比如執行查詢),並獲得結果集
ResultSet rs = stmt.executeQuery("select name, id from user");
5、遍歷結果集
while(rs.next()){
    String name = rs.getString(1);
    Integer id = rs.getInt(2);
    System.out.println("name:"+name + ",id:"+id);
}
6、關閉資源
rs.close();
stmt.close();
conn.close();

常規的語句對象有兩個缺點
a、每次操作都需要包sql語句傳送給服務器,就算是執行相同的操作也是如此。如此以來帶寬就被無情的浪費了。
b、對常規的語句對象,可能會產生sql注入問題,不安全。

二、預編譯

可能是爲了解決上面的缺陷,PreparedStatment應運而生。

獲取連接時需要傳入一個參數開啓預編譯。
String url = "jdbc:mysql://localhost:3306/test?useServerPrepStmts=true";
創建語句對象時要改成佔位符形式傳參
PreparedStatement  pstmt = conn.prepareStatement("select name, id from user where id =?");
pstmt.setInt(1, 1);

三、批量寫入

但是僅僅是這樣還不夠,雖然安全了,但是性能反而降低了。對於需要執行多次的操作,比如插入操作,在性能上表現就會很差。
爲了解決這個問題,我們需要開啓批量寫入功能
獲取連接時需要開啓批量寫。
String url = "jdbc:mysql://localhost:3306/test?useServerPrepStmts=true&rewriteBatchedStatement=true";
創建語句對象時可以這麼寫
    PreparedStatement  pstmt = conn.prepareStatement("insert into user (name, id) values(?,?)");
    for(int i=0;i<100;i++){
        pstmt.setString(1, "tom");
        pstmt.setInt(2, i);
        pstmt.addBatch();
    }
    pstmt.executeBatch();

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章