oracle spring 分页查询,SpringJDBC 调用oracle 通用存储过程分页

我博客前面有写道SpringJDBC调用通用的Oracle存储过程,今天来讲一下通用的Java存储过程带分页的功能,其中里面还有动态查询的SQL拼接,好的,先上代码

1.Java代码

@Autowired

private JdbcTemplate jdbcTemplate;

/**分页查询

* @return

*/

@ResponseBody

@RequestMapping(value = "/findPageList", method = {RequestMethod.GET, RequestMethod.POST}, produces = "application/json;charset=utf-8")

public IResult findPageList(@RequestBody String param){

HashMap hashMap = JSON.parseObject(param, HashMap.class);

String name=(String) hashMap.get("name");

ListreqList=null;

if( hashMap.get("reqList") != null){

reqList=(List) hashMap.get("reqList");

}

ListresList=(List) hashMap.get("resList");

Mapmap=this.callPageProcedure(name,reqList,resList);

List rlist= (List)map.get("data");

int rtotal= (Integer)map.get("total");

return new PageResultBean>(rlist,rtotal);

}

/***

* 分页的存储过程

* * 获取数据库内的存储过程--返回一个Map,封装有list集合和总记录数

* @param procedureName 存储过程名

* @param inParameter 输入的参数page,limit 至少有2个

* @param outParamter 输出的参数

* @return

*/

