• 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 }
  • 相关阅读:
    php中常用的字符串函数,大全了
    php写的验证码实现方法
    简单的php做的一个验证码生成方案
    ActiveMQ+SpringMVC+Maven应用示例
    zookeeper简单操作
    zookeeper基本概念及原理
    zookeeper 事务日志与快照日志
    activeMQ安装与测试
    activeMQ "HelloWorld"实现
    JMS基本概念
  • 原文地址:https://www.cnblogs.com/gdwkong/p/7632873.html
Copyright © 2020-2023  润新知