Java開發技術之淺談Statement的不足
1、PreparedStatement概述
可以通過呼叫 Connection 物件的 preparedStatement(String sql) 方法獲取 PreparedStatement 物件
PreparedStatement 介面是 Statement 的子介面,它表示一條預編譯過的 SQL 語句
- PreparedStatement 物件所代表的 SQL 語句中的引數用問號(?)來表示,呼叫 PreparedStatement 物件的 setXxx() 方法來設定這些引數. setXxx() 方法有兩個引數,第一個引數是要設定的 SQL 語句中的引數的索引(從 1 開始),第二個是設定的 SQL 語句中的引數的值
- ResultSet executeQuery()執行查詢,並返回該查詢生成的 ResultSet 物件。
- int executeUpdate():執行更新,包括增、刪、該
2、Statement的不足
(1)SQL拼接
(2)SQL注入
SQL 注入是利用某些系統沒有對使用者輸入的資料進行充分的檢查,而在使用者輸入資料中注入非法的 SQL 語句段或命令,從而利用系統的 SQL 引擎完成惡意行為的做法。對於 Java 而言,要防範 SQL 注入,只要用 PreparedStatement 取代 Statement 就可以了。
(3)處理Blob型別的資料
BLOB (binary large object),二進位制大物件,BLOB常常是資料庫中用來儲存二進位制檔案的欄位型別。
插入BLOB型別的資料必須使用PreparedStatement,因為BLOB型別的資料無法使用字串拼接寫的。
MySQL的四種BLOB型別(除了在儲存的最大資訊量上不同外,他們是等同的)
實際使用中根據需要存入的資料大小定義不同的BLOB型別。
需要注意的是:如果儲存的檔案過大,資料庫的效能會下降。
CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL, `head_picture` mediumblob PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; |
package com.jdbc; import java.io.FileInputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.util.Properties; public class TestBlob { public static void main(String[] args) throws Exception{ //載入jdbc.properties資源配置檔案 Properties pro = new Properties(); pro.load(ClassLoader.getSystemResourceAsStream(“jdbc.properties”)); //1、載入與註冊驅動 Class.forName(pro.getProperty(“driver”)); //2、獲取資料庫連線 Connection conn = DriverManager.getConnection(pro.getProperty(“url”), pro); //3、訪問資料庫 //(1)準備帶引數(?)的SQL //PreparedStatement 介面是 Statement 的子介面,它表示一條預編譯過的 SQL 語句 //PreparedStatement 物件所代表的 SQL 語句中的引數用問號(?)來表示 String sql =”insert into user(username,head_picture) value(?,?)”; //(2)通過呼叫 Connection 物件的 preparedStatement(String sql) 方法獲取 PreparedStatement 物件 PreparedStatement pst = conn.prepareStatement(sql); //(3)呼叫 PreparedStatement 物件的 setXxx(int parameterIndex,XX value) 方法來設定這些引數 pst.setString(1, “lily”); pst.setBlob(2, new FileInputStream(“head/girl.jpg”)); //(4)呼叫PreparedStatement的executeUpdate()執行SQL語句進行插入 //注意此處不能在傳sql,否則?就白設定了 int len = pst.executeUpdate(); //(5)處理結果 if (len > 0) { System.out.println(“新增成功”); } else { System.out.println(“新增失敗”); } //4、釋放資源 pst.close(); conn.close(); } } |
想了解更多java培訓開發技術知識,請關注我,有更多精彩內容呈現!
文章轉載連結:http://www.atguigu.com/jsfx/13017.html