一、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 }

JDBC入门(3)--- PrepareStatement的更多相关文章

  1. Jdbc入门

    JDBC入门 l  导jar包:驱动! l  加载驱动类:Class.forName(“类名”); l  给出url.username.password,其中url背下来! l  使用DriverMa ...

  2. day17(JDBC入门&jdbcUtils工具介绍)

    day17 JDBC整体思维导图 JDBC入门 导jar包:驱动! 加载驱动类:Class.forName("类名"); 给出url.username.password,其中url ...

  3. Java jdbc入门

    1 jdbc入门 1.1 之前操作数据 1)通过mysql的客户端工具,登录数据库服务器  (mysql -u root -p 密码) 2)编写sql语句 3)发送sql语句到数据库服务器执行 1.2 ...

  4. JAVA企业级开发-jdbc入门(09)

    一. jdbc介绍 JDBC全称为:Java DataBase Connectivity(java数据库连接). SUN公司为了简化.统一对数据库的操作,定义了一套Java操作数据库的规范,称之为JD ...

  5. 1 初识数据库操作 2 JDBC 入门

    1 JDBC:Java Database Connectivity(Java 数据库连接) 1.1 JDBC 入门程序 注册驱动:Class.forName("com.mysql.cj.jd ...

  6. 【JDBC】JDBC入门

    JDBC的入门 搭建开发环境 编写程序,在程序中加载数据库驱动 建立连接 创建用于向数据库发送SQL的Statement对象 从代表结果集的ResultSet中取出数据 断开与数据库的连接,并释放相关 ...

  7. JDBC学习一---JDBC入门

    原文链接 今天开始会写一系列 Java 后端学习的笔记,一方面是为了以后翻阅查看,更主要的原因是通过写作输出的方式让自己的印象更深,避免遗忘. 首先是简单记录下自己学习使用 JDBC 的历程,由于目前 ...

  8. JDBC入门学习

    Introduction What's JDBC JDBC stands for Java Database Connectivity, which is a standard Java API fo ...

  9. mysql的jdbc入门学习小结

    转自:专注JavaWeb开发 http://www.javaweb1024.com/data/MySQL/2015/04/25/618.html 一.jdbc基本概念jdbc : Java Datab ...

随机推荐

  1. OI中一些常见实用的套路【更新中】

    数据结构 在维护树上路径时,如果只是点的独立的加减,可以考虑用括号序来维护(拆成两部分) 需要求树上很多路径中k近/距离和 一类,考虑点分治/在点分树上解决. 子树求和可以转化为DFS序上区间求和 树 ...

  2. 洛谷 P2014 选课(树形背包)

    洛谷 P2014 选课(树形背包) 思路 题面:洛谷 P2014 如题这种有依赖性的任务可以用一棵树表示,因为一个儿子要访问到就必须先访问到父亲.然后,本来本题所有树是森林(没有共同祖先),但是题中的 ...

  3. Array flat的实现

    if (!Array.prototype.flat) { Array.prototype.flat = function (num = 1) { if (!Number(num) || Number( ...

  4. C#二进制位算 权限

    关于权限管理,之前所做的都是一个权限对应一条数据,比方A页面有增删改查四个权限,那么用户在权限管理表中相对应AA页面有四条记录.后来改用二进制运算,发现省事很多. 首先说下位运算 熟悉一下操作符,懒得 ...

  5. Mac下使用crontab来实现定时任务

    说明: 1.Linux和Mac下操作crontab都是一致的 2.配置文件都在/etc/crontab下,如果没有就创建. 3.测试发现直接使用crontab -e命令创建的定时任务是放在临时文件夹的 ...

  6. 一段自用javascript代码

    function jsontoarray(mjson) { var arr = []; ; for(var x in mjson.data){ arr[i] = new Array(); arr[i] ...

  7. (转)Windows上使用CMake

    CMake简介 原文:http://blog.gclxry.com/use-cmake-on-windows/ 你或许听过好几种 Make 工具,例如 GNU Make ,QT 的 qmake ,微软 ...

  8. hibernate关联关系的crud2

    hibernate关联关系的CRUD操作,解释都在注释里了,讲了fetchType.cascade. User类: package com.oracle.hibernate; import javax ...

  9. python-fork聊天室

    服务端 #!/usr/bin/python from socket import * import sys import os class Node(object): def __init__(sel ...

  10. Django的国际化

    Django的国际化 Django基于python的gettext来实现国际化.其过程为安装gettext工具,然后再代码中调用指定方法,然后用gettext提供的程序来把代码中需要翻译的部分找出来写 ...