• JDBC详解系列(四)之建立Stament和执行SQL语句


    建立Stament

      在获得连接之后,我们就可以跟数据库进行交互了。
      在JDBC中,我们发送SQL语句到数据库这些操作时通过Stament,Preparement,CallableStatement这几个对象进行的。

    一.Stament##

      Stament是一个接口,其具体实现由供应商所提供。调用方法:

    Statement stmt = null;
    try {
       stmt = conn.createStatement( );
       stmt.executeXXX(SQL);
       .  .  .
    }
    catch (SQLException e) {
       . . .
    }
    finally {
       . . .
    }
    

      Stament对象执行静态SQL语句,并返回相应结果。因此,其不接收参数。在执行完毕之后务必将打开的连接关闭,这是一个好的习惯。

    二.PreparedStatement

      PreparedStatement 接口扩展了 Statement 接口,大多数情况下PreparedStatement 中的SQL语句已经被预编译过,因而当其执行时,只需DBMS运行SQL语句,而不必先编译。调用方法:

    PreparedStatement pstmt = null;
    try {
       String SQL = "Update Employees SET age = ? WHERE id = ?";
       pstmt = conn.prepareStatement(SQL);
       pstmt .setXXX();
       ... 
       pstmt.executeXXX();
       
       . . .
    }
    catch (SQLException e) {
       . . .
    }
    finally {
       . . .
    }
    

      PreparedStatement在创建对象时对SQL进行了预编译。参数都被用 ? 符号表示,这是已知的参数标记。在执行 SQL 语句之前,必须赋予每一个参数确切的数值。通过setXXX()来设定参数,其中 XXX 表示你希望绑定到输入参数的 Java 数据类型。每个参数标记映射它的序号位置。第一标记表示位置 1 ,下一个位置为 2 等等。这种方法不同于 Java 数组索引,它是从 0 开始的。

    三.CallableStatement

      CallableStatement 对象是用来调用数据库的存储过程的。调用方法:

    CallableStatement cstmt = null;
    try {
       String SQL = "{call getEmpName (?, ?)}";
       cstmt = conn.prepareCall (SQL);
       stmt.setInt(1, empID);
       stmt.registerOutParameter(2, java.sql.Types.VARCHAR);
       stmt.execute();
       . . .
    }
    catch (SQLException e) {
       . . .
    }
    finally {
       . . .
    }
    

      有三种类型的参数有:IN,OUT 和 INOUT。PreparedStatement 对象只使用 IN 参数。CallableStatement 对象可以使用所有的三个参数。CallableStatement 也是通过 setXXX() 方法绑定对应的 Java 数据类型。使用 OUT 和 INOUT 参数时,你就必须使用额外的 CallableStatement 方法 - registerOutParameter()。 registerOutParameter() 方法绑定 JDBC 数据类型,该数据是存储过程返回的值。CallableStatement 的 getXXX ()方法将获取返回的参数值,()内的参数与registerOutParameter相对应。

    四.总结##

      存储过程使用的必然是CallableStatement了。而Stament和PreparedStament之间使用时还是需要有所取舍的。
      1.Stament不接受参数,其有可能会被SQL注入。但其开销比较小;每次执行SQL语句,数据库都要对SQL语句进行编译,从0开始执行。在只进行一次或少量查询并返回结果时,其效率高于PreparedStament。但无法防止SQL注入。

      2.PreparedStatement是预编译的,当执行时,DBMS只需要运行SQL语句,而无需先编译再执行。所以当在我们处理批量的时候,使用PreparedStatement可以大大的提高效率。同时,也可以防止SQL注入。

      3.虽然Stament在数量少时进行SQL语句开销小,但其存在SQL注入的问题。因此,我们在用户可以更改SQL输入的地方,如WEB等,应该使用PreparedStatement。任何不经过PreparedStatement处理的情况下,用户的所有输入都不应该传递给SQL语句。

    执行SQL语句

      我们可以查看Stement接口的方法:
    Stament execute
      我们可以看到总共就三种类型:

    方法 作用
    execute() 主要在存储过程和动态SQL语句中使用
    executeUpdate() 对应INSERT,UPDATE 或 DELETE 语句
    executeQuery() 对应SELECT,查询专用

      根据实际的需要对这些类型进行选择,在此就不进行详细讲解了。

  • 相关阅读:
    在Swift中定义属于自己的运算符
    计算型属性 vs 懒加载
    swift- mutating
    什么是CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI?
    微信授权登录-微信公众号和PC端网站
    PHP实现购物车的思路和源码分析
    PHP实现图片的等比缩放和Logo水印功能示例
    PHP实现IP访问限制及提交次数的方法详解
    Laravel 队列发送邮件
    laravel 定时任务通过队列发送邮件
  • 原文地址:https://www.cnblogs.com/homejim/p/8275120.html
Copyright © 2020-2023  润新知