`
lapulande
  • 浏览: 219384 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JDBC之Statement,PreparedStatement,CallableStatement

    博客分类:
  • JDBC
阅读更多

Statement 每次执行sql语句,数据库都要执行sql语句的编译 ,最好用于仅执行一次查询并返回结果的情形,效率高于PreparedStatement.

 

PreparedStatement是预编译的,使用PreparedStatement有几个好处

 a. 在执行可变参数的一条SQL时,PreparedStatement比Statement的效率高,因为DBMS预编译一条SQL当然会比多次编译一条SQL的效率要高。

 b. 安全性好,有效防止Sql注入等问题。

 c.  对于多次重复执行的语句,使用PreparedStament效率会更高一点,并且在这种情况下也比较适合使用batch;

 d.  代码的可读性和可维护性。

 

CallableStatement接口扩展 PreparedStatement,它提供了对输出和输入/输出参数的支持。CallableStatement 接口还具有对 PreparedStatement 接口提供的输入参数的支持。

 

在 JDBC 中调用已储存过程的语法如下所示。

{call 过程名[(?, ?, ...)]}


  返回结果参数的过程的语法为:

{? = call 过程名[(?, ?, ...)]}


  不带参数的已储存过程的语法类似:

{call 过程名}


  通常,创建 CallableStatement 对象的人应当知道所用的 DBMS 是支持已储存过程的,并且知道这些过程都是些什么。然而,如果需要检查,多种DatabaseMetaData 方法都可以提供这样的信息。例如,如果 DBMS 支持已储存过程的调用,则supportsStoredProcedures 方法将返回 true,而getProcedures 方法将返回对已储存过程的描述。CallableStatement 继承 Statement 的方法(它们用于处理一般的 SQL 语句),还继承了 PreparedStatement 的方法(它们用于处理 IN 参)。

  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);

3
0
分享到:
评论
1 楼 云南白药 2013-11-26  

相关推荐

    Java的JDBC中Statement与CallableStatement对象实例

    在Java的JDBC(Java Database Connectivity)中,`Statement`和`CallableStatement`对象是用于执行SQL语句的关键组件。这两个接口提供了与数据库交互的方法,允许程序员执行查询、更新和其他数据库操作。 首先,...

    jdbc实例教程

    * 插入数据:使用 JDBC 的 Statement 或 PreparedStatement 对象可以插入数据。插入数据需要指定要插入的数据表和字段,然后使用 executeUpdate() 方法执行插入操作。 * 修改数据:使用 JDBC 的 Statement 或 ...

    JDBC-Student.rar_callablestatement_dbtoobject_java 学员 管理 系统_jdbc

    1. **CallableStatement**:CallableStatement是JDBC接口,用于执行存储过程。在学员管理系统中,如果数据库中包含存储过程,CallableStatement允许我们调用它们,并传递参数及接收返回值。与PreparedStatement类似...

    jdbc-增删改查和封装增删改查.docx

    在jdbc中,我们可以使用Statement、PreparedStatement和CallableStatement三个接口来执行SQL语句。 jdbc连接数据库 在jdbc中,我们可以使用DriverManager来加载数据库驱动程序,例如mysql的驱动程序...

    java之jdbc项目文件

    JDBC提供了一套API,包括DriverManager、Connection、Statement、PreparedStatement、CallableStatement等接口和类。 2. **JDBC驱动程序**: JDBC驱动分为四种类型:JDBC-ODBC桥接驱动、本地API驱动、网络协议驱动...

    高级 JDBC.ppt

    在Java的JDBC(Java Database Connectivity)中,高级特性包括了对Statement类的扩展,如PreparedStatement和CallableStatement,以及对存储过程的使用。这些高级功能不仅提高了代码的可读性和安全性,还提升了...

    JDBC常考知识点,常用api

    `Connection`接口提供了创建Statement、PreparedStatement和CallableStatement对象的方法,以执行SQL语句。 - `createStatement()`:返回一个Statement对象,用于执行非参数化的SQL语句。 - `prepareStatement...

    JDBC笔记JDBC笔记JDBC笔记

    3. **创建Statement对象**:用于执行SQL语句,有`Statement`、`PreparedStatement`和`CallableStatement`三种。 4. **执行SQL**:调用Statement对象的`executeQuery()`或`executeUpdate()`方法。 5. **处理结果集**...

    JDBC.rar_JDBC API_JDBC 接口

    Statement有三种类型:Statement、PreparedStatement和CallableStatement。 4. **PreparedStatement**: 提供预编译的SQL语句,允许我们使用参数,提高执行效率,防止SQL注入。 5. **CallableStatement**: 用于调用...

    JDBC 基础入门

    文件`JDBC基础教程之PreparedStatement 软件 天极Yesky.htm`中会详细讲解如何使用。 5. **CallableStatement对象** 当需要调用数据库中的存储过程时,会使用`CallableStatement`。这个接口扩展了`...

    JDBC.rar_JDBC程序

    3. **创建Statement对象**:根据需求选择Statement、PreparedStatement或CallableStatement。 4. **执行SQL**:调用Statement对象的`executeQuery()`(查询)、`executeUpdate()`(增删改)或`execute()`(执行存储...

    精通jdbc,jdbc自学文档,jdbc帮助文档

    JDBC还提供了CallableStatement用于调用存储过程,DatabaseMetaData获取数据库元数据,以及JDBC Connection Pool(如C3P0、HikariCP)等高级功能,以优化性能和资源管理。 通过这份JDBC自学文档,你可以逐步学习和...

    第24讲 JDBC编程2.ppt

    总的来说,JDBC中的PreparedStatement和CallableStatement提供了更高效、灵活的数据库操作方式,而事务管理则确保了数据库操作的可靠性和一致性。熟练掌握这些概念和方法对于进行Java数据库编程至关重要。

    jdbc jdbc jdbc

    有三种类型:简单`Statement`,预编译的`PreparedStatement`,以及用于调用存储过程的`CallableStatement`。`PreparedStatement`可以提高性能,因为它允许预先编译SQL语句,从而减少解析时间。 4. **结果集...

    老罗 jdbc 源码

    - Statement/PreparedStatement/CallableStatement:用于执行SQL语句的接口,其中PreparedStatement可以预编译SQL,提高执行效率,CallableStatement用于调用存储过程。 - ResultSet:查询结果集,用于遍历查询...

    JDBC数据库连接测试

    - **Statement/CPreparedStatement/CallableStatement**: 用于执行SQL语句的对象。 - **ResultSet**: 存储查询结果的对象。 ### 2. JDBC连接数据库 连接数据库通常分为以下步骤: 1. **加载驱动**:使用`Class....

    JDBC学习资料 jdbc编程

    5. CallableStatement:用于调用存储过程,与PreparedStatement相似,但可以处理OUT参数。 JDBC驱动程序类型: 1. JDBC-ODBC桥:依赖于ODBC驱动来连接数据库,适用于多种数据库。 2. Native-API partly Java驱动:...

    JDBC连接MySQL 实例

    4. **Statement/PreparedStatement/CallableStatement**:这些接口用于执行SQL语句。Statement用于执行静态SQL,PreparedStatement用于预编译SQL,CallableStatement用于调用存储过程。 5. **结果集(ResultSet)**...

    JDBC教程

    - **Connection**: 数据库连接对象,代表了一个到数据库的会话,可以创建Statement或PreparedStatement对象。 - **Statement**: 用于执行静态SQL语句,获取结果集。 - **PreparedStatement**: 预编译的SQL语句,支持...

Global site tag (gtag.js) - Google Analytics