JavaEE學習中,PreparedStatement的簡單使用和介紹(java 學習中的小記錄)
作者:王可利(Star·星星)
PreparedStatement
它是 Statement 的子類,分支。PreparedStatement 繼承於 Statement
數據庫情況如圖:

帳號:liubei
密碼:123
先看代碼演示問題所在:
1 package TwoDay;
2
3 import java.sql.Connection;
4 import java.sql.DriverManager;
5 import java.sql.ResultSet;
6 import java.sql.Statement;
7 import java.util.Scanner;
8
9 public class StarOne {
10 public static void main(String[] args){
11 Connection conn = null;
12 Statement stmt = null;
13 ResultSet rs = null;
14
15 //根據控制台提示輸入用戶名和密碼
16 Scanner input = new Scanner(System.in);
17
18 System.out.println("\t寵物主人登錄");
19 System.out.println("請輸入用戶名:");
20 String name =input.next();
21 System.out.println("請輸入密碼:");
22 String password =input.next();
23
24 try {
25 Class.forName("com.mysql.jdbc.Driver");
26 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/starstudy", "root", "123456");
27 stmt = conn.createStatement();
28 String sql = "SELECT *FROM `master` WHERE `name`= '"+name+"' AND `password`='"+password+"'";//加入參數的時候是:'"+變量+"'
29 System.out.println(sql);
30 //發現問題,把輸入的密碼注入到這個 sql語句裡面去了,如:我輸入的密碼是:123'or'1'='1'
31 //sql的語句就變成 : SELECT *FROM `master` WHERE `name`= 'liubei' AND `password`='123'or'1'='1'
32 //這種現象我們都叫做 使用Statment安全性差,存在SQL注入隱患(原因他用的是拼裝的語句)
33
34 rs = stmt.executeQuery(sql);
35 if (rs.next()) {
36 System.out.println("登陸成功!");
37 }else{
38 System.out.println("登錄失敗!");
39 }
40
41 } catch (Exception e) {
42 // TODO: handle exception
43 }finally{
44 try {
45 if (null!=rs) {
46 rs.close();
47 }
48 if (null!=stmt) {
49 stmt.close();
50 }
51 if (null!=conn) {
52 conn.close();
53 }
54 } catch (Exception e2) {
55 // TODO: handle exception
56 }
57 }
58 }
59 }

出錯總結:
如:當我輸入的密碼是:123'or'1'='1' ,它把輸入的密碼注入到這個 sql語句裡面去了
於是 SQL的語句就變成 : SELECT *FROM `master` WHERE `name`= 'liubei' AND `password`='123'or'1'='1'
程序運行成功,'1'='1' 是默認一定成立的。
這種現象我們都叫做 使用 Statment 安全性差,存在SQL注入隱患(原因它用的是拼裝的語句)
於是就有了 PreparedStatement 用來解決這個問題:

PreparedStatement 的使用步驟實例:

代碼的使用如下:
1 package TwoDay;
2
3 import java.sql.Connection;
4 import java.sql.DriverManager;
5 import java.sql.PreparedStatement;
6
7 public class StarTwo {
8 public static void main(String[] args){
9 Connection conn = null;
10 PreparedStatement pstmt= null;
11
12 String sql = "UPDATE pet SET health=?,love=? WHERE id=?";//不知道的都給他占位符 問號?
13
14 try {
15 Class.forName("com.mysql.jdbc.Driver");
16 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/starstudy", "root", "123456");
17 pstmt = conn.prepareStatement(sql);//執行SQL語句,預編譯
18
19 pstmt.setInt(1,1234); //這裡第幾個問號 就是 第幾個索引(第一個參數)
20 pstmt.setInt(2, 88);
21 pstmt.setInt(3, 2);
22
23 pstmt.executeUpdate();//修改的方法
24
25 } catch (Exception e) {
26
27 }finally{
28 try {
29 if (null!=pstmt) {
30 pstmt.close();
31 }
32 if (null!=conn) {
33 conn.close();
34 }
35 } catch (Exception e2) {
36 }
37 }
38 }
39 }