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可以减少编译次数,提高数据库性能

posted @ 2021-07-22 16:06  Jasper2003  阅读(1281)  评论(0编辑  收藏  举报