zoukankan      html  css  js  c++  java
  • 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可以减少编译次数,提高数据库性能

  • 相关阅读:
    九度OJ 1035:找出直系亲属 (二叉树、递归)
    九度OJ 1034:寻找大富翁 (排序)
    九度OJ 1033:继续xxx定律 (基础题)
    九度OJ 1032:ZOJ (基础题)
    centos 6.4 安装mongodb
    数据校验工具类
    《 mongodb 学习 》java 基本操作
    《 mongodb 学习 》基本操作2
    《 mongodb 学习 》之基本操作
    《 mongodb 学习 》之安装篇
  • 原文地址:https://www.cnblogs.com/JasperZhao/p/15044640.html
Copyright © 2011-2022 走看看