`
san586
  • 浏览: 135590 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

ibatis调用oracle存储过程分页

阅读更多
1、users.xml片段
<resultMap class="user" id="get-all-user">
		<result property="id" column="id" />
		<result property="userName" column="username" />
		<result property="password" column="password" />
	</resultMap>
……
<parameterMap id="swapParameters" class="java.util.Map">
        <parameter property="sqlscript" jdbcType="VARCHAR2" javaType="java.lang.String" mode="IN"/>
        <parameter property="pageSize" jdbcType="INTEGER" javaType="java.lang.Integer" mode="IN"/>
        <parameter property="pageIndex" jdbcType="INTEGER" javaType="java.lang.Integer" mode="IN"/>
        <parameter property="totalCount" jdbcType="INTEGER" javaType="java.lang.Integer" mode="OUT"/>
        <parameter property="totalPage" jdbcType="INTEGER" javaType="java.lang.Integer" mode="OUT"/>
        <parameter property="v_cur" javaType="java.sql.ResultSet" jdbcType="ORACLECURSOR" mode="OUT" resultMap="get-all-user" />
     </parameterMap>
     <procedure id="retrieveByLikeCmpRoleC" parameterMap="swapParameters">
            {call P_QuerySplit(?,?,?,?,?,?)}
     </procedure>

2、oracle存储过程
create or replace procedure P_QuerySplit(sqlscript  varchar2, --表名/SQL语句
                                         pageSize   integer, --每页记录数
                                         pageIndex  integer, --当前页
                                         totalCount out number, --总记录数
                                         totalPage  out number, --总页数
                                         v_cur      out sys_refcursor --返回游标
                                         ) is
  v_PageSize   number;
  v_PageIndex  number;
  v_SQL_Count  varchar2(4000);
  v_SQL        varchar2(4000);
  v_StartIndex number;
  v_EndIndex   number;
begin
  v_PageSize := pageSize;
  if v_PageSize = 0 then
    v_PageSize := 1;
  end if;

  --统计记录数量
  v_SQL_Count := 'select count(*) from (' || sqlscript || ') a ';
  execute immediate v_SQL_Count
    into totalCount;
  --计算总页数
  totalPage := CEIL(totalCount / v_PageSize);
  --验证页号 如果页号大余了最大页数,返回最后一页
  v_PageIndex := pageIndex;
  if v_PageIndex > totalPage then
    v_PageIndex := totalPage;
  end if;

  --计算开始的Index和结束的Index
  v_StartIndex := (v_PageIndex - 1) * v_PageSize + 1;
  v_EndIndex   := v_PageIndex * v_PageSize;

  v_SQL := 'SELECT /*+ FIRST_ROWS */* FROM (';
  v_SQL := v_SQL || ' SELECT A.*, ROWNUM RN ';
  v_SQL := v_SQL || ' FROM (' || sqlscript || ') A ';
  v_SQL := v_SQL || ' WHERE ROWNUM <= ' || v_EndIndex;
  v_SQL := v_SQL || ')WHERE RN >= ' || v_StartIndex;

  open v_cur for v_SQL;
end P_QuerySplit;


3、dao中调用
Map b = new HashMap();
		b.put("sqlscript", " users ");
		b.put("pageSize", Integer.parseInt("2"));
		b.put("pageIndex", Integer.parseInt("3"));
		getSqlMapClientTemplate().queryForList("retrieveByLikeCmpRoleC", b);
System.out.println("总记录数:"+b.get("totalCount"));
		System.out.println("总页数:"+b.get("totalPage"));
		List<Users> listusers =(List<Users>) b.get("v_cur");
		for(Users p:listusers){
			System.out.println(p.getId()+"---"+p.getUserName()+"---"+p.getPassword());
		}


备注:由于oracle的存储过程有2种写法,一种是FUNCTION函数,一种是procedure。他们的返回值的写法不一样,如:
CREATE OR REPLACE PACKAGE REFS_PCK AS
  TYPE REF_CURSOR_T IS REF CURSOR;
  FUNCTION GET_REFS RETURN REF_CURSOR_T;
  procedure getFlowTrack(cur_Scan out REF_CURSOR_T,
                         cur_Send out REF_CURSOR_T);
END REFS_PCK;
/
CREATE OR REPLACE PACKAGE BODY REFS_PCK IS
  FUNCTION GET_REFS RETURN REF_CURSOR_T IS
    L_CURSOR REF_CURSOR_T;
  BEGIN
    OPEN L_CURSOR FOR
      SELECT * FROM USERS;
    RETURN L_CURSOR;
  END GET_REFS;
  procedure getFlowTrack(cur_Scan out REF_CURSOR_T,
                         cur_Send out REF_CURSOR_T) as
  begin
    --1
    open cur_Scan for
      select * from USERS;
    --2
    open cur_Send for
      select * from USERS;
  
  end getFlowTrack;

END REFS_PCK;


那么在xml中的调用,针对函数的是:
<procedure id="getRefs" parameterMap="output">{ ? = call refs_pck.get_refs }</procedure>


针对procedure的是
<procedure id="getRefsaa" parameterMap="outputaa">{ call refs_pck.getFlowTrack(?,?) }</procedure>
即一个有“?”,一个没有。
第二个注意的地方是:oracle存储过程中的参数类型number对应的java中的类型还是java.lang.Integer
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    SSI整合,有ibatis连接oracle的分页,ajax等技术

    "Ibatis连接Oracle的分页"是指利用Ibatis作为数据访问层,与Oracle数据库进行交互,并实现了分页查询功能。Oracle数据库支持多种分页方式,如ROWNUM伪列、ROWNUM配合子查询、ROW_NUMBER()窗口函数等。在这个项目中,...

    Ibatis 2.3.4 数据库无关分页

    在2.3.4这个版本中,Ibatis 提供了数据库无关的分页功能,这是一种在不依赖特定数据库语法的情况下实现分页查询的方法,有助于提高代码的可移植性和维护性。 数据库无关分页的核心思想是将分页参数(如当前页数和每...

    ssi_struts2_spring_ibatis 增删改查分页

    标题中的"ssi_struts2_spring_ibatis"指的是一个基于Java技术栈的Web应用程序开发框架组合,主要包括Struts2、Spring和iBatis。这三个组件是企业级Java应用中的常见选择,它们各自承担着不同的职责。 1. **Struts2*...

    SSI框架搭建增删改查以及分页

    在这个项目中,我们将会深入探讨如何利用这些技术实现数据库的增删改查(CRUD)操作以及分页功能,并将其部署到Oracle数据库。 首先,Struts2作为MVC(模型-视图-控制器)框架,负责处理HTTP请求,协调应用的业务...

    ibatis 例子

    针对Oracle数据库,`ibatis`支持存储过程调用,可以通过`&lt;procedure&gt;`标签来执行。此外,Oracle的游标、分页、序列等特性也可以方便地在`ibatis`中使用。 10. **最佳实践** 在实际应用中,应遵循良好的设计原则,...

    ibatis.net

    它们包含了SQL查询、存储过程的调用,并可以进行动态SQL构建。 2. Data Mapper:这是一个接口,开发者通过实现这个接口来定义数据访问逻辑。Ibatis.Net会自动处理SQL执行和结果集的映射。 3. DataSource:框架支持...

    jqgrid+struts2+ibatis增删改查

    在iBatis中,通过编写XML配置文件或注解来定义SQL查询和存储过程,使得数据操作更加便捷。在"ibatis+oracle"的场景下,开发者可以编写SQL语句来操作Oracle数据库,实现数据的增删改查。 最后,Oracle数据库是企业级...

    springboot-pagehelper-druid.rar springboot分页框架搭建 连接池搭建

    在服务层,我们可以这样调用分页查询: ```java @Service public class UserService { @Autowired private UserMapper userMapper; public Page&lt;User&gt; getUsers(int pageNum, int pageSize) { PageHelper....

    struts1.2+batis+spring2.0+oracle10g集成例子(增加了分页功能)

    这是一个基于老旧技术栈的Web应用集成示例,主要包括Struts1.2、iBatis(现为MyBatis)和Spring2.0框架,以及Oracle10g数据库。这个项目可能是一个初学者为了学习和实践这些技术而创建的,特别加入了分页功能,以...

    java必备知识点大全.pdf

    存储过程概述:存储过程是一组为了完成特定功能的SQL语句集,它存储在数据库中,可以通过指定名称和参数进行调用。 索引概述:索引用于加速数据库表中数据的检索。 必背的SQL语句:包括数据查询语句SELECT、数据...

    2021年最新java面试题--视频讲解(内部培训84个知识点超详细).rar

    Java面试题31.jdbc调用存储过程 Java面试题32.简单说一下你对jdbc的理解 Java面试题33.写一个jdbc的访问oracle的列子 Java面试题34.jdbc中preparedStatement比Statement的好处 Java面试题35.数据库连接池的作用 Java...

    大数据功能模块概要设计_V1.1.pdf

    - **数据安全**:包括数据加密管理,确保数据在传输和存储过程中的安全性。 - **数据交换**:通过数据交换整合平台实现不同系统间的数据交互。 - **元数据管理**:对数据的属性和描述进行管理和维护,方便数据的...

    自整理Java关于基础和框架的面试题

    ##### Oracle分页 - 使用`ROWNUM`关键字进行分页。 ##### Oracle的基本数据类型 - NUMBER、VARCHAR2、DATE等。 ##### id、rowid、rownum的区别 - **id**:通常作为主键标识记录。 - **rowid**:Oracle特有的唯一...

    文思面试题(java)

    解释为何选择Hibernate,以及调用存储过程的方法。 7. **DWR(Direct Web Remoting)**:DWR允许JavaScript与服务器端Java代码进行交互,实现Ajax功能。要能解释DWR的工作原理,并提供在项目中使用DWR的实例。 8. ...

    java面试知识

    ##### 存储过程概述 - **定义**:一组预编译的SQL语句。 - **用途**:提高代码复用性和性能,简化复杂业务逻辑。 ##### 索引概述 - **类型**:B-tree、位图、反转索引等。 - **作用**:加快数据检索速度。 #### ...

    Spring boot + mybatis + orcale实现步骤实例代码讲解

    我们将逐步介绍实现过程,包括配置、接口定义、服务层实现、DAO层操作以及XML映射文件的编写。 首先,Spring Boot是Spring框架的一个简化版本,它允许开发者快速启动并运行一个Java应用,无需进行大量的配置。...

    AppFramework_V1.0

    众所周知Oracle提供了ROWNUM实现数据数据库内分页功能,若要利用这一特性,就要在SQL模板里直接硬编码这些特殊语法,这必然导致大量的移植工作。 &lt;br&gt;第八、缺少代码生成和检查工具。程序里的变量名与Sql模板里的...

    springmybatis

    MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan ...

    AppFramework_V1.0_New

    众所周知Oracle提供了ROWNUM实现数据数据库内分页功能,若要利用这一特性,就要在SQL模板里直接硬编码这些特殊语法,这必然导致大量的移植工作。 &lt;br&gt;第八、缺少代码生成和检查工具。程序里的变量名与Sql模板里的...

Global site tag (gtag.js) - Google Analytics