java.sql.PreparedStatement(SQL預處理)
防止SQL注入
只要你的sql參數是用戶提供過來的都需要使用sql預處理
設置參數的時候需要選擇對應數據類型進行設置,要不然處理類型的時候會有問題
setObject 此方法有一個好處就是,你可以給它任何類型,自己進行類型判斷,識別你的類型進行設置
sql防注入代碼舉例:
import java.sql.*;
import java.util.Arrays;
import java.util.Scanner;
public class T4 {
public static void main(String[] args) throws SQLException {
java.util.Scanner input = new Scanner(System.in);
System.out.print("請輸入您的登錄賬號:");
String Account = input.next();
System.out.print("請輸入您的登錄密碼:");
String Password = input.next();
Connection connection = T3.getT3().getconnection();
Statement statement = connection.createStatement();
PreparedStatement pst = connection.prepareCall("select *from zangu where account=? AND password=?");
// 用Connection對象中的prepareCall類來接收sql語句 再創建PreparedStatement接口對象
pst.setString(1, Account);
//通過PreparedStatement類來調用其中的setString方法你要輸人的是第幾個 這裏我們選擇的是String類型所以輸入的是字符串類型
//當然你也可以選擇PreparedStatement中的int方法
pst.setString(2, Password);
//這裏原理同上通過PreparedStatement類來調用其中的setString方法你要輸人的是第幾個 並輸入類型
ResultSet resultSet = pst.executeQuery();
//通過PreparedStatement 創建查詢
//這裏創建ResultSet記錄集對象類接受查詢號的 resultSet記錄集
statement.executeUpdate("create table zangu(zid int(11)primary key,account varchar(100)," +
"password varchar(100))engine=innodb charset=utf8");//創建表只允許一次,注意如果在調用這個類又會創建一次就會報錯
statement.executeUpdate("insert into zangu values(1,'張三','123456') ");
ResultSet resultSet = statement.executeQuery("select *from zangu where account='"+
Account+"'and password='"+Password+"'");//這樣子驗證存在sql注入問題 ‘ or ''=' 這樣會從本質上改寫代碼sql防注入批處理添加
PreparedStatement/*注意這個是批處理的類*/ pst = connection.prepareStatement("INSERT into zangu values(?,?,?)");
pst.setObject(1, 2);
pst.setObject(2, "李四");
pst.setString(3, "0");
pst.addBatch();//執行批處理每局代碼後面都要調用這個方法
pst.setObject(1, 3);
pst.setObject(2, "趙六");
pst.setObject(3, "125");
pst.addBatch();
pst.setObject(1, 4);
pst.setObject(2, "嘻嘻哈哈");
pst.setObject(3, "315");
pst.addBatch();
int a[] = pst.executeBatch();//調處批處理接過叫給數組啊
System.out.println(Arrays.toString(a));//打印記錄
}
}