前往顾页
以后地位: 主页 > 收集编程 > Jsp实例教程 >

java 调用 mysql存储过程实例代码

时候:2012-07-16 00:25来源:知行网www.zhixing123.cn 编辑:麦田守望者

import java.sql.*;

/**
*@author iGoder
*/
public class ProcedureTest {
/*
表和存储过程定义以下:
delimiter //

DROP TABLE if exists test //
CREATE TABLE test(
id int(11) NULL
) //

drop procedure if exists sp1 //

create procedure sp1(in p int)
comment 'insert into a int value'
begin
declare v1 int;
set v1 = p;
insert into test(id) values(v1);
end
//

drop procedure if exists sp2 //
create procedure sp2(out p int)
begin
select max(id) into p from test;
end
//

drop procedure if exists sp6 //
create procedure sp6()
begin
select * from test;
end//

*/

public static void main(String[] args) {
//callIn(111);
//callOut();
callResult();
}

/**
* 调用带有输入参数的存储过程
* @param in stored procedure input parameter value
*/
public static void callIn(int in){
//获得连接
Connection conn = ConnectDb.getConnection();
CallableStatement cs = null;
try {
//可以直接传入参数
//cs = conn.prepareCall("{call sp1(1)}");

//也能够用问号代替
cs = conn.prepareCall("{call sp1(?)}");
//设置第一个输入参数的值为110
cs.setInt(1, in);

cs.execute();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(cs != null){
cs.close();
}
if(conn != null){
conn.close();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}

}

/**
* 调用带有输入参数的存储过程
*
*/
public static void callOut() {
Connection conn = ConnectDb.getConnection();
CallableStatement cs = null;
try {
cs = conn.prepareCall("{call sp2(?)}");
//第一个参数的范例为Int
cs.registerOutParameter(1, Types.INTEGER);
cs.execute();

//获得第一个值
int i = cs.getInt(1);
System.out.println(i);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(cs != null){
cs.close();
}
if(conn != null){
conn.close();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}

/**
* 调用输入成果集的存储过程
*/
public static void callResult(){
Connection conn = ConnectDb.getConnection();
CallableStatement cs = null;
ResultSet rs = null;
try {
cs = conn.prepareCall("{call sp6()}");
rs = cs.executeQuery();

//循环输入成果
while(rs.next()){
System.out.println(rs.getString(1));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(rs != null){
rs.close();
}
if(cs != null){
cs.close();
}
if(conn != null){
conn.close();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}

}


/**
*获得数据库连接的类
*/

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

class ConnectDb {

public static Connection getConnection(){
Connection conn = null;
PreparedStatement preparedstatement = null;
try {
Class.forName("org.gjt.mm.mysql.Driver").newInstance();
String dbname = "test";
String url ="jdbc:mysql://localhost/"+dbname+"?user=root&password=root&useUnicode=true&characterEncoding=8859_1" ;
conn= DriverManager.getConnection(url);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}

}
7 - CallableStatement
本概述是从《JDBCTM Database Access from JavaTM: A Tutorial and Annotated Reference 》这本书中摘引来的。JavaSoft 目前正在筹办这本书。这本书是一本教程,同时也是 JDBC 的首要参考手册,它将作为 Java 系列的构成部分在 1997 年春季由 Addison-Wesley 出版公司出版。


7.1 概述
CallableStatement 工具为所有的 DBMS 供应了一种以标准情势调用已储存过程的体例。已储存过程储存在数据库中。对已储存过程的调用是 CallableStatement 工具所含的内容。这类调用是用一种换码语法来写的,有两种情势:一种情势带成果参数,另外一种情势不带成果参数(有关换码语法的信息,拜见第 4 节“语句”)。成果参数是一种输入 (OUT) 参数,是已储存过程的前往值。两种情势都可带有数量可变的输入(IN 参数)、输入(OUT 参数)或输入和输入(INOUT 参数)的参数。问号将用作参数的占位符。

在 JDBC 中调用已储存过程的语法以下所示。重视,方括号表示其间的内容是可选项;方括号本身其实不是语法的构成部分。

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

前往成果参数的过程的语法为:

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

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

{call 过程名}

凡是,建立 CallableStatement 工具的人该当晓得所用的 DBMS 是支撑已储存过程的,并且晓得这些过程都是些甚么。但是,如果需求查抄,多种 DatabaseMetaData 体例都可以供应如许的信息。比方,如果 DBMS 支撑已储存过程的调用,则 supportsStoredProcedures 体例将前往 true,而 getProcedures 体例将前往对已储存过程的描述。

CallableStatement 继承 Statement 的体例(它们用于措置一般的 SQL 语句),还继承了 PreparedStatement 的体例(它们用于措置 IN 参数)。CallableStatement 中定义的所有体例都用于措置 OUT 参数或 INOUT 参数的输入部分:注册 OUT 参数的 JDBC 范例(一般 SQL 范例)、从这些参数中检索成果,或查抄所前往的值是不是为 JDBC NULL。


7.1.1 建立 CallableStatement 工具
CallableStatement 工具是用 Connection 体例 prepareCall 建立的。下例建立 CallableStatement 的实例,此中含有对已储存过程 getTestData 调用。该过程有两个变量,但不含成果参数:

CallableStatement cstmt = con.prepareCall(
"{call getTestData(?, ?)}");

此中 ? 占位符为 IN、 OUT 还是 INOUT 参数,取决于已储存过程 getTestData。


7.1.2 IN 和 OUT 参数
将 IN 参数传给 CallableStatement 工具是经由过程 setXXX 体例完成的。该体例继承自 PreparedStatement。所传入参数的范例决定了所用的 setXXX 体例(比方,用 setFloat 来传入 float 值等)。

如果已储存过程前往 OUT 参数,则在履行 CallableStatement 工具之前必须先注册每个 OUT 参数的 JDBC 范例(这是必须的,因为某些 DBMS 请求 JDBC 范例)。注册 JDBC 范例是用 registerOutParameter 体例来完成的。语句履行完后,CallableStatement 的 getXXX 体例将取回参数值。精确的 getXXX 体例是为各参数所注册的 JDBC 范例所对应的 Java 范例(从 JDBC 范例到 Java 范例的标准映照见 8.6.1 节中的表)。换言之, 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);

CallableStatement 与 ResultSet 不合,它不供应用增量体例检索年夜 OUT 值的特别机制。


7.1.3 INOUT 参数
既支撑输入又接管输入的参数(INOUT 参数)除调用 registerOutParameter 体例外,还请求调用恰当的 setXXX 体例(该体例是从 PreparedStatement 继承来的)。setXXX 体例将参数值设置为输入参数,而 registerOutParameter 体例将它的 JDBC 范例注册为输入参数。setXXX 体例供应一个 Java 值,而驱动法度先把这个值转换为 JDBC 值,然后将它送到数据库中。

这类 IN 值的 JDBC 范例和供应给 registerOutParameter 体例的 JDBC 范例应当不异。然后,要检索输入值,就要用对应的 getXXX 体例。比方,Java 范例为 byte 的参数应当利用体例 setByte 来赋输入值。应当给 registerOutParameter 供应范例为 TINYINT 的 JDBC 范例,同时应利用 getByte 来检索输入值 (第 8 节“JDBC 和 Java 范例之间的映照”将给出详细信息和范例映照表)。

------分开线----------------------------
标签(Tag):Java JAVA实例教程 JAVA根本教程 Java源代码 Java技能
------分开线----------------------------
保举内容
猜你感兴趣