JDBC入门(3)--- PrepareStatement
一、PrepareStatement概述
PrepareStatement是Statement接口的子接口;
1、强大之处:
- 防SQL攻击;
- 提高代码的可读性;
- 提高效率;
2、PrepareStatement的用法:
- 如何得到PrepareStatement对象
- 给出SQL模板。
- 调用Connection的PreparedStatement prepareStatement(String sql模板);
- 调用pstmt的setXxx()系列方法sql模板中的?赋值
- 调用pstmt的executeUpdate()或executeQuery(),但它的方法都没有参数。
- 如何得到PrepareStatement对象
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的更多相关文章
- Jdbc入门
JDBC入门 l 导jar包:驱动! l 加载驱动类:Class.forName(“类名”); l 给出url.username.password,其中url背下来! l 使用DriverMa ...
- day17(JDBC入门&jdbcUtils工具介绍)
day17 JDBC整体思维导图 JDBC入门 导jar包:驱动! 加载驱动类:Class.forName("类名"); 给出url.username.password,其中url ...
- Java jdbc入门
1 jdbc入门 1.1 之前操作数据 1)通过mysql的客户端工具,登录数据库服务器 (mysql -u root -p 密码) 2)编写sql语句 3)发送sql语句到数据库服务器执行 1.2 ...
- JAVA企业级开发-jdbc入门(09)
一. jdbc介绍 JDBC全称为:Java DataBase Connectivity(java数据库连接). SUN公司为了简化.统一对数据库的操作,定义了一套Java操作数据库的规范,称之为JD ...
- 1 初识数据库操作 2 JDBC 入门
1 JDBC:Java Database Connectivity(Java 数据库连接) 1.1 JDBC 入门程序 注册驱动:Class.forName("com.mysql.cj.jd ...
- 【JDBC】JDBC入门
JDBC的入门 搭建开发环境 编写程序,在程序中加载数据库驱动 建立连接 创建用于向数据库发送SQL的Statement对象 从代表结果集的ResultSet中取出数据 断开与数据库的连接,并释放相关 ...
- JDBC学习一---JDBC入门
原文链接 今天开始会写一系列 Java 后端学习的笔记,一方面是为了以后翻阅查看,更主要的原因是通过写作输出的方式让自己的印象更深,避免遗忘. 首先是简单记录下自己学习使用 JDBC 的历程,由于目前 ...
- JDBC入门学习
Introduction What's JDBC JDBC stands for Java Database Connectivity, which is a standard Java API fo ...
- mysql的jdbc入门学习小结
转自:专注JavaWeb开发 http://www.javaweb1024.com/data/MySQL/2015/04/25/618.html 一.jdbc基本概念jdbc : Java Datab ...
随机推荐
- item pipeline 实例:爬取360摄像图片
生成项目 scrapy startproject image360 cd Image360 && scrapy genspider images images.so.com 一. 构 ...
- python接口自动化发送get请求 详解(一)
前言:接口自动化实现自动化脚本比较稳定,主要用到requests模块,后面我会把这个模块单独拉出来写一下. 一.环境安装 1.用pip安装requests模块 >>pip install ...
- POJ 2196
#include <iostream> using namespace std; int sum_10; int sum_12; int sum_16; int fun_10(int nu ...
- shell-008:检测502
检测502的方法有多种 1.curl他的状态码(不建议,会对网站造成不必要的访问和多余的日志输出) 2.可以直接检测访问日志 下面用while做成一个死循环监控日志502的状态 #!/bin/bash ...
- python全栈开发_day15_模块学习
一:模块 1)什么是模块 每一个py文件就是一个模块 导入模块,会编译执行 1.形成一个对应的pyc文件 2.产生该模块自己的店全局名称空间 3.在使用该模块的全局名称空间中产生一个名字(导入的模块名 ...
- Javascript框架设计思路图
这个系列的随笔都是关于Javascript框架设计一书的读书笔记(作者是司徒正美),不是本人原创!!! 一.简介: 1.市面上主流的JS框架,大多数是由一个个模块组合而成,模块化是大多数让软件所遵循的 ...
- Git克隆与更新代码
一.克隆项目 除了可以向GitHub上提交项目外,更多的时候是我们到上面克隆(下载)优秀的开源项目来用,当然也可以将使用过程中发现的bug,通过建立分支的方式提交给项目的原作者. 现在的场景是在家将项 ...
- JavaScript设计模式-21.命令模式
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- C#控件的Resize事件
1. 当控件大小发生改变时,就会触发该事件 所以适合动态调整UI的布局, 例如: 国际化,不同语言导致控件长度不同: 控件的内容是动态增加的,也可以使用. 2.必须是大小会发生改变的控件才会触发该事件 ...
- [中英对照]User-Space Device Drivers in Linux: A First Look | 初识Linux用户态设备驱动程序
如对Linux用户态驱动程序开发有兴趣,请阅读本文,否则请飘过. User-Space Device Drivers in Linux: A First Look | 初识Linux用户态设备驱动程序 ...