通过PreparedStatement预防SQL注入
简介:本文只讲PreparedStatement预防SQL注入的写法,大家学会就好。
推荐学习路线:JDBC数据库的连接->Connection(数据库连接对象)->Statement->ResultSet->通过PreparedStatement预防SQL注入->通过PreparedStatement预防SQL注入->JDBC增删改查案例讲解 大家跟着敲完基本就可以JDBC基础毕业了。
数据库表格
学习代码
import java.sql.*;public class JDBCDemo {public static void main(String[] args) throws Exception {//1. 注册驱动Class.forName("com.mysql.cj.jdbc.Driver");//2. 获取连接// String url = "jdbc:mysql://127.0.0.1:3306/books"; // 如果是mysql5这样写String url = "jdbc:mysql://localhost:3306/db?serverTimezone=GMT%2B8&useOldAliasMetadataBehavior=true"; // 如果是mysql8这样写String username = "root";String password = "12345";Connection conn = DriverManager.getConnection(url, username, password);// 接收用户输入 用户名和密码String name = "admin";String pwd = "12345";String sql = "select * from users where username = ? and userpwd = ?";// 获取pstmt对象PreparedStatement pstmt = conn.prepareStatement(sql);// 设置?的值pstmt.setString(1, name);pstmt.setString(2, pwd);System.out.println(pstmt); // 查看最后拼接的sql语句是啥// 执行sqlResultSet rs = pstmt.executeQuery();// 判断登录是否成功if(rs.next()){System.out.println("登录成功~");}else{System.out.println("登录失败~");}//7. 释放资源rs.close();pstmt.close();conn.close();}
}
运行结果:
语法解析
PreparedStatement概述
PreparedStatement作用:
- 预编译SQL语句并执行:预防SQL注入问题
-
获取 PreparedStatement 对象
// SQL语句中的参数值,使用?占位符替代 String sql = "select * from user where username = ? and password = ?"; // 通过Connection对象获取,并传入对应的sql语句 PreparedStatement pstmt = conn.prepareStatement(sql);
-
设置参数值
上面的sql语句中参数使用 ? 进行占位,在之前之前肯定要设置这些 ? 的值。
PreparedStatement对象:setXxx(参数1,参数2):给 ? 赋值
-
Xxx:数据类型 ; 如 setInt (参数1,参数2)
-
参数:
-
参数1: ?的位置编号,从1 开始
-
参数2: ?的值
-
-
-
执行SQL语句
executeUpdate(); 执行DDL语句和DML语句
executeQuery(); 执行DQL语句
注意:
- 调用这两个方法时不需要传递SQL语句,因为获取SQL语句执行对象时已经对SQL语句进行预编译了。