javaWeb_JDBC_PreparedStatemment的使用
JDBC基礎_PreparedStatement
1.使用PreparedStatement的好處(why)
(1).PreparedStatement是Statement的子接口,可以傳入帶占位符的sql語句,並提供補充占位符變量的方法。
(2).在使用Statement的時候需要進行sql的拼寫,容易出錯,而且很麻煩,使用PreparedStatement的時候可以避免拼寫。
(3).可以防止sql註入
SQL 註入是利用某些系統沒有對用戶輸入的數據進行充分的檢查,而在用戶輸入數據中註入非法的 SQL 語句段或命令,
從而利用系統的 SQL 引擎完成惡意行為的做法對於 Java 而言,要防範 SQL 註入,只要用 PreparedStatement 取代 Statement 就可以了
(4).PreparedStatement 能最大可能提高性能
DBServer會對預編譯語句提供性能優化。因為預編譯語句有可能被重復調用,所以語句在被DBServer的編譯器編譯後的執行代碼被緩存下來,
那麽下次調用時只要是相同的預編譯語句就不需要編譯,只要將參數直接傳入編譯過的語句執行代碼中就會得到執行。
在statement語句中,即使是相同操作但因為數據內容不一樣,所以整個語句本身不能匹配,沒有緩存語句的意義.事實是沒有數據庫會對普通語句
編譯後的執行代碼緩存.這樣每執行一次都要對傳入的語句編譯一次
2.如何使用PreparedStatement(how)
(1).創建PreParedStatement對象
(2).改變sql以及傳入sql的參數,並調用PreparedStatement(sql)方法
如:
String sql = "insert student values(?,?,?,?,?,?)";
PreparedStatement ps = conn.PreparedStatement(sql);
(3).調用PreparedStatement的setXxx(int index,Object values);對sql中的參數賦值(也即是占位符)
註意:index索引值從1開始
(4).執行sql語句,調用相應的executeQuery()或者是executeUpdate()方法,註意這倆個方法中不需要再傳入sql語句。
3.代碼測試
(1).一個基本的sql代碼測試
/**
* PreParedStatement使用測試
*
*/
public static void testPreparedStatement(){
Connection connection = null;
PreparedStatement preparedStatement = null;
try {
connection = JDBCTools.getConnection();
String sql = "INSERT INTO teacher (name, email, birth) VALUES(?,?,?)";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, "張三");
preparedStatement.setString(2, "[email protected]");
//註意這裏面對Date的處理sql-Date包裝一個util-Date
preparedStatement.setDate(3,new Date(new java.util.Date().getTime()));
preparedStatement.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCTools.releaseDB(null, preparedStatement, connection);
}
}
//省略JDBCTools
(2).PreParedStatement操作對象測試(可變參數的使用)[*****]
//添加的方法
/**
* 執行 SQL 語句, 使用 PreparedStatement
* @param sql
* @param args: 填寫 SQL 占位符的可變參數
*/
public static void update(String sql, Object ... args){
Connection connection = null;
PreparedStatement preparedStatement = null;
try {
connection = JDBCTools.getConnection();
preparedStatement = connection.prepareStatement(sql);
for(int i = 0; i < args.length; i++){
preparedStatement.setObject(i + 1, args[i]);
}
preparedStatement.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally{
JDBCTools.releaseDB(null, preparedStatement, connection);
}
}
//測試代碼
public static void addNewStudent2(Student student) {
String sql = "INSERT INTO student(studentName, age, nativePlace) VALUES(?,?,?)";
JDBCTools.update(sql, student.getStudentName(), student.getAge(),
student.getNativePlace());
}
//調用
public static void main(String[] args) {
Student student = new Student();
student.setStudentName("王五");
student.setAge(18);
student.setNativePlace("中國雲南");
JDBCTest.addNewStudent2(student);
}
javaWeb_JDBC_PreparedStatemment的使用