JDBC:
Statement(接口)
|
PreparedStatement(接口)
|
CallableStatement(接口)
以上三者为继承关系。
1).概念:
Statement:(用于执行不带参数的简单 SQL 语句)
每次执行sql语句,数据库都要执行sql语句的编译,最好用于仅执行一次查询并返回结果的情形,效率高于PreparedStatement.
用法:
String sql = "select seq_orderdetid.nextval as orderid from dual";
Statement stat1=conn.createStatement();
ResultSet rs1 = stat1.executeQuery(sql);
if ( rs1.next() ) {
id = rs1.getLong(1);
}
PreparedStatement:(用于执行带或不带 IN 参数的预编译 SQL 语句)
执行的SQL语句中是可以带参数的,并支持批量执行SQL。由于采用Cache机制,则预先编译的语句,就会放在Cache中,下次执行相同SQL语句时,则可以直接从Cache中取出来。
用法:
PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES SET SALARY = ? WHERE ID = ?");
pstmt.setBigDecimal(1, 153833.00);
pstmt.setInt(2, 110592);
pstmt. executeUpdate();
用法2:
PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES SET SALARY = ? WHERE ID = ?");
for(int i =0;i<length;i++){
pstmt.setBigDecimal(1, param1[i]);
pstmt.setInt(2, param2[i]);
pstmt.addBatch();
}
pstmt. executeBatch();
CallableStatement :(用于执行对数据库已存储过程的调用)
在 JDBC 中调用存储过程的语法如下所示:
{call 过程名[(?, ?, ...)]}
返回结果参数的过程的语法为:
{? = call 过程名[(?, ?, ...)]}
不带参数的存储过程的语法类似:
{call 过程名}
CallableStatement 中定义的所有方法都用于处理 OUT 参数或 INOUT 参数的输出部分:注册 OUT 参数的 JDBC 类型(一般 SQL 类型)、从这些参数中检索结果,或者检查所返回的值是否为 JDBC NULL。
1、创建 CallableStatement 对象
CallableStatement 对象是用 Connection 方法 prepareCall 创建的。下例创建 CallableStatement 的实例,其中含有对已储存过程 getTestData 调用。该过程有两个变量,但不含结果参数:
CallableStatement cstmt = con.prepareCall("{call getTestData(?, ?)}");
其中?占位符为IN、OUT还是INOUT参数,取决于已储存过程getTestData。
2、IN和OUT参数
将IN参数传给 CallableStatement 对象是通过 setXXX 方法完成的。该方法继承自 PreparedStatement。所传入参数的类型决定了所用的setXXX方法(例如,用 setFloat 来传入 float 值等)。
如果已储存过程返回 OUT 参数,则在执行 CallableStatement 对象以前必须先注册每个 OUT 参数的 JDBC 类型(这是必需的,因为某些 DBMS 要求 JDBC 类型)。注册 JDBC 类型是用 registerOutParameter 方法来完成的。语句执行完后,CallableStatement 的 getXXX 方法将取回参数值。正确的 getXXX 方法是为各参数所注册的 JDBC 类型所对应的 Java 类型。换言之, registerOutParameter 使用的是 JDBC 类型(因此它与数据库返回的 JDBC 类型匹配),而 getXXX 将之转换为 Java 类型。
作为示例,下述代码先注册 OUT 参数,执行由 cstmt 所调用的已储存过程,然后检索在 OUT 参数中返回的值。方法 getByte 从第一个 OUT 参数中取出一个 Java 字节,而 getBigDecimal 从第二个 OUT 参数中取出一个 BigDecimal 对象(小数点后面带三位数):
CallableStatement cstmt = con.prepareCall("{call getTestData(?, ?)}");
cstmt.registerOutParameter(1, java.sql.Types.TINYINT);
cstmt.registerOutParameter(2, java.sql.Types.DECIMAL, 3);
cstmt.executeQuery();
byte x = cstmt.getByte(1);
java.math.BigDecimal n = cstmt.getBigDecimal(2, 3);
3、INOUT参数
既支持输入又接受输出的参数(INOUT 参数)除了调用 registerOutParameter 方法外,还要求调用适当的 setXXX 方法(该方法是从 PreparedStatement 继承来的)。setXXX 方法将参数值设置为输入参数,而 registerOutParameter 方法将它的 JDBC 类型注册为输出参数。setXXX 方法提供一个 Java 值,而驱动程序先把这个值转换为 JDBC 值,然后将它送到数据库中。这种 IN 值的 JDBC 类型和提供给 registerOutParameter 方法的 JDBC 类型应该相同。然后,要检索输出值,就要用对应的 getXXX 方法。例如,Java 类型为byte 的参数应该使用方法 setByte 来赋输入值。应该给registerOutParameter 提供类型为 TINYINT 的 JDBC 类型,同时应使用 getByte 来检索输出值。
下例假设有一个已储存过程 reviseTotal,其唯一参数是 INOUT 参数。方法setByte 把此参数设为 25,驱动程序将把它作为 JDBC TINYINT 类型送到数据库中。接着,registerOutParameter 将该参数注册为 JDBC TINYINT。执行完该已储存过程后,将返回一个新的 JDBC TINYINT 值。方法 getByte 将把这个新值作为 Java byte 类型检索。
CallableStatement cstmt = con.prepareCall("{call reviseTotal(?)}");
cstmt.setByte(1, 25);
cstmt.registerOutParameter(1, java.sql.Types.TINYINT);
cstmt.executeUpdate();
byte x = cstmt.getByte(1);
2).区别:
a).功能:
Statement 接口提供了执行语句和获取结果的基本方法;
PreparedStatement 接口添加了处理 IN 参数的方法;
CallableStatement 接口添加了处理 OUT 参数的方法。
b).用法
Statement :
普通的不带参的查询SQL;
PreparedStatement :
可变参数的SQL,编译一次,执行多次,效率高;
安全性好,有效防止Sql注入等问题;
支持批量更新,批量删除;
CallableStatement :
继承自PreparedStatement,支持带参SQL操作;
支持调用存储过程,提供了对输出和输入/输出参数的支持;
- 浏览: 61491 次
- 性别:
- 来自: 广州
相关推荐
在Java的JDBC(Java Database Connectivity)中,`Statement`和`CallableStatement`对象是用于执行SQL语句的关键组件。这两个接口提供了与数据库交互的方法,允许程序员执行查询、更新和其他数据库操作。 首先,...
- **与Statement的区别**:`CallableStatement` 和 `PreparedStatement` 都是从 `Statement` 继承而来,这意味着它们都支持执行普通的 SQL 语句。然而,`CallableStatement` 特别适用于存储过程的调用。 #### 五、...
- **作用**:提供了与数据库交互的基本手段,如创建`Statement`、`PreparedStatement`或`CallableStatement`等对象。 - **生命周期管理**: - **获取连接**:通常通过`DataSource`或直接使用`DriverManager`来获取...
### 四、CallableStatement 与其他 JDBC 接口的区别 - **PreparedStatement**:主要用于执行预编译的 SQL 语句,不支持 OUT 参数。 - **Statement**:用于执行简单的 SQL 语句,不支持参数。 - **CallableStatement*...
此外,还可以考虑使用PreparedStatement和CallableStatement,它们在性能和安全性上优于Statement。PreparedStatement允许预编译SQL语句,减少解析开销,同时能有效防止SQL注入攻击。CallableStatement则用于调用...
它提供了创建Statement、PreparedStatement和CallableStatement对象的方法,以及关闭数据库连接的方法。例如,`createStatement()`用于创建Statement对象,`prepareStatement()`用于创建PreparedStatement对象,它们...
PreparedStatement PreparedStatement 是 Statement 的扩展,主要用于执行预编译的 SQL 语句。它的主要优点和缺点如下: 优点: - PreparedStatement 支持参数化查询,通过占位符(问号)来代替具体的值,避免了 ...
通过深入探讨`Statement`的创建、使用方法以及与之相关的其他类(如`PreparedStatement`和`CallableStatement`)的区别,帮助读者更好地理解如何在Java程序中执行SQL命令。 ### Java数据库连接中的Statement #### ...
有三种类型的Statement:Statement、CallableStatement和PreparedStatement。Statement适用于执行简单的非参数化SQL语句。 5. PreparedStatement接口: PreparedStatement是预编译的SQL语句,它可以提高性能,减少...
3. **Statement**:用于执行SQL查询,分为Statement、PreparedStatement和CallableStatement三种。Statement用于执行静态SQL语句,PreparedStatement允许预编译SQL语句,CallableStatement用于调用存储过程。 4. **...
- Statement对象:用于执行SQL查询和更新语句,有三种形式:Statement、PreparedStatement和CallableStatement。 - ResultSet对象:存储查询结果,提供遍历查询结果的方法。 - PreparedStatement:预编译的SQL...
JDBC API是一系列标准接口,如DriverManager、Connection、Statement、PreparedStatement和CallableStatement等,它们定义了与数据库交互的操作。JDBC驱动程序则是实现这些接口的具体数据库厂商提供的类库,确保Java...
3. **ResultSetMetaData**:当使用Statement或PreparedStatement执行查询并获取ResultSet时,ResultSetMetaData对象可以提供关于结果集列的信息,如列数、列名、列数据类型等。在管理系统中,这有助于我们更好地理解...
在jdbc中,我们可以使用Statement、PreparedStatement和CallableStatement三个接口来执行SQL语句。 jdbc连接数据库 在jdbc中,我们可以使用DriverManager来加载数据库驱动程序,例如mysql的驱动程序...
JDBC 提供了多种方式来执行 SQL 语句,包括 Statement、PreparedStatement 和 CallableStatement。Statement 对象用于执行静态 SQL 语句,而 PreparedStatement 对象用于执行带参数的 SQL 语句。CallableStatement ...
JDBC API提供了各种方法来执行SQL语句,包括 Statement、PreparedStatement和CallableStatement等。 1.2.1 JDBC连接数据库 JDBC提供了多种方式来连接数据库,包括DriverManager和DataSource等。DriverManager提供...
这包括Driver Manager、Connection、Statement、PreparedStatement、CallableStatement以及ResultSet等。Driver Manager负责加载数据库驱动并建立与数据库的连接;Connection对象代表到数据库的一个会话,它是所有...
3. **创建Statement对象**:根据需求选择Statement、PreparedStatement或CallableStatement。 4. **执行SQL**:调用Statement对象的`executeQuery()`(查询)、`executeUpdate()`(增删改)或`execute()`(执行存储...
`Statement`可以执行简单的、无参数的SQL语句,而更复杂的SQL语句则由其子类`PreparedStatement`和`CallableStatement`来处理。 - **`void addBatch(String sql)`**:将SQL语句添加到批量更新队列中,用于执行批量...