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 }
作为程序猿界的一股泥石流,希望作为老司机的你们 ,可以带带我~ O(∩_∩)O