Oracle中实现分页的存储过程,返回类型为游标,在java中进行接收

本文介绍了如何在Oracle中创建一个存储过程用于分页查询,并使用Java通过MyBatis调用该存储过程。存储过程接受页码和每页大小作为输入参数,返回游标和总页数、总记录数。Java代码中,定义了Mapper接口和实现类,使用Map传递参数,通过MyBatis的@CallProc注解调用存储过程并获取结果集。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
在Oracle中建立存储过程
/
create or replace package page_package as
type p_cursor is ref cursor;end page_package;//创建包
//实现分页
create or replace procedure pro_page(page in number,psize in number,z_page out number,cnum out number,p_cur out page_package.p_cursor)
as
begin
select count(
)into cnum from userinfo;
z_page:=ceil(cnum/psize);
open p_cur for ‘select * from(select rownum rn,u.* from userinfo u where rownum<=’||pagepsize||’) where rn>’||psize(page-1);
end;

//编写java类
//Mapper接口所实现的
package com.xa.mapper;
import java.util.Map;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.ResultType;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.mapping.StatementType;

import com.xa.entity.Userinfo;

public interface IUserMapper {
//分页
/*
调取存储过程,“p1”,"p2"表示输入的页数和每页显示的个数
p3,表示输出查询结果的总页数
p4,表示总记录数
p5用游标接收,表示查询的结果集
*/
@Select({“call pro_page(//存储过程名
#{p1,mode=IN,jdbcType=INTEGER},
#{p2,mode=IN,jdbcType=INTEGER},
#{p3,mode=OUT,jdbcType=INTEGER},
#{p4,mode=OUT,jdbcType=INTEGER},
#{p5,mode=OUT,jdbcType=CURSOR,resultMap=result})”})
@Results(id=“result”,value={//查询的结果集,与实体类对应
@Result(id=true,column=“u_id”,property=“u_id”),
@Result(column=“u_name”,property=“u_name”),
@Result(column=“birthday”,property=“birthday”),
@Result(column=“c_id”,property=“c_id”)
})
@ResultType(com.xa.entity.Userinfo.class)//类型为对应的实体类
@Options(statementType=StatementType.CALLABLE)
public void callProc(Map map);
}
//实现类
package com.xa.service;

import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.xa.entity.Userinfo;
import com.xa.mapper.IUserMapper;

@Service(“userService”)
public class UserServiceImp {
@Autowired
private IUserMapper userMapper;
public void callPro(Map map) {
// TODO Auto-generated method stub
userMapper.callProc(map);
}
}
//测试类
package com.xa.test;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.mapping.ResultMap;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.xa.entity.Userinfo;
import com.xa.service.IUserService;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
BeanFactory bf=new ClassPathXmlApplicationContext(“applicationContext.xml”);
IUserService userService=(IUserService)bf.getBean(“userService”);
Map map=new HashMap();
map.put(“p1”, 1);//表示第一页
map.put(“p2”, 2);//表示每页只显示2条数据
userService.callPro(map);
int z_page=(Integer)map.get(“p3”);
int znum=(Integer)map.get(“p4”);
System.out.println(“总页数为:”+map.get(“p3”)+"\n总记录数为:"+map.get(“p3”));
List list=(List)map.get(“p5”);
for (Userinfo userinfo : list) {
System.out.println(userinfo.getU_name());
}
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值