#创建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接口的方法: 咱们能够看到总共就三种类型:索引
方法 | 做用 |
---|---|
execute() | 主要在存储过程和动态SQL语句中使用 |
executeUpdate() | 对应INSERT,UPDATE 或 DELETE 语句 |
executeQuery() | 对应SELECT,查询专用 |
根据实际的须要对这些类型进行选择,在此就不进行详细讲解了。接口