程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> JavaEE學習中,PreparedStatement 的復雜運用 和 引見(java 學習中的小記載)

JavaEE學習中,PreparedStatement 的復雜運用 和 引見(java 學習中的小記載)

編輯:關於JAVA

JavaEE學習中,PreparedStatement 的復雜運用 和 引見(java 學習中的小記載)。本站提示廣大學習愛好者:(JavaEE學習中,PreparedStatement 的復雜運用 和 引見(java 學習中的小記載))文章只能為提供參考,不一定能成為您想要的結果。以下是JavaEE學習中,PreparedStatement 的復雜運用 和 引見(java 學習中的小記載)正文


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 }

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved