• JDBC: 预处理对象


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

  • 相关阅读:
    [转载]项目风险管理七种武器之引言
    [转载]基于TFS实践敏捷-Scrum模式运用
    [转载]基于TFS实践敏捷-工作项跟踪
    [转载]TFS入门指南
    SVN — subclipse操作指引
    Java 中 方法名或类名 变更 同时 更新 所有引用的 类名或方法名 的解决方案
    Java import javax.servlet 出错
    java 中 SVN 设置所有文件及子目录 needs-lock, svn 提交时自动设置 needs-lock, 及版本不一致问题
    vmware 传输(vmdb)错误-32:pipe:read failed 解决方法
    Web.xml配置详解
  • 原文地址:https://www.cnblogs.com/JasperZhao/p/15044640.html
Copyright © 2020-2023  润新知