当得到了与数据库的链接后,就能够与数据库进行交互了。 JDBC Statement
,CallableStatement
和PreparedStatement
接口定义了可用于发送SQL或PL/SQL命令,并从数据库接收数据的方法和属性。java
它们还定义了有助于在Java和SQL数据类型的数据类型差别转换的方法。
下表提供了每一个接口定义,以及使用这些接口的目的的总结。sql
接口 | 推荐使用 |
---|---|
Statement |
用于对数据库进行通用访问,在运行时使用静态SQL语句时颇有用。 Statement 接口不能接受参数。 |
PreparedStatement |
当计划要屡次使用SQL语句时使用。PreparedStatement 接口在运行时接受输入参数。 |
CallableStatement |
当想要访问数据库存储过程时使用。CallableStatement 接口也能够接受运行时输入参数。 |
在使用Statement
对象执行SQL语句以前,须要使用Connection
对象的createStatement()
方法建立一个Statement
对象,如如下示例所示:数据库
Statement stmt = null; try { stmt = conn.createStatement( ); . . . } catch (SQLException e) { . . . } finally { . . . }
在建立Statement
对象后,可使用它来执行一个SQL语句,它有三个执行方法能够执行。它们分别是 -数组
boolean execute (String SQL)
: 若是能够检索到ResultSet
对象,则返回一个布尔值true
; 不然返回false
。使用此方法执行SQLDDL
语句或须要使用真正的动态SQL,可以使用于执行建立数据库,建立表的SQL语句等等。int executeUpdate (String SQL):
返回受SQL语句执行影响的行数。使用此方法执行预期会影响多行的SQL语句,例如:INSERT
,UPDATE
或DELETE
语句。ResultSet executeQuery(String SQL):
返回一个ResultSet
对象。 当您但愿得到结果集时,请使用此方法,就像使用SELECT
语句同样。就像关闭一个Connection
对象同样,以保存数据库资源同样,因为一样的缘由,还应该关闭Statement
对象。ide
一个简单的调用close()
方法将执行该做业(工做)。 若是先关闭Connection
对象,它也会关闭Statement
对象。 可是,应该始终显式关闭Statement
对象,以确保正确的清理顺序。学习
Statement stmt = null; try { stmt = conn.createStatement( ); . . . } catch (SQLException e) { . . . } finally { stmt.close(); }
为了更好的理解,建议学习Statment示例教程 。code
PreparedStatement
接口扩展了Statement
接口,它添加了比Statement
对象更好一些优势的功能。对象
此语句能够动态地提供/接受参数。教程
PreparedStatement pstmt = null; try { String SQL = "Update Employees SET age = ? WHERE id = ?"; pstmt = conn.prepareStatement(SQL); . . . } catch (SQLException e) { . . . } finally { . . . }
JDBC中的全部参数都由 ?
符号做为占位符,这被称为参数标记。 在执行SQL语句以前,必须为每一个参数(占位符)提供值。索引
setXXX()
方法将值绑定到参数,其中XXX
表示要绑定到输入参数的值的Java数据类型。 若是忘记提供绑定值,则将会抛出一个SQLException
。
每一个参数标记是它其顺序位置引用。第一个标记表示位置1
,下一个位置2
等等。 该方法与Java数组索引不一样(它不从0
开始)。
全部Statement
对象与数据库交互的方法(a)execute()
,(b)executeQuery()
和(c)executeUpdate()
也能够用于PreparedStatement
对象。 可是,这些方法被修改成可使用输入参数的SQL语句。
就像关闭Statement
对象同样,因为一样的缘由(节省数据库系统资源),也应该关闭PreparedStatement
对象。
简单的调用close()
方法将执行关闭。 若是先关闭Connection
对象,它也会关闭PreparedStatement
对象。 可是,应该始终显式关闭PreparedStatement
对象,以确保以正确顺序清理资源。
PreparedStatement pstmt = null; try { String SQL = "Update Employees SET age = ? WHERE id = ?"; pstmt = conn.prepareStatement(SQL); . . . } catch (SQLException e) { . . . } finally { pstmt.close(); }
为了更好的理解,建议学习PreparedStatement示例代码 。
相似Connection
对象建立Statement
和PreparedStatement
对象同样,它还可使用一样的方式建立CallableStatement
对象,该对象将用于执行对数据库存储过程的调用。
假设须要执行如下Oracle存储过程 -
CREATE OR REPLACE PROCEDURE getEmpName (EMP_ID IN NUMBER, EMP_FIRST OUT VARCHAR) AS BEGIN SELECT first INTO EMP_FIRST FROM Employees WHERE ID = EMP_ID; END;
注意:上面的存储过程是针对Oracle编写的,可是若是您使用MySQL数据库,可以使用如下方式来编写MySQL相同的存储过程,以下在EMP数据库中建立它 -
DELIMITER $$ DROP PROCEDURE IF EXISTS `EMP`.`getEmpName` $$ CREATE PROCEDURE `EMP`.`getEmpName` (IN EMP_ID INT, OUT EMP_FIRST VARCHAR(255)) BEGIN SELECT first INTO EMP_FIRST FROM Employees WHERE ID = EMP_ID; END $$ DELIMITER ;
存在三种类型的参数:IN
,OUT
和INOUT
。 PreparedStatement
对象只使用IN
参数。CallableStatement
对象可使用上面三个参数类型。
如下是上面三种类型参数的定义 -
参数 | 描述 |
---|---|
IN | 建立SQL语句时其参数值是未知的。 使用setXXX() 方法将值绑定到IN 参数。 |
OUT | 由SQL语句返回的参数值。可使用getXXX() 方法从OUT参数中检索值。 |
INOUT | 提供输入和输出值的参数。使用setXXX() 方法绑定变量并使用getXXX() 方法检索值。 |
如下代码片断显示了如何使用Connection.prepareCall()
方法根据上述存储过程来实例化一个CallableStatement
对象 -
CallableStatement cstmt = null; try { String strSQL = "{call getEmpName (?, ?)}"; cstmt = conn.prepareCall (SQL); . . . } catch (SQLException e) { . . . } finally { . . . }
String变量strSQL
表示存储过程,带有两个参数占位符。
使用CallableStatement
对象就像使用PreparedStatement
对象同样。 在执行语句以前,必须将值绑定到全部参数,不然将抛出一个SQLException
异常。
若是有IN
参数,只需遵循适用于PreparedStatement
对象的相同规则和技术; 使用与绑定的Java数据类型相对应的setXXX()
方法。
使用OUT
和INOUT
参数时,必须使用一个额外的CallableStatement
对象方法registerOutParameter()
。 registerOutParameter()
方法将JDBC数据类型绑定到存储过程并返回预期数据类型。
当调用存储过程,可使用适当的getXXX()
方法从OUT
参数中检索该值。 此方法将检索到的SQL类型的值转换为对应的Java数据类型。
就像关闭其余Statement
对象同样,因为一样的缘由(节省数据库系统资源),还应该关闭CallableStatement
对象。
简单的调用close()
方法将执行关闭CallableStatemen
t对象。 若是先关闭Connection
对象,它也会关闭CallableStatement
对象。 可是,应该始终显式关闭CallableStatement
对象,以确保按正确顺序的清理资源。
CallableStatement cstmt = null; try { String SQL = "{call getEmpName (?, ?)}"; cstmt = conn.prepareCall (SQL); . . . } catch (SQLException e) { . . . } finally { cstmt.close(); }
为了更好的理解,建议参考学习Callable示例代码。