时间:2021-05-19
正如一个Connection对象创建Statement和PreparedStatement对象,它也创造了CallableStatement对象这将被用来执行调用数据库存储过程。
创建CallableStatement对象:
假设,需要执行以下Oracle存储过程:
注意: 上面已经写过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对象可以使用所有的三个。
这里是每个定义:
下面的代码片段显示了如何使用该Connection.prepareCall()方法实例化基于上述存储过程CallableStatement对象:
CallableStatement cstmt = null;try { String SQL = "{call getEmpName (?, ?)}"; cstmt = conn.prepareCall (SQL); . . .}catch (SQLException e) { . . .}finally { . . .}String变量的SQL表示存储过程,使用参数占位符。
使用CallableStatement对象是使用PreparedStatement对象。必须将值绑定到所有的参数执行该语句之前,否则将收到一个SQLException。
如果有IN参数,只要按照适用于PreparedStatement对象相同的规则和技巧;使用对应于要绑定Java数据类型的setXXX()方法。
当使用OUT和INOUT参数就必须采用额外CallableStatement方法的registerOutParameter()。registerOutParameter()方法JDBC数据类型绑定到数据类型的存储过程返回。
一旦调用存储过程,用getXXX()方法的输出参数检索值。这种方法投射SQL类型的值检索到Java数据类型。
关闭CallableStatement 对象:
正如关闭其他Statement对象,出于同样的原因,也应该关闭CallableStatement对象。
close()方法简单的调用将完成这项工作。如果关闭了Connection对象首先它会关闭CallableStatement对象为好。然而,应该始终明确关闭的CallableStatement对象,以确保正确的清除。
CallableStatement cstmt = null;try { String SQL = "{call getEmpName (?, ?)}"; cstmt = conn.prepareCall (SQL); . . .}catch (SQLException e) { . . .}finally { cstmt.close();}PS:CallableStatement对象实例
下面是利用CallableStatement连同下列getEmpName()的MySQL存储过程的例子:
请确定已经在EMP数据库中创建该存储过程。可以使用MySQL查询浏览器来完成它。
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 ;基于对环境和数据库安装在前面的章节中进行,这个范例程式码已被写入。
复制下面的例子中JDBCExample.java,编译并运行,如下所示:
//STEP 1. Import required packagesimport java.sql.*;public class JDBCExample { // JDBC driver name and database URL static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; static final String DB_URL = "jdbc:mysql://localhost/EMP"; // Database credentials static final String USER = "username"; static final String PASS = "password"; public static void main(String[] args) { Connection conn = null; CallableStatement stmt = null; try{ //STEP 2: Register JDBC driver Class.forName("com.mysql.jdbc.Driver"); //STEP 3: Open a connection System.out.println("Connecting to database..."); conn = DriverManager.getConnection(DB_URL,USER,PASS); //STEP 4: Execute a query System.out.println("Creating statement..."); String sql = "{call getEmpName (?, ?)}"; stmt = conn.prepareCall(sql); //Bind IN parameter first, then bind OUT parameter int empID = 102; stmt.setInt(1, empID); // This would set ID as 102 // Because second parameter is OUT so register it stmt.registerOutParameter(2, java.sql.Types.VARCHAR); //Use execute method to run stored procedure. System.out.println("Executing stored procedure..." ); stmt.execute(); //Retrieve employee name with getXXX method String empName = stmt.getString(2); System.out.println("Emp Name with ID:" + empID + " is " + empName); stmt.close(); conn.close(); }catch(SQLException se){ //Handle errors for JDBC se.printStackTrace(); }catch(Exception e){ //Handle errors for Class.forName e.printStackTrace(); }finally{ //finally block used to close resources try{ if(stmt!=null) stmt.close(); }catch(SQLException se2){ }// nothing we can do try{ if(conn!=null) conn.close(); }catch(SQLException se){ se.printStackTrace(); }//end finally try }//end try System.out.println("Goodbye!");}//end main}//end JDBCExample现在编译上面的例子如下:
C:>javac JDBCExample.java当运行JDBCExample,它会产生以下结果:
C:>java JDBCExampleConnecting to database...Creating statement...Executing stored procedure...Emp Name with ID:102 is ZaidGoodbye!JDBC的SQL转义语法:
转义语法使能够使用通过使用标准的JDBC方法和属性,无法使用数据库的某些特性的灵活性。
一般的SQL转义语法格式如下:
{keyword 'parameters'}这里有以下这些,会发现非常有用的,而这样做的JDBC编程的转义序列:
d, t, ts 关键字:
他们帮助确定日期,时间和时间戳记文字。如所知,没有两个数据库管理系统是基于时间和日期的方式相同。此转义语法告诉驱动程序呈现在目标数据库的格式,日期或时间。实现例子:
其中yyyy=年,mm =月,DD =日。使用这种语法 {d '2009-09-03'}是2009年3月9日。
下面是一个简单的例子说明如何插入日期表:
//Create a Statement objectstmt = conn.createStatement();//Insert data ==> ID, First Name, Last Name, DOBString sql="INSERT INTO STUDENTS VALUES" + "(100,'Zara','Ali', {d '2001-12-16'})";stmt.executeUpdate(sql);同样,可以使用以下两种语法之一,无论是 t 或 ts:
{t 'hh:mm:ss'}其中hh=小时,mm=分,ss=秒。使用此语法 {t '13:30:29'}是下午1点三十分29秒.
{ts 'yyyy-mm-dd hh:mm:ss'}这是上述两种语法 'd' 和 't' 来表示时间戳结合语法。
escape 关键字:
该关键字标识LIKE子句中使用的转义字符。有用使用SQL通配符%,其中匹配零个或多个字符时。例如:
如果使用反斜杠字符()作为转义字符,还必须使用两个反斜杠字符在Java字符串字面,因为反斜杠也是一个Java转义字符。
fn 关键字:
此关键字代表在DBMS中使用标量函数。例如,可以使用SQL length函数计算GE字符串的长度:
这将返回11,字符串 'Hello World'的长度。.
call 关键字:
此关键字是用来调用存储过程。例如,对于一个存储过程,需要一个IN参数,请使用以下语法:
对于一个存储过程,需要一个IN参数并返回一个OUT参数,使用下面的语法:
{? = call my_procedure(?)};oj 关键字:
此关键字用来表示外部联接。其语法如下:
外连接表={LEFT| RIGHT| FULL}外连接{表|外连接}的搜索条件。例如:
String sql = "SELECT Employees FROM {oj ThisTable RIGHT OUTER JOIN ThatTable on id = '100'}";stmt.execute(sql);声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文作者介绍了通过Java如何去调用SQLServer的存储过程,详解了5种不同的存储。详细请看下文1、使用不带参数的存储过程使用JDBC驱动程序调用不带参数的
JDBC是一组能够执行SQL语句的API由于传统的数据库操作方式需要程序员掌握各个不同的数据库的API,极其不便因此java定义了JDBC这一标准的接口和类,为
Java与Oracle实现事务(JDBC事务)实例详解J2EE支持JDBC事务、JTA事务和容器事务事务,这里说一下怎样实现JDBC事务。JDBC事务是由Con
任何转载,请尊重版权。(作者:iiherooncsdn)一、如何创建java存储过程?通常有三种方法来创建java存储过程。1.使用oracle的sql语句来创
本文为大家分享了java使用jdbc连接数据库的具体代码,供大家参考,具体内容如下packagecom.tr.jdbc;importjava.sql.Conne