`
jayghost
  • 浏览: 441652 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

JDBC: Statement、PreparedStatement和CallableStatement

 
阅读更多

转:http://blog.csdn.net/xiaodanjava/article/details/8127805

JDBC:

Statement(接口)
     |
PreparedStatement(接口)
     |
CallableStatement(接口)
以上三者为继承关系。
1).概念:
Statement:(用于执行不带参数的简单 SQL 语句)
    每次执行sql语句,数据库都要执行sql语句的编译,最好用于仅执行一次查询并返回结果的情形,效率高于PreparedStatement.
用法:
    String sql = "select seq_orderdetid.nextval as orderidfrom 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操作;
 支持调用存储过程,提供了对输出和输入/输出参数的支持;

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

分享到:
评论

相关推荐

    【技术篇】JDBC连接ORACLE数据库之方法.docx

    5. 使用PreparedStatement和CallableStatement: 对于含有参数的SQL语句,推荐使用PreparedStatement,它可以防止SQL注入攻击,并且性能更优。对于存储过程的调用,则使用CallableStatement。 6. 数据库连接池: ...

    jdbc8.jar-oracle12

    可以使用`Statement`、`PreparedStatement`或`CallableStatement`对象执行SQL查询、更新等操作。 4. 关闭资源: 使用完数据库连接后,务必关闭`Connection`、`Statement`和`ResultSet`对象,以避免资源泄漏。 **...

    JDBC学习文档

    5. **创建带有类型、并发性和保持性的PreparedStatement**:`PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability)` - **用途**:创建一个带...

    oracle-jdbc-12.2.0.1.zip

    4. **SQL执行**: `java.sql.Statement`、`PreparedStatement`和`CallableStatement`接口用于执行SQL语句。`PreparedStatement`允许预编译SQL,提高执行效率,减少SQL注入风险;`CallableStatement`用于调用存储过程...

    Java语言SQL接口—JDBC编程技术

    - CallableStatement:用于调用数据库存储过程。 2. JDBC工作流程: - 加载和注册驱动:使用Class.forName()方法加载JDBC驱动,并通过DriverManager.getConnection()建立数据库连接。 - 创建Connection对象:...

    JDBC.rar_JDBC程序

    有三种类型:Statement、PreparedStatement和CallableStatement。 4. **PreparedStatement对象**:预编译的SQL语句,提供性能优势,并且能防止SQL注入攻击。 5. **ResultSet对象**:存储查询结果,是结果集的游标...

    Oracle.jdbc for win

    5. SQL执行:Statement、PreparedStatement和CallableStatement接口用于执行SQL语句。Statement适用于静态SQL,PreparedStatement适用于预编译的SQL,CallableStatement用于调用存储过程。 6. 结果集(ResultSet)...

    java之JDBC详细介绍

    1. **JDBC API**: JDBC API包含了一系列的接口和类,如`java.sql.DriverManager`、`Connection`、`Statement`、`PreparedStatement`、`ResultSet`等。它们为开发者提供了与数据库交互的标准方法。 2. **JDBC的用途*...

    第8章数据库编程.ppt

    数据库编程技术 ...本章节主要介绍了 JDBC 工作原理、JDBC URL 和数据库连接、Statement 对象和 SQL 语句执行、高级开发技巧等方面的知识点,为读者提供了 Java EE 编程技术中数据库编程的相关知识基础。

    jdbc.rar_jdbc

    - **Statement**:用于执行SQL语句,有三种实现类:Statement、PreparedStatement和CallableStatement,分别对应普通SQL、预编译SQL和存储过程。 - **ResultSet**:执行查询语句后返回的结果集,提供了获取数据的...

    JDBC.rar_JDBC API_JDBC 接口

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

    Oracle JDBC jar包下载

    - 使用Statement、PreparedStatement或CallableStatement执行SQL语句,处理结果集以获取数据。 - 记得在完成数据库操作后关闭连接和其他资源,以避免资源泄露。 总的来说,Oracle JDBC驱动的不同版本是为了适应不同...

    java数据库连接方法

    有三种类型的Statement:Statement、CallableStatement和PreparedStatement。Statement适用于执行简单的非参数化SQL语句。 5. PreparedStatement接口: PreparedStatement是预编译的SQL语句,它可以提高性能,减少...

    JDBC连接方法总汇

    本文主要介绍了JDBC的基本概念、如何使用JDBC连接各种数据库以及如何利用PreparedStatement和CallableStatement进行更高效、安全的数据操作。通过对JDBC的理解和应用,开发者可以更加灵活地操作不同类型的数据库,...

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

    通过这个系统,我们可以学习如何利用JDBC进行数据库操作,如数据查询、插入、更新和删除,以及处理更复杂的数据类型和连接池管理。以下将详细讲解其中涉及的关键知识点。 1. **CallableStatement**:...

    JDBC知识总结(针对基础知识)

    - CallableStatement:用于调用存储过程。 - ResultSetMetaData:获取查询结果的元数据,如列名、类型等。 - ConnectionPool:连接池技术,提高数据库访问效率,管理数据库连接。 -事务管理:通过Connection对象...

    java之jdbc项目文件

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

    Java的JDBC中Statement与CallableStatement对象实例

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

    JDBC操作(ppt)

    - 创建Statement对象:用于执行SQL语句,有三种类型:Statement、PreparedStatement和CallableStatement。 3. **SQL操作** - 查询:使用executeQuery()执行SELECT语句,返回ResultSet对象表示查询结果。 - 插入...

    JDBC常考知识点,常用api

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

Global site tag (gtag.js) - Google Analytics