用hibernate操作数据库可以通过获取的session值调用connection()方法获取connection从而调用存储过程
java调用存储过程
什么是存储过程?
存储过程是指保存在数据库并在数据库端执行的程序存储过程是为嵌入式SQL所设计
如何调用存储过程?
try{
int age = ;
String poetName = ;dylan thomas;;
CallableStatement proc = connectionprepareCall(;{ call set_death_age(? ?) };);
procsetString( poetName);
procsetInt( age);
csexecute();
}catch (SQLException e){ // ;}
传给prepareCall方法的字串是存储过程调用的书写规范它指定了存储过程的名称?代表了你需要指定的参数
存储过程可以有返回值
所以CallableStatement类有类似getResultSet这样的方法来获取返回值当存储过程返回一个值时你必须使用registerOutParameter方法告诉JDBC驱动器该值的SQL类型是什么你也必须调整存储过程调用来指示该过程返回一个值
connectionsetAutoCommit(false);
CallableStatement proc = connectionprepareCall(;{ ? = call snuffed_it_when(?) };);
procregisterOutParameter( TypesINTEGER);
procsetString( poetName);
csexecute();
int age = procgetInt();
复杂的返回值
static void sendEarlyDeaths(PrintWriter out){
Connection con = null;
CallableStatement toesUp = null;
try {
con = ConnectionPoolgetConnection();
// PostgreSQL needs a transaction to do this; con
setAutoCommit(false); // Setup the call
CallableStatement toesUp = connectionprepareCall(;{ ? = call list_early_deaths () };);
toesUpregisterOutParameter( TypesOTHER);
toesUpexecute();
ResultSet rs = (ResultSet) toesUpgetObject();
while (rsnext()) {
String name = rsgetString();
int age = rsgetInt();
outprintln(name + ; was ; + age + ; years old;);
}
rsclose();
}
catch (SQLException e) { // We should protect these calls toesUpclose(); conclose();
}
}
因为JDBC并不直接支持从存储过程中返回游标我们使用TypesOTHER来指示存储过程的返回类型然后调用getObject()方法并对返回值进行强制类型转换