Statement 是JDBC的核心接口,定义了sql的执行方法。Statement 执行的sql 不能处理参数;PreparedStatement 继承自Statement 可以设置sql的参数,预编译型式;CallableStatement 继承自 PreparedStatement,在此基础上增加了调用存储过程的方法,并且可以对存储过程中的IN、OUT、INOUT参数进行设置。
Statement
Statement 接口是JDBC API定义的规范接口,具体实现由驱动程序实现。我们可以通过Collection接口来创建Statement,一个Collection接口可以同时创建多个Statement接口。
可以通过Statement接口提供的方法设置不同类型的ResultSet。
Statement的execute()方法可能返回多个结果(需要数据库驱动支持--可以通过DatebaseMeteData接口提供的suppotsMultipleOpenResults()方法判断)。需要通过调用statement对象的getMoreResult()方法获取下一个结果--true、代表下一个结果为ResultSet对象,false、代表下一个结果为影响的行数,或者没有更多结果。
PreparedStatement
PreparedStatement接口继承自Statement接口,和Statement一样通过Collection接口创建,在Statement接口上增加了参数占位符(?)的功能(可以有效预防sql注入)。
PreparedStatement的实例表示sql可以预编译,多次执行时效率比较高。
PreparedStatement接口提供了一系列Setter方法,用于为sql语句中的占位符赋值,这些方法名称遵循set<Type>格式,其中Type为数据类型。例如,setString()。这些方法一般有两个参数,第一个参数为int类型,表示参数占位符的位置(从1开始)。第二个参数表示具体的值。setNull()例外,第二个参数表示jdbc类型
需要注意的是,PreparedStatement对象执行sql之前必须为每个参数赋值,否则抛出SqlException。
PreparedStatement对象设置参数后不能被重置,需要显式的调用clearParameters()方法清除先前设置的值,再重新设置。
JDBC API提供了一个ParemeterMetaData接口,用于描述PreparedStatement 对象的参数信息,包括参数个数、参数类型等。使用PreparedStatement 接口提供的getParemeterMetaData() 方法获取。
CallableStatement
CallableStatement 接口继承自 PreparedStatement接口,在PreparedStatement 接口基础上增加了调用存储过程并检索调用结果的功能。同样通过 Collection 接口创建-- prepareCall() 方法。
CallableStatement 对象可以使用3种类型的参数:IN、OUT、INOUT。可以将参数指定为序数参数(1、2、3)或命名参数('存储过程中的变量名'),必须为IN或OUT参数的每个占位符设置一个值,必须为OUT或INOUT参数中的每个占位符调用registerOutParameter()方法。
存储过程参数的数量、类型和属性可以使用DatabaseMetaData接口提供的getProceduresColumns()方法获取。
使用setXXX()方法为占位符设置值时,下标从1开始,并且,语句中的字面量不会增加占位符的顺序数。
OUT、INOUT参数值的获取,需要使用CallableStatement 提供的getXXX(int index)方法,index为上文设置的占位符顺序。