1. Statement在字符串拼接(變量使用)時顯現弊端
使用變量時(涉及拼接字符串):Statement表達比較麻煩,我們用PrepareStatement來替代
之所以使用到PrepareStatement來處理鍵盤獲取輸入信息,是因爲Statement暴露了弊端–字符串拼接的問題。
舉個例子:
-
從鍵盤輸入姓名: 張三丰 (程序中變量設爲stuname)
-
從鍵盤輸入年齡:78 (程序中變量設爲age)
使用Statement的場景:
String sql = "INSERT INTO stu_info VALUES ('"+stuname+"',"+age+");";
大家可以看到,
-
當變量爲字符串時:’ ’ 、" "、+ + ,同時用於變量表達,
-
當變量爲數字時:" "、+ + ,同時用於變量表達。
不說其他的,換做是你,你想使用這種表達方式嗎?你比較熟悉還好,上來就可以寫,但是如果你不熟悉怎麼辦?寫一次,百度一次?是不是很麻煩?這種表達確實麻煩,這也是Statement在處理這個問題時的弊端所在。
2. PrepareStatement提供良好字符串拼接(變量使用)方案
果真,物競天擇,適者生存。哪個好用,我們就用哪個。
下面我們來說,PrepareStatement在變量引用方面的優勢:
// 增:
String sql="INSERT INTO stu_info VALUES (?,?);";
//創建PrepareStatement
PreparedStatement pst = conn.prepareStatement(sql);
//把變量賦值給sql語句
pst.setString(1,stuname); //將鍵盤輸入的stuname,賦值給第1個?問號
pst.setInt(2,age); //將鍵盤輸入的age,賦值給第2個?問號
大家看到這種表達了嗎?
只需要使用setString來告訴我們的sql語句,第幾個問號,表達的是什麼內容即可,就這麼簡潔。
比如:
pst.setString(1,stuname); //將鍵盤輸入的stuname,賦值給第1個?問號
pst.setInt(2,age); //將鍵盤輸入的age,賦值給第2個?問號
3. 程序對比展示
1. 自行準備jar包,並導入到項目中。
2.程序部分。
import java.sql.*;
import java.util.Scanner;
public class JDBCDemoPrep {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//獲取鍵盤輸入
Scanner input = new Scanner(System.in);
System.out.println("請輸入姓名:");
String stuname = input.next();
System.out.println("請輸入年齡:");
int age = input.nextInt();
//1.註冊驅動
Class.forName("com.mysql.jdbc.Driver");
//2.連接數據庫
String url = "jdbc:mysql://localhost:3306/test";
Connection conn = DriverManager.getConnection(url,"root","88888888");
//3.操作數據庫
/*
//此爲Statement的寫法:
//寫法1(Statement只能用此法,也因爲此Statement顯現了第一個弊端--字符串拼接麻煩\使用本地輸入信息比較麻煩、涉及單引號、雙引號、++的組合問題)
//增:
//String sql = "INSERT INTO stu_info VALUES ('"+stuname+"',"+age+");";
//改:
//String sql = "UPDATE stu_info SET age = "+age+" WHERE stuname ='"+stuname+"';";
//刪:
String sql = "DELETE FROM stu_info WHERE stuname ='"+stuname+"';";
//創建Statement
Statement st = conn.createStatement();
//執行sql語句
st.executeUpdate(sql);
* */
//PrepareStatement的寫法
// 增:
//String sql="INSERT INTO stu_info VALUES (?,?);";
//改:
//String sql = "UPDATE stu_info SET stuname =? WHERE age = ?;";
//刪:
String sql = "DELETE FROM stu_info WHERE stuname =? AND age = ?;";
//創建PrepareStatement
PreparedStatement pst = conn.prepareStatement(sql);
//把變量賦值給sql語句
pst.setString(1,stuname); //將鍵盤輸入的stuname,賦值給第1個?問號
pst.setInt(2,age); //將鍵盤輸入的age,賦值給第2個?問號
//執行sql
pst.executeUpdate();
//4.關閉資源
conn.close();
input.close();
pst.close();
}
}
4. 程序功能介紹與結果演示
程序功能介紹與結果演示:
- 最初數據庫的數據表中爲空。
- PrepareStatement 增
// 增:
String sql="INSERT INTO stu_info VALUES (?,?);";
鍵盤輸入:
功能解釋:向數據庫test中表【stu_info】中添加人員信息 名:張三丰 年齡: 79 的信息條。
結果展示:
- PrepareStatement 改
//改:
String sql = "UPDATE stu_info SET stuname =? WHERE age = ?;";
鍵盤輸入:
功能解釋:修改數據庫test中表【stu_info】中添加人員信息名:年齡爲 79的人員的姓名 改爲 張無忌 。
結果展示:
3. PrepareStatement 刪
//刪:
String sql = "DELETE FROM stu_info WHERE stuname =? AND age = ?;";
鍵盤輸入:
功能解釋:刪除數據庫test中表【stu_info】中人員信息 名: 張無忌 年齡 79 的信息。
結果展示: