预处理对象
1. PreparedStatement 接口介绍
PreparedStatement 是 Statement 接口的子接口,继承于父接口中所有的方法。它是一个预编译的 SQL 语句对象.
预编译: 是指SQL 语句被预编译,并存储在 PreparedStatement 对象中。然后可以使用此对象多次高效地执行该语句。
2. PreparedStatement 特 点
因为有预先编译的功能,提高 SQL 的执行效率。可以有效的防止 SQL 注入的问题,安全性更高
3. 获取PreparedStatement对象
通过Connection创建PreparedStatement对象
Connection 接口中的方法 |
说明 |
PreparedStatement prepareStatement(String sql) |
指定预编译的 SQL 语句, SQL 语句中使用占位符 ? 创建一个语句对象 |
4. PreparedStatement接口常用方法
常用方法 |
说明 |
int executeUpdate(); |
执行insert update delete语句. |
ResultSet executeQuery(); |
执行select语句. 返回结果集对象 Resulet |
5. 使用PreparedStatement的步骤
1. 编写 SQL 语句,未知内容使用?占位:
"SELECT * FROM jdbc_user WHERE username=? AND password=?";
2. 获得 PreparedStatement 对象
3. 设置实际参数:setXxx( 占位符的位置, 真实的值)
4. 执行参数化 SQL 语句
5. 关闭资源
setXxx重载方法 |
说明 |
void setDouble(int parameterIndex, double x) |
将指定参数设置为给定 Java double 值。 |
void setInt(int parameterIndex, int x) |
将指定参数设置为给定 Java int 值。 |
void setString(int parameterIndex, String x) |
将指定参数设置为给定 Java String 值。 |
void setObject(int parameterIndex, Object x) |
使用给定对象设置指定参数的值。 |
使用PreparedStatement完成登录案例
package com.lagou.jdbc03;
import com.lagou.utils.JDBCUtils;
import java.sql.*;
import java.util.Scanner;
public class TestLogin02 {
/*
* SQL注入
* 用户输入的用户名和密码 与我们编写的SQL进行了拼接,用户输入的内容成为了SQL语法的一部分,
* 用户会利用这里漏洞 输入一些其他的字符串,改变SQL原有的意思
*
* 如果解决
* 要解决SQL注入 就不能让用户输入的数据和我们的SQL进行直接的拼接
*
* 预处理对象 PrepareStatement 他是 Statement接口的子接口
* 使用预处理对象 他有预编译的功能,提高SQL的执行效率
* 使用预处理对象 通过占位符的方式 设置参数 可以有效的防止SQL注入
*
*
* */
public static void main(String[] args) throws SQLException {
//1.获取连接
Connection con = JDBCUtils.getConnection();
//2.获取PrepareStatement 预处理对象
//使用 ? 占位符的方式来设置参数
String sql = "select * from jdbc_user where username = ? and password = ?";
PreparedStatement ps = con.prepareStatement(sql);
//3.获取用户输入的用户名和密码
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户名: ");
String name = sc.nextLine();
System.out.println("请输入密码: ");
String pass = sc.nextLine();
//4.设置参数 使用setXXX(占位符的位置(整数),要设置的值)的方法设置占位符的参数
ps.setString(1,name); // 设置第一个问号值 为 name
ps.setString(2,pass);
//5.执行查询
ResultSet resultSet = ps.executeQuery();
//6.处理结果集
//6.处理结果集
if(resultSet.next()){
System.out.println("登录成功! 欢迎您: " + name);
}else{
System.out.println("登录失败! ");
}
//7.关闭流
JDBCUtils.close(con,ps,resultSet);
}
}
节选自拉钩教育JAVA培训系列教程