一、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. 实例的初始化由JVM装载类的时候进行,保证了线程的安全性

    在23种设计模式中,单例是最简单的设计模式,但是也是很常用的设计模式.从单例的五种实现方式中我们可以看到程序员对性能的不懈追求.下面我将分析单例的五种实现方式的优缺点,并对其在多线程环境下的性能进行测 ...

  2. Myeclipse设置自动联想功能

    ///声明,博客园暂无转载功能,这篇博客是转载自贞心真义. 最近初学Java,正在使用MyEclipse来编写新的项目,刚开始打开MyEclipse感觉这个工具既陌生又熟悉,熟悉之处在于编辑器的几大共 ...

  3. java_对象序列化

    对象序列化(serializable) 序列化读:ObjectInputStream  ois=new ObjectInputStream(new FileInputStream("./gg ...

  4. leetcode-292-Nim Game(搬石子)

    题目描述: You are playing the following Nim Game with your friend: There is a heap of stones on the tabl ...

  5. Universal-Image-Loader完全解析(下)

    Universal-Image-Loader完全解析(下) 在这篇文章中,我会继续跟大家分享有关于Universal-Image-Loader框架的相关知识,这次主要分享的是框架中图片缓存方面的知识. ...

  6. xampp使用技巧及问题汇总

    1)在win7上同时装有IIS 和 xampp1.8.2 ,会出现Apache启动时,提示80端口被占用的情况(一般是iis安装之后出现的常见情况). 情况1:  xampp 在启动时会检测Apach ...

  7. MySQL 备份数据库

    一.数据备份 1.备份一个数据库 mysqldump基本语法: mysqldump -u username -p dbname table1 table2 ...-> BackupName.sq ...

  8. 四大组件之Activity Task任务栈4种启动模式

    1.启动模式 standard,创建一个新的Activity. singleTop,栈顶不是该类型的Activity,创建一个新的Activity.否则,onNewIntent. singleTask ...

  9. python-Lock进程同步解决互斥

    #!/usr/bin/python from multiprocessing import Process,Lock import time,sys def A(lock): with lock: f ...

  10. Java的接口(interface)属性和方法的类型

    接口的属性必须是public static final Type 接口的方法必须是public abstract Type 不管你是全写,或只写部分,系统都会自动按上面的要求不全 也就是说 接口中 所 ...