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 ...
随机推荐
- 记录一次因为意外断电造成gitlab(docker容器)重启之后无法访问的问题
容器启动成功,但是处于unhealthy状态,登录界面500. docker logs gitlab 最终错误是 err="opening storage failed: open bloc ...
- hiho# 1394最小路径覆盖 网络流拆点
题目传送门 思路: 观察到路径上除了终点起点以外的每个点出度和入度都为1,和网络流的拆点很像,所以就把每个点都拆成两个点,若存在一条路径$(u,v)$,则建一条$(u,v+n,1)$的边,然后求出最大 ...
- 工程手机设置apn
http://android.stackexchange.com/questions/117125/how-do-i-add-an-apn-via-adb xiaomi3 su mount permi ...
- js实现瀑布流布局
window.onload = function () { var d1 = new Waterfall(); d1.init();};//构造函数function Waterfall() { thi ...
- Mac 10.12安装VirtualBox
说明:用VirtualBox主要是能开无缝模式. 下载: (链接: https://pan.baidu.com/s/1i5y78Ct 密码: e3bq)
- Mac 10.12安装Homebrew图形化界面管理工具Cakebrew
下载: (链接: https://pan.baidu.com/s/1mivJ9H2 密码: f8dr)
- Mac下一台电脑管理多个SSH KEY(转)
一.关于ssh是什么? http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html 二.需求: 一台电脑上(Mac os)管理多个ssh ...
- 使用大白菜安装Windows Server 2012 r2
依照往常安装win10的习惯操作,结果发现无GUI界面.重装时注意到了两个问题: 1. 启动时有两个U盘启动选项,请选择无UEFI的模式启动: 2. 一键安装系统时,一定要点一下系统文件来源的地方,因 ...
- Linux 命令 su 和 sudo 比较
su : 可以用来切换到任何用户,但是要求输入目标用户的密码 比如:su - su - root (等价 su -) su - user su root 与 su - root 的区别在于,后者不切换 ...
- 老司机谈APK瘦身套路-图片资源篇
APK作为Android系统安装包的文件格式,一直备受广大用户的关注,APK越是臃肿肥大,在下载安装过程中,它们耗费的流量会越多,安装等待时间也会越长:对于产品本身,意味着下载转化率会越低(因为竞品中 ...