hibernate调用返回游标的存储过程 hibernatejavaoraclejdbcdao
程序员文章站
2024-02-14 11:47:46
...
注:原创作品,转载请注明出处。
上篇博文介绍的是hibernate调用返回单值的存储过程,本片博文说的是hibernate调用返回游标的存储过程。
此此扁博文的存储过程的功能相当于是jdbc调用select 的作用。
1,创建oracle中的包,并在该包中创建的游标类型。
2,创建oracle存储过程,该存储过程有唯一的输出参数。
3,java调用存储过程的主程序。
4,java的dao层方法
上篇博文介绍的是hibernate调用返回单值的存储过程,本片博文说的是hibernate调用返回游标的存储过程。
此此扁博文的存储过程的功能相当于是jdbc调用select 的作用。
1,创建oracle中的包,并在该包中创建的游标类型。
---创建oracle的程序包,在该包中创建一个游标类型 --该类型在存储过程中用来生命输出参数的类型 create or replace package pkg_return_list as type list_cursor is ref cursor; end pkg_return_list;
2,创建oracle存储过程,该存储过程有唯一的输出参数。
--创建从java程序调用的存储过程,注意该存储过程的唯一输出 --参数的类型是个游标类型。 create or replace procedure pro_return_list(p_cursor out pkg_return_list.list_cursor) as begin open p_cursor for select * from TBL_ADDRESS; end pro_return_list;
3,java调用存储过程的主程序。
package com.supan.test; import com.supan.dao.imp.UserDaoImp; public class hibernate1 { public static void main(String[] args) { UserDaoImp udi = new UserDaoImp(); udi.callprocedureOfCursor(); } }
4,java的dao层方法
//调用返回游标的存储过程 public void callprocedureOfCursor() { //没有spring的注入,只有人工苦逼的注册sessionFactory属性 Configuration cof = new Configuration().configure(); this.setSessionFactory(cof.buildSessionFactory()); //定义存放结果的结果map final Map<String,String> result = new HashMap<String, String>(); getHibernateTemplate().execute(new HibernateCallback<Object>() { @Override public Object doInHibernate(Session session) throws HibernateException, SQLException { session.doWork(new Work() { @Override public void execute(Connection conn) throws SQLException { CallableStatement proc = null; ResultSet rs = null; try { proc = conn.prepareCall("{call pro_return_list(?)}"); //注意:这里是注册输出参数的类型 proc.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR); //执行存储过程 proc.execute(); //获取存储过程的输出参数 rs = (ResultSet)proc.getObject(1); while(rs.next()) { //注意访问结果集是从索引位置1开始的,而不是0 System.out.println(rs.getLong(1)); System.out.println(rs.getString(2)); System.out.println(rs.getString(3)); System.out.println(rs.getString(4)); System.out.println("----------------"); } } catch(Exception e) { //logger.error("访问数据库失败"); e.printStackTrace(); } finally { if(null != proc) { try { proc.close(); } catch (Exception e2) { //logger.error(close proc happend error); e2.printStackTrace(); } } } } }); return null; } }); }