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 }

 

posted @ 2016-12-14 16:24  王可利(Star·星星)  阅读(892)  评论(0编辑  收藏  举报