zoukankan      html  css  js  c++  java
  • 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,查询专用

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

  • 相关阅读:
    oracle中获取当前整点和上一个小时整点,日期类型
    MYSQL中替换oracle中runum用法
    oracle 中备份表
    發生了不愉快的事情
    今年下雪了。。。
    VB.net下非常好用的实现FTP的类
    今年過節不回家了
    焕肤:不要暗沉
    不要打梦到的电话号码。。。
    關於IT職業的思考
  • 原文地址:https://www.cnblogs.com/homejim/p/8275120.html
Copyright © 2011-2022 走看看