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

1 篇文章 0 订阅
1 篇文章 0 订阅

 最近要学一个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;
 }

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值