hibernate里使用jdbc方式调用oracle带游标返回参数的简单分页存储过程

来源:互联网 发布:中原工学院软件类 编辑:程序博客网 时间:2024/05/17 03:19

 最近要学一个hibernate调用游标,找来找去也没找到如何调用,最后看了许多文章,用jdbc方式来调用也是可以的,但是效率上就不行了,因为每次都要连接数据库,从而放弃了hibernate的对象持久化,下面就是整个代码:

希望能帮到有需要的人!!!

 

SQL 代码

--创建表

create table shop(

sid int primary key no tnull,

sname varchar(20) not null,

price int not null

);

--创建包头,声明游标,两个参数,当前页和每页显示的数量,还有一个游标用于接收返回的结果集

create or replace package pkg_query as
 type my_ref_cursor is ref cursor;
 procedure pro_query(curpage int,pagesize int,val out my_ref_cursor);
end pkg_query;

--创建包体

create or replace package body pkg_query as 
 procedure pro_query(curpage int,pagesize int,val out my_ref_cursor)  
 is 
v_sql varchar(1000):='';
begin
  v_sql:='select * from (select rownum as rn,sid,sname,price from shop where rownum<= '||curpage*pagesize|| ' )where rn >='||pagesize*(curpage-1);
  dbms_output.put_line(v_sql);
  open val for v_sql;
 end;
end pkg_query;

 

注意:包头和包体要分开执行

java代码:

public List findByPage(int curpage,int pagesize)
 {
  List list = null;
  try {

//获取存储过程,问号代表参数
   CallableStatement csmt = getSession().connection().prepareCall("{call pkg_query.pro_query(?,?,?)}");

//设置参数,可以使用名字或者顺序位置
   csmt.setInt("curpage",curpage);
   csmt.setInt("pagesize",pagesize);

//设置返回参数
   csmt.registerOutParameter("val", oracle.jdbc.OracleTypes.CURSOR);

//执行过程
   boolean b = csmt.execute();

//获得打开的游标(结果集)
   ResultSet rs = (ResultSet)csmt.getObject("val");

//循环添加就OK了
   list = new ArrayList();
   while(rs.next())
   {
    Shop shop = new Shop();
    shop.setSid(rs.getLong("sid"));
    shop.setSname(rs.getString("sname"));
    shop.setPrice(rs.getLong("price"));
    list.add(shop);
   }
  } catch (DataAccessResourceFailureException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (HibernateException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IllegalStateException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return list;
 }

 

希望能帮到有需要的人!!!

原创粉丝点击