【金沙澳门官网7817网址】JDBC入门(3)— PrepareStatement,

用户输入的是SQL语句的片段,例如用户在登录时输入的用户名和密码都是为SQL语句的片段,用户输入的是SQL语句的片段,例如用户在登录时输入的用户名和密码都是为SQL语句的片段,用户输入的是SQL语句的片段,例如用户在登录时输入的用户名和密码都是为SQL语句的片段,l  它是Statement接口的子接口,l  强大之处

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 }

 

PrepareStatement,
一、PrepareStatement概述 PrepareStatement是Statement接口的子接口;
1、壮大之处: 防SQL攻击; 提升代码的可读性;…

二、什么是SQL攻击

二、什么是SQL攻击

JdbcUtils工具类

   
在急需用户输入的地点,用户输入的是SQL语句的一些,最终用户输入的SQL片段与大家DAO中写的SQL语句合成一句完整的SQL语句,比如用户在报到时输入的用户名和密码都是为SQL语句的一对。

String url = "jdbc:mysql://localhost:3306/mydb1?useServerPrepstmts=ture&cachePreStmts=true";

PreparedStatement是什么?

PreparedStatement也叫预编写翻译注解!

PreparedStatement是Statement的子接口,你能够使用PreparedStatement来替换Statement。

PreparedStatement的好处:

l  防止SQL攻击;

l  提升代码的可读性,以可维护性;

l  提升作用。

 

    • 服务器的劳作:
      • 校验sql语句的语法;
      • 编写翻译:二个与函数相似的东西
      • 施行:调用函数
    • PreparedStatement:
      • 前提:连接的数据库必须协理预管理,大致未有不补助的。
      • 每叁个pstmt都与sql模板绑定在一块儿,先把sql模板给数据库,数据库先进行校验,再开始展览编写翻译。施行时只是把参数字传送递过去而已。
      • 若二遍施行时,就不用再行校验语法,也决不再行编写翻译,直接实践。
    • 预管理私下认可情状是关门的,可在安装url时抬高级参照他事他说加以考察数举办开启,如:

2、PrepareStatement的用法:

PreparedStatement

l  它是Statement接口的子接口;

l  庞大之处:

Ø  防SQL攻击;

Ø  进步代码的可读性、可维护性;

Ø  提升效能!

l  学习PreparedStatement的用法:

Ø  怎样获取PreparedStatement对象:

¨      给出SQL模板!

¨      调用Connection的PreparedStatement
prepareStatement(String sql模板);

¨      调用pstmt的setXxx()类别措施sql模板中的?赋值!

¨      调用pstmt的executeUpdate()或executeQuery(),但它的法子都未有参数。

l  预管理的规律

Ø  服务器的职业:

¨      校验sql语句的语法!

¨      编译:一个与函数相似的东西!

¨      实践:调用函数

Ø  PreparedStatement:

¨      前提:连接的数据库必须帮忙预管理!大致从未不援助的!

¨      各个pstmt都与二个sql模板绑定在一块,先把sql模板给数据库,数据库先进行校验,再进行编写翻译。实行时只是把参数字传送递过去而已!

¨      若二遍实行时,就绝不再行校验语法,也休想再行编译!直接施行!

1、强大之处:

    • 服务器的办事:
      • 校验sql语句的语法;
      • 编写翻译:八个与函数相似的东西
      • 实施:调用函数
    • PreparedStatement:
      • 前提:连接的数据库必须辅助预管理,大致从未不扶助的。
      • 每贰个pstmt都与sql模板绑定在一同,先把sql模板给数据库,数据库先举办校验,再进行编写翻译。实践时只是把参数传递过去而已。
      • 若二回进行时,就不用再行校验语法,也毫不再行编写翻译,直接实行。
    • 预管理默许意况是破产的,可在装置url时拉长参数进行开启,如:

光阴项目