Statement的子接口,预编译SQL,动态SQL
功能比爹强大
用来解决SQL注入的
预编译SQL:参数使用?作为占位符,执行SQL的时候给?赋上值就可以了
使用步骤:
1.导入驱动jar包
复制jar包,粘贴到libs文件夹下。文件名可以任意,一般就叫libs
选择复制的jar包,右键,点击Add As Library
2.注册驱动
3.获取数据库的连接对象 Connection(本地的java代码和数据库的桥梁对象)
4.定义SQL语句
①参数使用?作为占位符。例如:select * from user where username=? and password = ?;
5.获取执行SQL语句的对象 PreparedStatement Connection.prepareStatement(String sql)
6.给?赋值7.执行SQL,接收返回结果,不需要传递SQL语句了(传递SQL语句时它父类Statement的方法,这个是子类特有的)
8.处理结果
9.释放资源
不使用Statement
prepareStatement(String sql)
创建参数化的SQL语句发送到数据库的 PreparedStatement对象。
SQL注入:通过操作输入来修改SQL语句
在上个练习中,会产生SQL注入问题
①用户名随便输
②密码输入
例如:
表中就没有那个用户名和密码
查看SQL语句执行效果:
(利用输入的bug,把输入的密码,转换为一个判断)
会把所有的用户名密码查询出来
package cn.itcast.jdbc;import cn.itcast.util.JDBCUtils;import java.sql.*;import java.util.Scanner;public class JdbcDemo11 { public static void main(String[] args) { //1.键盘录入,接收用户名和密码 Scanner sc = new Scanner(System.in); System.out.println("请输入用户名"); String username = sc.nextLine(); System.out.println("请输入密码"); String password = sc.nextLine(); //2.调用方法login,因为不是静态方法,所以要创建对象 boolean flag = new JdbcDemo11().login2(username, password); //3.判断结果,输出同语句 if (flag){ System.out.println("登录成功"); }else { System.out.println("登录失败,用户名或密码错误"); } } /** * 登录方法,PreparedStatement实现 */ public boolean login2(String username, String password) { if (username == null || password == null) {//如果有一个为空就不用去连接数据库,做操作 return false; } //连接数据库是否判断成功 Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { //1.获取数据库连接 conn = JDBCUtils.getConnection(); //2.定义SQL String sql = "select * from user where username= ? and password = ?;"; //3.获取执行SQL的对象 pstmt = conn.prepareStatement(sql); //给?赋值 pstmt.setString(1,username); pstmt.setString(2,password); //4.执行查询,不需要传参数 rs = pstmt.executeQuery(); //5.判断 /* if (rs.next()){//不用这样写rs.next()返回的就是true,false return true; }else { return false; }*/ return rs.next();//如果有下一行返回true } catch (SQLException e) { e.printStackTrace(); } finally {//释放资源 JDBCUtils.close(rs, pstmt, conn); } return false; }}