2.4.1 调用存储过程
优质
小牛编辑
125浏览
2023-12-01
在JDBC中调用存储过程需要使用Connection接口的prepareCall方法。prepareCall方法的定义如下:
CallableStatement prepareCall(String sql) throws SQLException;
其中sql参数表示调用存储过程的SQL语句,如果存储过程含有参数,需要使用“?”作为占位符,并使用CallableStatement接口的setXxx方法为参数赋值。setXxx方法可以使用参数名或参数索引来确定参数的位置。使用参数索引的setXxx方法的定义如下:
void setNull(int parameterIndex, int sqlType);
void setBoolean(int parameterIndex, boolean x);
void setByte(int parameterIndex, byte x);
void setShort(int parameterIndex, short x);
void setInt(int parameterIndex, int x);
void setLong(int parameterIndex, long x);
void setFloat(int parameterIndex, float x);
void setDouble(int parameterIndex, double x);
void set BigDecimal(int parameterIndex);
void setString(int parameterIndex, String x);
void setBytes(int parameterIndex, byte x[]);
void setDate(int parameterIndex, java.sql.Date x);
void setDate(int parameterIndex, java.sql.Date x, java.util.Calendar cal);
void setTime(int parameterIndex, java.sql.Time x);
void setTime(int parameterIndex, java.sql.Time x, java.util.Calendar cal);
void setTimestamp(int parameterIndex, java.sql.Timestamp x);
void setTimestamp(int parameterIndex, java.sql.Timestamp x, java.util.Calendar cal);
void setAsciiStream(int parameterIndex, java.io.InputStream x, int length);
void setBinaryStream(int parameterIndex, java.io.InputStream x, int length);
void setCharacterStream(int parameterIndex, java.io.Reader r, int length);
void setObject(int parameterIndex, Object x);
void setObject(int parameterIndex, Object x, int targetSqlType);
void setObject(int parameterIndex, Object x, int targetSqlType, int scale);
void setRef(int parameterIndex, Ref r);
void setBlob(int parameterIndex, Blob b);
void setClob(int parameterIndex, Clob c);
void setArray(int parameterIndex, Array a);
void setNull(int parameterIndex, int sqlType, String typeName);
void setURL(int parameterIndex, java.net.URL url);
使用参数名的setXxx方法的定义和上面的代码类似,只是方法的第一个参数是参数名(String类型),而不是参数索引。在使用prepareCall方法之前,先用如下的SQL语句建立一个存储过程,这个存储过程有一个输入参数:id,一个输出参数:total。存储过程的功能是统计t_booksale表中bookid字段的值等于id的图书销售总量。建立存储过程的SQL语句如下:
DROP PROCEDURE IF EXISTS mydb.p_myproc;
DELIMITER //
CREATE PROCEDURE mydb.p_myproc(IN id int, OUT total int)
begin
SELECT sum(amount) INTO total FROM mydb.t_booksale WHERE bookid = id;
end //
DELIMITER ;
对于存储过程的输出参数,需要使用registerOutParameter方法进行注册,registerOutParameter方法的定义如下:
void registerOutParameter(int parameterIndex, int sqlType) throws SQLException;
void registerOutParameter(String parameterName, int sqlType) throws SQLException;
从方法定义可以看出,registerOutParameter方法也可以使用参数索引或参数名来注册输出参数。其中sqlType参数表示输出参数的类型,它的值是java.sql.Types类定义的类型值中的一个。最后,可以使用getXxx方法获得输出参数返回的值。getXxx方法和setXxx方法类似,也可以通过参数索引或参数名来指定参数,使用参数索引的getXxx方法的定义如下:
String getString(int parameterIndex);
boolean getBoolean(int parameterIndex);
byte getByte(int parameterIndex);
short getShort(int parameterIndex);
int getInt(int parameterIndex);
long getLong(int parameterIndex);
float getFloat(int parameterIndex);
double getDouble(int parameterIndex);
java.math.BigDecimal getBigDecimal(int parameterIndex);
byte[] getBytes(int parameterIndex);
java.sql.Date getDate(int parameterIndex);
java.sql.Time getTime(int parameterIndex);
java.sql.Timestamp getTimestamp(int parameterIndex);
Object getObject(int parameterIndex);
Object getObject(int parameterIndex, java.util.Map);
Ref getRef(int parameterIndex);
Blob getBlob(int parameterIndex);
Clob getClob(int parameterIndex);
Array getArray(int parameterIndex);
java.net.URL getURL(int parameterIndex);
下面是一个调用存储过程的例子,代码如下:
public class StoredProcedure
{
public static void main(String[] args) throws Exception
{
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost/mydb?characterEncoding=UTF8",
"root", "1234");
CallableStatement cstmt = conn.prepareCall("call p_myproc(?, ?)");
// 向输入参数传值
cstmt.setString(1, "2");
// 注册输出参数
cstmt.registerOutParameter(2, java.sql.Types.INTEGER);
// 调用存储过程
cstmt.executeUpdate();
// 获得输出参数返回的值
System.out.println(cstmt.getInt(2));
cstmt.close();
conn.close();
}
}