1. 程式人生 > >25.【批處理及PreparedStatement物件】

25.【批處理及PreparedStatement物件】

批處理

當向資料庫傳送多條不同的SQL語句時,可以使用Statement實現批處理。Statement通過addBatch()方法新增一條SQL語句,通過executeBatch()方法批量執行SQL語句。

public static void main(String[] args)

{

Connection conn=null;

Statement stmt=null;

try {

conn=JDBCUtils.getConnection();

stmt=conn.createStatement();

//sql語句

   String sql1="drop table if exists school";

String sql2="create table school(id int,name varchar(20))";

String sql3="insert into school values(2,'傳智播客')";

String sql4="update school set id=1";

//Statement批處理SQL語句

stmt.addBatch(sql1);
stmt.addBatch(sql2);
stmt.addBatch(sql3);
stmt.addBatch(sql4);
stmt.executeBatch();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
finally{
JDBCUtils.release(null, stmt,conn);
}
}

PreparedStatement物件

Statement物件每次執行SQL語句時,都會對其進行編譯。當相同的SQL語句執行多次時,Statement物件就會使資料庫頻繁編譯相同的SQL語句,從而降低資料庫的訪問效率。。為了解決這個問題,PreparedStatement應運而生。也就是說,當相同的SQL語句再次執行時,資料庫只需要使用緩衝區中的資料,而不需要對SQL語句再次編譯,從而有效提高資料的訪問效率。 這個介面可以傳入引數化的SQL語句,防止SQL注入.

public static void main(String[] args) throws SQLException {

        Connection conn = null;

        PreparedStatement preStmt = null;

        try {
            // 載入資料庫驅動
            Class.forName("com.mysql.jdbc.Driver");
            String url = "jdbc:mysql://localhost:3306/jdbc";
            String username = "root";
            String password = "root";
            // 建立應用程式與資料庫連線的Connection物件
            conn = DriverManager.getConnection(url, username, password);
// 執行的SQL語句
            String sql = "INSERT INTO users(name,password,email,birthday)" + "VALUES(?,?,?,?)";

            // 建立執行SQL語句的PreparedStatement 物件
            preStmt = conn.prepareStatement(sql);
            preStmt.setString(1, "zl");
            preStmt.setString(2, "123456");
            preStmt.setString(3, "
[email protected]
"); preStmt.setString(4, "1989-12-23"); preStmt.executeUpdate(); } catch (ClassNotFoundException e) { e.printStackTrace(); } finally { // 釋放資源 if (preStmt != null) { try { preStmt.close(); } catch (SQLException e) { e.printStackTrace(); } preStmt = null; } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } conn = null; } } }

PreParedStatement批處理

當向同一個資料表中批量更新資料時,如果使用Statement,需要書寫很多SQL語句,這時,為了避免重複程式碼的書寫,可以使用PreparedStatement實現批處理。與Statement相比,PreparedStatement靈活許多,它既可以使用完整的SQL,也可以使用帶引數的不完整SQL.但是,對於不完整的SQL,其具體的內容是用“?”佔位符形式出現的,設定時要按照“?”順序設定具體 的內容。

 public static void main(String[] args) throws SQLException {
        Connection conn = null;
        PreparedStatement preStmt = null;
        try {
            // 載入資料庫驅動
            Class.forName("com.mysql.jdbc.Driver");
            String url = "jdbc:mysql://localhost:3306/jdbc";
            String username = "root";
            String password = "root";
            // 建立應用程式與資料庫連線的Connection物件
            conn = DriverManager.getConnection(url, username, password);
// 執行的SQL語句
            String sql = "INSERT INTO users(name,password,email,birthday)"  + "VALUES(?,?,?,?)";

            preStmt = conn.prepareStatement(sql);

            for (int i = 0; i < 5; i++) {

                preStmt.setString(1, "name" + i);

                preStmt.setString(2, "password" + i);

                preStmt.setString(3, "email" + i + "@itcast.cn");

                preStmt.setDate(4, Date.valueOf("1989-02-19"));

                preStmt.addBatch();

            }

            preStmt.executeBatch();

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {    // 釋放資源
            if (preStmt != null) {
                try {
                    preStmt.close();

                } catch (SQLException e) {
                    e.printStackTrace();
                }
                preStmt = null;
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                conn = null;
            }
        }
    }