JDBC: 预处理对象 - PreparedStatement
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) |
使用给定对象设置指定参数的值。 |
6 使用PreparedStatement完成登录案例
使用 PreparedStatement 预处理对象,可以有效的避免SQL注入
步骤:
1.获取数据库连接对象
2.编写SQL 使用? 占位符方式
3.获取预处理对象 (预编译对象会将Sql发送给数据库,进行预编译)
4.提示用户输入用户名 & 密码
5.设置实际参数:setXxx(占位符的位置, 真实的值)
6.执行查询获取结 果集
7.判断是否查询到数据
8.关闭资源
public class TestLogin02 { /** * 使用预编译对象 PrepareStatement 完成登录案例 * @param args * @throws SQLException */ public static void main(String[] args) throws SQLException { //1.获取连接 Connection connection = JDBCUtils.getConnection(); //2.获取Statement Statement statement = connection.createStatement(); //3.获取用户输入的用户名和密码 Scanner sc = new Scanner(System.in); System.out.println("请输入用户名: "); String name = sc.nextLine(); System.out.println("请输入密码: "); String pass = sc.nextLine(); System.out.println(pass); //4.获取 PrepareStatement 预编译对象 //4.1 编写SQL 使用 ? 占位符方式 String sql = "select * from jdbc_user where username = ? and password = ?"; PreparedStatement ps = connection.prepareStatement(sql); //4.2 设置占位符参数 ps.setString(1,name); ps.setString(2,pass); //5. 执行查询 处理结果集 ResultSet resultSet = ps.executeQuery(); if(resultSet.next()){ System.out.println("登录成功! 欢迎您: " + name); }else{ System.out.println("登录失败!"); } //6.释放资源 JDBCUtils.close(connection,statement,resultSet); } }
7 PreparedStatement的执行原理
分别使用 Statement对象 和 PreparedStatement对象进行插入操作
代码示例
public class TestPS { public static void main(String[] args) throws SQLException { Connection con = JDBCUtils.getConnection(); //获取 Sql语句执行对象 Statement st = con.createStatement(); //插入两条数据 st.executeUpdate("insert into jdbc_user values(null,'张三','123','1992/12/26')"); st.executeUpdate("insert into jdbc_user values(null,'李四','123','1992/12/26')"); //获取预处理对象 PreparedStatement ps = con.prepareStatement("insert into jdbc_user values(?,?,?,?)"); //第一条数据 设置占位符对应的参数 ps.setString(1,null); ps.setString(2,"长海"); ps.setString(3,"qwer"); ps.setString(4,"1990/1/10"); // 执行插入 ps.executeUpdate(); // 第二条数据 ps.setString(1,null); ps.setString(2,"小斌"); ps.setString(3,"1122"); ps.setString(4,"1990/1/10"); //执行插入 ps.executeUpdate(); //释放资源 st.close(); ps.close(); con.close(); } }
8 Statement 与 PreparedStatement的区别
1. Statement用于执行静态SQL语句,在执行时,必须指定一个事先准备好的SQL语句
2. PrepareStatement是预编译的SQL语句对象,语句中可以包含动态参数“?”,在执行时可以为“?”动态设置参数值
3. PrepareStatement可以减少编译次数,提高数据库性能