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

#创建Stament   在得到链接以后,咱们就能够跟数据库进行交互了。   在JDBC中,咱们发送SQL语句到数据库这些操做时经过Stament,Preparement,CallableStatement这几个对象进行的。 ##一.Stament##   Stament是一个接口,其具体实现由供应商所提供。调用方法:java

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

  Stament对象执行静态SQL语句,并返回相应结果。所以,其不接收参数。在执行完毕以后务必将打开的链接关闭,这是一个好的习惯。 ##二.PreparedStatement ##   PreparedStatement 接口扩展了 Statement 接口,大多数状况下PreparedStatement 中的SQL语句已经被预编译过,于是当其执行时,只需DBMS运行SQL语句,而没必要先编译。调用方法: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注入。code

  3.虽然Stament在数量少时进行SQL语句开销小,但其存在SQL注入的问题。所以,咱们在用户能够更改SQL输入的地方,如WEB等,应该使用PreparedStatement。任何不通过PreparedStatement处理的状况下,用户的全部输入都不该该传递给SQL语句。对象

#执行SQL语句   咱们能够查看Stement接口的方法: Stament execute   咱们能够看到总共就三种类型:索引

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

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