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 ...
随机推荐
- SQL中DateTime转换成Varchar样式
SQL中DateTime转换成Varchar样式语句及查询结果:Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AMSelect ...
- 如何实现三个div都自适应(滴滴面试题)
<div class="table"> <div class="accordant"> <div class="box& ...
- [ActionScript 3.0] 通过as3操作web内容
package com.controls.utils { import flash.net.*; import flash.utils.ByteArray; import flash.external ...
- Google 里的软件工程学
简评:原文作者 Fergus Henderson 在 Google 工作了 10 年以上,目前负责 Google 的 text-tospeech 工程小组.有很多书籍或文章会从 商业/管理 等非技术角 ...
- JS实现值复制
在JS中对象一般都是传地址,后续修改也会影响原始数据.例如这样. var a={ b:"b" }; var c=a; c.b="c"; console.log( ...
- notepad++中配置python运行命令
1.安装notepad++ 2.打开notepad++ 3.键盘上按下“F5”,在弹出的命令菜单中输入“cmd /k C:\Python30\python.exe "$(FULL_CURRE ...
- Linux下which命令使用详解(转)
我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索: which 查看可执行文件的位置. whereis 查看文件的位置. locate 配合数据库查看文件位置. f ...
- jquery问题汇总
One:Uncaught SyntaxError: Unexpected token $.post('/ajax/validate.do',{"id": id},function( ...
- 创建自己的区块链合约java版web3接口——以太坊代币(四)
texas-web3j-solidity项目是一个java版本的,使用web3j包和eth网络交互的小程序. 主要实现了以下功能: 1.发布合约 2.发起转账 3.查询交易 4.调用智能合约方法 te ...
- sql在insert时判断有无唯一性冲突
sql在insert时判断有无唯一性冲突,存在相同主键或唯一索引,则不创建 INSERT INTO table(field1, field2, fieldn) SELECT 'field1', 'fi ...