`
jayghost
  • 浏览: 430002 次
  • 性别: 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入门学习简单教程

    JDBC学习的简单教程,包括如何连接数据库,使用Statement,PreparedStatement,CallableStatement,元数据等。 主要用于教学和自学

    java jbdc 技术编程文档

    Java的数据库连接编程(JDBC)技术 [知识要点]:JDBC、JDBC的工作原理,访问数据库的方法、Statement、PreparedStatement、CallableStatement,ResultSet等对象的编程使用

    jdbc连接数据库的方式2

    Oracle提供的Statement和 CallableStatement并不真正地支持批处理,只有PreparedStatement对象才真正地支持批处理。我们可以使用addBatch()和executeBatch()方法选择标准的JDBC批处理,或者通过利用...

    JDBC笔记 JDBC笔记

    java.sql.PreparedStatement 继承Statement接口,表示预编译的SQL语句的对象,SQL语句被预编译并且存储在PreparedStatement对象中。然后可以使用此对象高效地多次执行该语句。 java.sql.CallableStatement 用来...

    jdbc基础和参考

    CallableStatement:主要用来执行pl/sql的一些过程,函数等。 1.写一条恒成立的select语句,无论你输入的条件是什么,总是能讲表中的所有数据输出 select id,last_name from s_emp where '1' ='1'; where 1=1; ...

    JDBC 3.0数据库开发与设计

    1.4 JDBC 3.0中的类和接口 1.4.1 java.sql包中的类和接口及其使用 1.4.2 javax.sql包中所含内容及其使用 1.5 JDBC驱动程序简介 1.5.1 JDBC-ODBC 桥和ODBC驱动程序 1.5.2 本地API部分Java驱动程序 1.5.3 JDBC...

    Java_JDBC由浅入深

    第九节 PreparedStatement接口的使用 62 第十节 CallableStatement接口的使用 62 9.1 无参无返回值存储过程调用 63 9.2 有参无返回值存储过程调用 63 9.3 有参有返回值存储过程调用 64 9.4 JDBC其他API 65 第十一节 ...

    Java数据库编程宝典2

    第13章 使用PreparedStatement和CallableStatement 13.1 创建和使用PreparedStatement 13.1.1 创建PreparedStatement对象 13.1.2 在循环中使用PrenaredStatement 13.1.3 PreparedStatement返回的值 13.2 创建...

    Java数据库编程宝典4

    第13章 使用PreparedStatement和CallableStatement 13.1 创建和使用PreparedStatement 13.1.1 创建PreparedStatement对象 13.1.2 在循环中使用PrenaredStatement 13.1.3 PreparedStatement返回的值 13.2 创建...

    Java数据库编程宝典1

    第13章 使用PreparedStatement和CallableStatement 13.1 创建和使用PreparedStatement 13.1.1 创建PreparedStatement对象 13.1.2 在循环中使用PrenaredStatement 13.1.3 PreparedStatement返回的值 13.2 创建...

    Java数据库编程宝典3

    第13章 使用PreparedStatement和CallableStatement 13.1 创建和使用PreparedStatement 13.1.1 创建PreparedStatement对象 13.1.2 在循环中使用PrenaredStatement 13.1.3 PreparedStatement返回的值 13.2 创建...

    JDBC执行SQL操作.docx

    利用Statement实例通过执行静态SELECT语句完成,也可以利用PreparedStatement实例通过执行SELECT语句进行完成,还可以利用CallableStatement实例通过执行存储过程来完成。 (1)利用Statement实例通过执行静态...

    java业务层框架开发ibatis(java源码)

    public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { return null;} public CallableStatement prepareCall...

    java面向对象核心知识点,独门大法

    每一个知识点的讲解,都会包含语法,语法个数如何定义,然后语法下面就是使用方式,能够起到活学活用的帮助,比如在讲解jdbc的时候我会列举出来 Statement(执行简单的sql语句,不支持预编译) PreparedStatement...

    java经典面试2010集锦100题(不看你后悔)

    B) 在Java中布尔类型不能和数字之间不能来回转换,即false和true不对应任何零或非零的值。 C) 双精度类型double比单精度类型float具有更高的精度和更大的表示范围,但float类型具有速度快、占用内存小的优点。 D) 在...

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

    14.1.4 使用preparedstatement、callablestatement 469 14.2 jdbc进阶 472 14.2.1 使用datasource取得联机 472 14.2.2 使用resultset卷动、更新数据 476 14.2.3 批次更新 479 14.2.4 blob与clob 480 ...

Global site tag (gtag.js) - Google Analytics