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 }