下午我写了一篇关于mybatis执行存储过程的文章,但是呢时间关系没来得及说用jdbc来执行的方法,大家可以参考我的这篇文章
http://blog.csdn.net/chenwill3/article/details/7651155
这个文章是好久以前写的,里面只处理了简单数据,没有说到游标的用法。原理很简单,因为游标这种数据其实就类似于resultset,也就是说只需要拿到resultset在从里面取数据就好了,一起来看看吧
1.我自己写的一个数据库连接工具类
package org.lxh.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DBConnectionUtil {
private static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver";
private static final String DBURL = "jdbc:oracle:thin:@127.0.0.1:1521:ORCL";
private static final String DBUSER = "scott";
private static final String DBPASSWORD = "123456";
private Connection conn = null;
public DBConnectionUtil() {
try {
Class.forName(DBDRIVER);
this.conn = DriverManager.getConnection(DBURL, DBUSER, DBPASSWORD);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public Connection getConnection() {
return this.conn;
}
public void close() throws Exception {
if (this.conn != null) {
try {
this.conn.close();
} catch (Exception e) {
// TODO Auto-generated catch block
throw e;
}
}
}
}
2.使用CallableStatement执行存储过程并处理游标
package org.lxh.junit;
import org.lxh.util.DBConnectionUtil;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
public class Test2 {
@org.junit.Test
public void showList() throws Exception {
DBConnectionUtil util = new DBConnectionUtil();
Connection getConn = util.getConnection();
CallableStatement cs = getConn
.prepareCall("{call GETTEACHER(cur_arg=> :cur_arg)}");
cs.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);
cs.execute();
ResultSet rs = (ResultSet) cs.getObject(1);
while (rs.next()) {
System.out.println(rs.getInt(1) + "," + rs.getString(2) + ","
+ rs.getString(3));
}
getConn.close();
}
}
我顺便把存储过程贴出来
CREATE OR REPLACE Procedure getTeacher(cur_arg out Sys_Refcursor)
As
begin
open cur_arg for Select * From teacher;
End
下面来看看执行的结果,jdbc执行的时候比mybatis快很多也不知道为什么
最后来看2个异常,第一个如下
Caused by: java.lang.ClassNotFoundException: javax.persistence.EntityListeners
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 29 more
这个异常是因为缺少jpa的jar包,下面是第二个异常
Caused by: java.lang.ClassNotFoundException: javax.transaction.SystemException
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 34 more
这个异常是因为缺少jta的jar包,2个异常经常在hibernate开发时候出现。