本专栏主要是记录学习完JavaSE后学习JavaWeb部分的一些知识点总结以及遇到的一些问题等,如果刚开始学习Java的小伙伴可以点击下方连接查看专栏
本专栏地址:🔥JDBC
Java入门篇: 🔥Java基础学习篇
Java进阶学习篇(持续更新中):🔑Java进阶学习篇
文章目录
- 一、前言
- 二、PreparedStatement
- 1.概述
- 2.获取 PreparedStatement 对象
- 3.格式
- 4.方法摘要
- 5.实例
- 6.原理
- 三、结语
一、前言
在上文中提到了SQL注入问题,这篇文章主要是讲解处理SQL注入问题的解决方案:预编译SQL语句,而这都归功于PreparedStatement
方法,所以本文也会讲解该方法及其原理
二、PreparedStatement
1.概述
表示预编译的 SQL 语句的对象。
SQL 语句被预编译并存储在 PreparedStatement 对象中。然后可以使用此对象多次高效地执行该语句。
PreparedStatement作用: 预编译SQL语句并执行:预防SQL注入问题
2.获取 PreparedStatement 对象
要注意的是这里的❓是英文问号(半角)如果使用中文中的问好(全角)的话就会报错
// SQL语句中的参数值,使用?占位符替代
String sql = "select * from user where username = ? and password = ?";
// 通过Connection对象获取,并传入对应的sql语句
PreparedStatement pstmt = conn.prepareStatement(sql);
3.格式
PreparedStatement对象:setXxx(参数1,参数2):给 ? 赋值
4.方法摘要
executeQuery:在此 PreparedStatement 对象中执行 SQL 查询,并返回该查询生成的 ResultSet 对象
executeUpdate:在此 PreparedStatement 对象中执行 SQL 语句,该语句必须是一个 SQL 数据操作语言(Data Manipulation Language,DML)语句,比如 INSERT、UPDATE 或 DELETE 语句;或者是无返回内容的 SQL 语句,比如 DDL 语句。
调用这两个方法时不需要传递SQL语句,因为获取SQL语句执行对象时已经对SQL语句进行预编译了
5.实例
//2. 获取连接:如果连接的是本机mysql并且端口是默认的 3306 可以简化书写
String url = "jdbc:mysql:///db1?useSSL=false";
String username = "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url, username, password);
// 接收用户输入 用户名和密码
String name = "zhangsan";
String pwd = "' or '1' = '1";
// 定义sql
String sql = "select * from tb_user where username = ? and password = ?";
// 获取pstmt对象
PreparedStatement pstmt = conn.prepareStatement(sql);
// 设置?的值
pstmt.setString(1,name);
pstmt.setString(2,pwd);
// 执行sql
ResultSet rs = pstmt.executeQuery();
// 判断登录是否成功
if(rs.next()){
System.out.println("登录成功");
}else{
System.out.println("登录失败");
}
//7. 释放资源
rs.close();
pstmt.close();
conn.close();
6.原理
- 将sql语句发送到MySQL服务器端
- MySQL服务端会对sql语句进行如下操作
-
检查SQL语句
-
检查SQL语句的语法是否正确
-
编译SQL语句。将SQL语句编译成可执行的函数
-
检查SQL和编译SQL花费的时间比执行SQL的时间还要长。如果我们只是重新设置参数,那么检查SQL语句和编译SQL语句将不需要重复执行。这样就提高了性能。
-
- 执行SQL语句
三、结语
对于预编译的过程,大家可以查看一下日志文件,但是只需要掌握其原理即可,有任何问题都可以评论留言,如果想要了解详细过程的话,以后也会再写一篇文章来讲述的