JDBC入门(3)--- PrepareStatement

一、PrepareStatement概述

  PrepareStatement是Statement接口的子接口;

1、强大之处:

    • 防SQL攻击;
    • 提高代码的可读性;
    • 提高效率;

2、PrepareStatement的用法:

    • 如何得到PrepareStatement对象
      • 给出SQL模板。
      • 调用Connection的PreparedStatement  prepareStatement(String sql模板);
      • 调用pstmt的setXxx()系列方法sql模板中的?赋值
      • 调用pstmt的executeUpdate()或executeQuery(),但它的方法都没有参数。

3、预处理的原理:

    • 服务器的工作:
      • 校验sql语句的语法;
      • 编译:一个与函数相似的东西
      • 执行:调用函数
    • PreparedStatement:
      • 前提:连接的数据库必须支持预处理,几乎没有不支持的。
      • 每一个pstmt都与sql模板绑定在一起,先把sql模板给数据库,数据库先进行校验,再进行编译。执行时只是把参数传递过去而已。
      • 若二次执行时,就不用再次校验语法,也不用再次编译,直接执行。
    • 预处理默认情况是关闭的,可在设置url时添加参数进行开启,如:
String url = "jdbc:mysql://localhost:3306/mydb1?useServerPrepstmts=ture&cachePreStmts=true";

二、什么是SQL攻击

    在需要用户输入的地方,用户输入的是SQL语句的片段,最终用户输入的SQL片段与我们DAO中写的SQL语句合成一句完整的SQL语句,例如用户在登录时输入的用户名和密码都是为SQL语句的片段。

 1 package demo3;
 2 
 3 import org.junit.Test;
 4 import java.io.IOException;
 5 import java.sql.*;
 6 
 7 /**
 8  * PreapredStatement
 9  * 防SQL攻击
10  */
11 public class Demo3 {
12     /**
13      * 登录
14      * 使用username和password去查询数据
15      * 若查询出结果集,说明正确,返回true
16      * 若查询不出结果,说明用户名或密码错误,返回false
17      */
18     public boolean login(String username,String password) throws Exception{
19         /*
20         * 一、得到Connection
21         * 二、得到Statement
22         * 三、得到ResultSet
23         * 四、rs.next()返回的是什么,我们就放回什么
24         * */
25         String driverClassName = "com.mysql.jdbc.Driver";
26         String url = "jdbc:mysql://localhost:3306/mydb1";
27         String mysqlUsername = "root";
28         String mysqlPassword = "";
29         Class.forName(driverClassName);
30         Connection con = DriverManager.getConnection(url,mysqlUsername,mysqlPassword);
31         Statement stmt = con.createStatement();
32         String sql = "SELECT * FROM t_user WHERE username='"+username+"' AND password='"+password+"'";
33         System.out.println(sql);
34         ResultSet rs = stmt.executeQuery(sql);
35         return rs.next();
36     }
37     @Test
38     public void fun1() throws Exception {
39         //SELECT * FROM t_user WHERE username='a' or 'a'='a' AND password='a' or 'a'='a'
40         String username = "a' or 'a'='a";
41         String password = "a' or 'a'='a";
42         boolean bool = login(username,password);
43         System.out.println(bool);//输出为true
44     }
45     public boolean login2(String username,String password) throws Exception {
46         /*
47         * 一、得到Connection
48         * 二、得到Statement
49         * 三、得到ResultSet
50         * 四、rs.next()返回的是什么,我们就放回什么
51         * */
52         String driverClassName = "com.mysql.jdbc.Driver";
53         String url = "jdbc:mysql://localhost:3306/mydb1?useServerPrepstmts=ture&cachePreStmts=true";
54         String mysqlUsername = "root";
55         String mysqlPassword = "";
56         Class.forName(driverClassName);
57         Connection con = DriverManager.getConnection(url, mysqlUsername, mysqlPassword);
58 
59         /*
60         * 一、得到PreparedStatement
61         * 1、给出sql模板:所有的参数使用?来替代
62         * 2、调用Connection方法,得到PreparedStatement
63         * */
64         //SELECT * FROM t_user WHERE username=? AND password=?
65         String sql = "SELECT * FROM t_user WHERE username=? AND password=?";
66         PreparedStatement pstmt = con.prepareStatement(sql);
67         /*
68         * 二、为参数赋值
69         * */
70         pstmt.setString(1,username);//给第1个问号赋值,值为username
71         pstmt.setString(2,password);//给第2个问号赋值,值为password
72         ResultSet rs = pstmt.executeQuery();//调用查询方法,向数据库发送查询语句
73         return rs.next();
74     }
75     @Test
76     public void fun2() throws Exception {
77         String username = "a' or 'a'='a";
78         String password = "a' or 'a'='a";
79         boolean bool = login2(username,password);
80         System.out.println(bool);//输出为fasle
81     }
82     /*
83     * 测试JdbcUtils.getConnection
84     * */
85     @Test
86     public void fun3() throws IOException,ClassNotFoundException,SQLException{
87         Connection con = JdbcUtils.getConnection();
88         System.out.println(con);
89         Connection con1 = JdbcUtils.getConnection();
90         System.out.println(con);
91     }
92 }

 

posted @ 2017-10-06 21:11  gdwkong  阅读(727)  评论(0编辑  收藏  举报