private MapcallPageProcedure(final String procedureName,final List inParameter,final List outParamter){

if(procedureName==null || procedureName.length() == 0 ){

return null;

}

//输入参数的校验

if(inParameter ==null ){

throw new BizException("输出参数为空!");

}

//输入参数的校验

if(inParameter.size()<2 ){

throw new BizException("输出参数的个数错误!");

}

//输出参数的校验,没有返回参数则抛出异常

if(outParamter == null || outParamter.size() == 0){

throw new BizException("输出参数为空!");

}

Mapr = (Map) jdbcTemplate.execute(

new CallableStatementCreator() {

public CallableStatement createCallableStatement(Connection con) throws SQLException {

int inSize = inParameter==null?0:inParameter.size();

//int outSize = outParamter==null?0:outParamter.size();

StringBuffer sbsql = new StringBuffer();

sbsql.append("{call "+procedureName).append("(");

//注意这里面返回的是游标,加1即可

for(int i=0;i 0 ){

String typeName = null;

for(int i=0;i>() {

public MapdoInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException {

int inSize = inParameter==null?0:inParameter.size();

MapresMap=new HashMap<>();

Listlist = new ArrayList();

cs.execute();

ResultSet rs = (ResultSet) cs.getObject(inSize+1);// 获取游标一行的值

int count=(int)cs.getObject(inSize);//取条数

while (rs.next()) {// 转换每行的返回值到Map中

Map rowMap = new HashMap();

for(int i=0;i

2.Oracle数据库代码

--程序包头

create or replace package P_findAreaPage_pak

is

type outData is ref cursor;

procedure P_findAreaPage(p_pagesize int,

p_startsize int,

jgdm varchar2,

ywlx varchar2,

jgmc varchar2,

xzqhname varchar2,

sDate varchar2,

eDate varchar2,

out_pagecount out int,--输出参数,调用的时候随便填写一个整数值,详情---请看postman传参

out_datacollection out outData);

end P_findAreaPage_pak;

--程序包体

create or replace package body P_findAreaPage_pak

is

procedure P_findAreaPage(p_pagesize int,

p_startsize int,

jgdm varchar2,

ywlx varchar2,

jgmc varchar2,

xzqhname varchar2,

sDate varchar2,

eDate varchar2,

out_pagecount out int,--输出参数,调用的时候随便填写一个整数值

--请看postman传参

out_datacollection out outData)

as

v_sql varchar2(3000);

v_count int;

v_upCount int;

v_lowCount int;

v_where varchar2(3000):='where 1=1';

begin

--拼接查询条件

IF jgdm IS NOT NULL or jgdm <> ' ' THEN

v_where := v_where||' and t0.jgdm= '''||jgdm||'''';

END IF;

IF ywlx IS NOT NULL or ywlx <> ' ' THEN

v_where := v_where||' and t0.ywlx = '''||ywlx||'''';

END IF;

IF jgmc IS NOT NULL or jgmc <> ' ' THEN

v_where := v_where||' and t0.jgmc like ''%'||jgmc||'%''';

END IF;

IF xzqhname IS NOT NULL or xzqhname <> ' ' THEN

v_where := v_where||' and t0.xzqhname like ''%'||xzqhname||'%''';

END IF;

IF sDate IS NOT NULL or sDate <> ' ' THEN

v_where := v_where|| ' and t0.bzrq >= to_date('''||sDate||''',''yyyy-mm-dd'')';

END IF;

IF eDate IS NOT NULL or eDate <> ' ' THEN

v_where := v_where|| ' and t0.bzrq <= to_date('''||eDate||''',''yyyy-mm-dd'')';

DBMS_OUTPUT.put_line(v_where);

END IF;

--获取页面总的记录数

execute immediate ' select count(1)

from AA t0 inner JOIN BB t1 on T0.BZJGDM =T1.BZJGCODE ' || v_where into v_count;

out_pagecount:=v_count;

--获取数据的上下限

v_upCount:=p_startsize*p_pagesize; --上限

v_lowCount:=v_upCount-p_pagesize+1; --下限

v_sql:='select * from (select a.*,rownum r from (select nvl(substr(T1.BZJGNAME,4),''||其它地方||'') as name,count(1) as sum

from AA t0 inner JOIN BB t1 on T0.BZJGDM =T1.BZJGCODE ' || v_where ||' GROUP BY T1.BZJGNAME ORDER BY count(1) desc ) a where rownum <='||to_char(v_upCount)||') B

where r>='||to_char(v_lowCount);

DBMS_OUTPUT.put_line(v_sql);

open out_datacollection for v_sql;

end p_findAreaPage;

end P_findAreaPage_pak;

注意,我这里用到了两张表,你们可以自行新建两张表,将我的替换即可,附上建表语句

3.建表语句,数据你们自行插入

-- Create table

create table AA

(

jjhydmold VARCHAR2(10),

orgid NUMBER(20),

jgdm VARCHAR2(10),

jgmc VARCHAR2(200),

xzqhname VARCHAR2(100),

bzrq DATE,

bzjgdm VARCHAR2(9),

fddbr VARCHAR2(200),

zjlx VARCHAR2(100),

zjhm VARCHAR2(25),

jgdz VARCHAR2(200),

yzbm VARCHAR2(10),

dhhm VARCHAR2(42),

zczj NUMBER(20,8),

zch VARCHAR2(65),

pzjgmc VARCHAR2(160),

jyfw VARCHAR2(2000),

pigetime DATE,

ywlx VARCHAR2(50),

zgrs NUMBER(20),

rn NUMBER

)

-- Create table

create table BB

(

bzjgid NUMBER(10) not null,

bzjgname VARCHAR2(100),

bzjgcode VARCHAR2(100),

bzjgjcname VARCHAR2(50),

centerid NUMBER(10),

centername VARCHAR2(50),

centercode VARCHAR2(50),

address VARCHAR2(150),

tellphone VARCHAR2(50),

leader VARCHAR2(50),

mobilephone VARCHAR2(50),

remark VARCHAR2(500),

coltime DATE

)

4.Postman请求

//请求url(Get或Post请求)

localhost:9090/produce/findPageList

//参数JSON

{"name":"P_findAreaPage_pak.P_findAreaPage",

"reqList":[ "3", "1","","换证","武汉","","","2009-02-02",1222],

"resList":["name","sum"]

}

//返回JSON

{

"code": "0000",

"msg": "success",

"data": [

{

"name": "办证大厅",

"sum": 158

},

{

"name": "青山区",

"sum": 7

},

{

"name": "洪山区",

"sum": 7

}

],

"count": 202

}

注意reqList最后一个参数是一个输入输出参数,我们这里随便填写一个整数值即可,我这里填写的是:1222

最后,附上的Java工具类

//总共4个类

//返回结果

@Data

public class PageResultBeanextends AbstractResult implements Serializable{

private static final long serialVersionUID = 1L;

/**

* 分页数据,同layui接受的参数名一样

* */

private T data;

/**

* 记录总数,同layui接受的参数名一样

* */

private Integer count;

public PageResultBean() {

super();

}

/**

* 构造函数

* */

public PageResultBean(T data,Integer count) {

super();

this.data = data;

this.count = count;

}

/**

* 构造函数

* */

public PageResultBean(IErrCode e) {

super();

this.msg = e.getDesc();

this.code = e.getCode();

}

public PageResultBean(Throwable e) {

super();

this.msg = e.toString();

this.code = SYSTEM_FAIL;

}

/**

* 构造函数

* */

public PageResultBean(String code,String msg) {

super();

this.msg = msg;

this.code = code;

}

}

//返回结果

@Data

public abstract class AbstractResult implements IResult{

/**成功Code*/

public static final String SUCCESS = "0000";

/**系统失败Code*/

public static final String SYSTEM_FAIL = "9999";

/**检查失败Code*/

public static final String CHECK_FAIL = "9100";

/**业务失败Code*/

public static final String BIZ_FAIL = "9200";

public static final String HTTP_FILE="5000";

/**错误代码*/

protected String code = SUCCESS;

/**错误信息*/

protected String msg = "success";

}

//返回结果

public interface IResult {

}

/**

* 业务异常封装

* @author leiYao 2017-11-10

* */

@Data

public class BizException extends RuntimeException {

private static final long serialVersionUID = 1L;

private String errorCode;

public BizException() {

}

/**

* 构造函数

* */

public BizException(String code,String message) {

super(message);

this.errorCode = code;

}

/**

* 构造函数

* */

public BizException(IErrCode e) {

super(e.getDesc());

this.errorCode = e.getCode();

}

public BizException(Throwable cause) {

super(cause);

}

public BizException(String message, Throwable cause) {

super(message, cause);

}

public BizException(String message) {

super(message);

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/257999.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

宝宝头三年至关重要,不看悔掉肠子

http://www.nowamagic.net/librarys/eight/posts/1885以下是一个早教工作者分享他关于现代父母早期教育中出现的问题和多数父母的误区。正如作者问自己的&#xff1a;“在孩子人生最重要的头三年&#xff0c;我做对了吗&#xff1f;在我的引导下&#xff0c;她能保持强烈的探索…

2015年底总结

2015-12-06 16:17&#xff0c;今天是周日&#xff0c;不需要加班的&#xff0c;到公司看看书&#xff0c;写写代码的&#xff0c;突然想到又是年底了&#xff01;需要写点东西来记录总结一下2015年了 年初的时候&#xff0c;入职现在这家成都游戏公司&#xff0c;到现在差不多也…

python脚本

01.用户三次登录锁定猜年龄游戏02.购物车省县市三级联动03.函数、文件操作实现数据增删改查---low版本04.ATM购物商城05.模拟计算器持续更新中...脚本很low&#xff0c;但我一直在学。。。转载于:https://blog.51cto.com/lyndon/1947437

oracle 命令日志输出,ORACLE常用命令日志

第一章&#xff1a;日志管理1.forcing log switchessql> alter system switch logfile;2.forcing checkpointssql> alter system checkpoint;3.adding online redo log groupssql> alter database add logfile [group 4]sql> (/disk3/log4a.rdo,/disk4/log4b.rdo) …

[VMware WorkStation]虚拟机网络

1、简介&#xff1a; vmware为我们提供了三种网络工作模式&#xff0c;它们分别是&#xff1a;Bridged&#xff08;桥接模式&#xff09;、NAT&#xff08;网络地址转换模式&#xff09;、Host-Only&#xff08;仅主机模式&#xff09;。在我安装了vmware workstation player 1…

阿里查出售假店主并索赔140万,这次是大数据帮的忙

阿里巴巴将平台上一家曾出售假货的网店起诉至深圳市龙岗区法院&#xff0c;以“违背平台不得售假约定、侵犯平台商誉”为由索赔140万元人民币。此案为国内首例电商平台起诉售假店主案。 阿里巴巴目前已经准备了一份超长起诉清单&#xff0c;计划以违背合同约定、侵犯商誉为由&a…

oracle 升级前备份,rac(exadata)升级前的备份及LVM快照的恢复

1、热备所有数据库热备脚本&#xff1a;10.1.1.200&#xff0c;/backup/scripts/whole_db_backup.sh2、在每个计算节点执行dbserver_backup.sh脚本Run script "dbserver_backup.sh" in each compute node. The script takes backup of "/boot" (to ROOT f…

我心中的MySQL DBA

原文网址链接&#xff1a;http://wangwei007.blog.51cto.com/68019/1718311 MySQL是一个跨平台的开源关系型数据库管理系统&#xff0c;目前MySQL被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低&#xff0c;尤其是开放源码这一特点&#xff0c…

Visual Studio 2015 前瞻 属性初始化赋值!

通常我们建立属性的时候如果带初始化值的时候我们经常会这样处理。 class MyClass{private string _name "hello world!";public string Name {get{return _name;}set{_name value;}}} 或者也可以这样写 &#xff1a; class MyClass{public string Name { set; get…

火狐中的CSS Grid Inspector新增强大的功能

2019独角兽企业重金招聘Python工程师标准>>> 上周&#xff0c;我谈到了日常的网站浏览我用Firefox&#xff0c;但是在切图网做前端开发的时候我会用Chrome。 随着每个版本&#xff0c;FF Nightly在开发工具箱中有一些越来越棒的工具&#xff0c;这些更新使Firefox成…

Linux内核态之间进程通信,内核态和用户态通信(二)--实现

本文主要使用netlink套接字实现中断环境与用户态进程通信。系统环境&#xff1a;基于linux 2.6.32.27 和 linux 3.16.36Linux内核态和用户态进程通信方法的提出和实现用户上下文环境运行在用户上下文环境中的代码是可以阻塞的&#xff0c;这样&#xff0c;便可以使用消息队列和…

上下文无关文法

在计算机科学中&#xff0c;若一个形式文法 G (N, Σ, P, S) 的产生式规则都取如下的形式&#xff1a;V -> w&#xff0c;则称之为上下文无关文法&#xff08;英语&#xff1a;context-free grammar&#xff0c;缩写为CFG&#xff09;&#xff0c;其中 V∈N &#xff0c;w∈…

centos 安装mysql时错误unknown variable #39;defaults-file=/opt/redmine-2.6.0-2/mysql/my.cnf#39;...

找到my.cnf所在目录。运行 chmod 664 my.cnf&#xff0c;再启动mysql成功

p5js可以在linux上运行吗,在linux上使用python运行phantomjs

我跟随this link&#xff0c;现在当我输入phan然后输入tab(\t)时&#xff0c;它会自动完成幻影JS。在但是&#xff0c;如果我运行phantomJS -v或phantomJS --version&#xff0c;我得到&#xff1a;bash: /usr/local/bin/phantomjs: /lib/ld-linux.so.2: bad ELF interpreter: …

使用Instant Client配置PL/SQL Developer

之前使用PL/SQL Developer都是直接在本机安装完整版的Oracle Database&#xff0c;一是省事&#xff0c;二是可以在本机做一些demo测试&#xff1b;最近换了台电脑&#xff0c;感觉Instant Client更简单一些&#xff0c;分分钟配好。 先下载Instant Client&#xff0c;注意&…

linux脚本转换exe,Ps1 To Exe(powershell脚本转换EXE工具) V3.0.6 官方版

Ps1 To Exe是款将PowerShell脚本转换为EXE可执行文件的软件。同时软件非常小巧&#xff0c;功能实用&#xff0c;软件还支持各国的语言&#xff0c;有需要的小伙伴们不要错过了。(点击图片查看高清大图)【软件特色】1、Ps1 To Exe 支持多种语言2、Ps1 To Exe使用简单&#xff0…

标C编程笔记day04 预处理、宏定义、条件编译、makefile、结构体使用

预处理&#xff1a;也就是包括须要的头文件&#xff0c;用#include<标准头文件>或#include "自己定义的头文件"宏定义&#xff0c;如&#xff1a;#define PI 3.1415926查看用宏定义的值替换宏名称,如&#xff1a;gcc -E test.c带參数的宏&#xff1a;MAX(x,y) …

java数据结构系列——排列(2):有序阵列

package Array;/*** 对数组排序。当添加到阵列保持有序数组元素&#xff1b;* author wl**/ public class MyOrderArray {private long array[];private int elements;//用于记录数组中实际数据的个数public MyOrderArray(){arraynew long[50];//数组默认长度为50&#xff1b;}…

NSString 练习

//将“⽂文艺⻘青年”改成“213⻘青年”。 NSString *str "文艺青年"; NSString *str1 [str stringByReplacingOccurrencesOfString:"文艺" withString:"213"]; NSLog("%",str1); //将 整数123 转换为字符串“123”。 NSString *s …

安全市场五巨头将面临新兴厂商的挑战

赛门铁克、思科、IBM、Check Point、英特尔&#xff0c;警钟已敲响~ 2016年同比增长率11.5%的数据出台之后&#xff0c;市场研究公司科技商业研究(TBR)为来年的安全行业绘制了一幅崭新的蓝图——安全市场上现有的企业将受到新兴厂商的挑战。 展望未来&#xff0c;现有安全市场五…