`

【SSI开发总结.3】基于ibatis的自定义分页

 
阅读更多

分页,在web应用程序中非常常见的功能,也是最基本的功能,IBATIS本身 提供了非常傻瓜式的分页组件,但是由于其本身的原理特点,使得它是以牺牲分页效率为代价的,分层思想的确很好,但是,我们也要意识到,多一层就代表好多花 点时间执行程序流程,所以,我们又会总是尽可能的聚合功能,其实,这是一个博弈,不管怎么样,先来看下我的自定义分页吧!

我采用的方式是,在IBATIS映射中用嵌套SQL语句方式进行分页,要进行分页,我们只需要知道页面尺寸以及总记录数,然后通过视图传递的当前页 号,计算出当前页之前的记录总数,然后从大于这个之前记录总数的下一条记录开始,显示和指定页面尺寸数量相同的记录,就得到了当前页的记录

首先,为每一个POJO实体类定义一个父类PageModel,所有需要分页操作的实体都必须继承这个类,该类定义了分页所需要的相关信息

1.PageModel类

/****** PageModel.java ******/

package model;

public class PageModel {
private int page=1;//当前页,初始为第一页
private int pagesize;//页面尺寸
private int pagecount;//总页面数量
private int recordCount;//总记录数
private int beforeCount;//页尺寸*(页数-1),当前页之前的记录总数

public int getBeforeCount() {
return (page-1)*pagesize;
}
//视图中读取当前页号
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
//视图中读取页面尺寸
public int getPagesize() {
return pagesize;
}
public void setPagesize(int pagesize) {
this.pagesize = pagesize;
}
//视图中读取页面数量
public int getPagecount() {
if(pagesize!=0)
return (recordCount+pagesize-1)/pagesize;
else
return 0;
}
//视图中读取总记录数
public int getRecordCount() {
return recordCount;
}
public void setRecordCount(int recordCount) {
this.recordCount = recordCount;
}
}

2.定义POJO(继承PageModel)

package model;

public class Infor extends PageModel{

......................................................

}

3.配置IBATIS映射

................................................................


<select id="recordCount" resultClass="java.lang.Integer">
select count(*) AS [all] from infor
</select>
<select id="firstPage" resultClass="Infor" parameterClass="Infor">
select top $pagesize$ * from infor order by id desc
</select>
<select id="otherPage" resultClass="Infor" parameterClass="Infor">
<![CDATA[
select top $pagesize$ * from infor
where
(id<(select MIN(id) from (select top $beforeCount$ id from infor order by id desc) AS T))
order by id desc

]]>
</select>

.......................................

以这种SQL语句方式分页的话,由于第一页之前的记录总数显然为0,如果只统一采用otherPage这条SQL语句分页,根据PageModel 类的定义,$beforeCount$会出现0的情况,"top 0"在SQL中是不允许的,所以我们必须把第一页的查询和其他页的查询分开写,同时,我们还必须定义一个查询总记录数的SQL语句。

显然,要实现分页,我们必须传递一个POJO对象,该对象保存了定位到当前页所需要的所有SQL语句参数

4.编写DAO类

package dao;

import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
import java.util.*;
import model.Infor;

public class InforDao extends SqlMapClientDaoSupport {
//读取所有信息数量,分页开始
public int recordCount(){
return Integer.parseInt(getSqlMapClientTemplate().queryForObject("infor.recordCount").toString());
}
public List<Infor> firstPage(Infor infor){
return getSqlMapClientTemplate().queryForList("infor.firstPage",infor);
}
public List<Infor> otherPage(Infor infor){
return getSqlMapClientTemplate().queryForList("infor.otherPage",infor);
}
}

5.编写BO类

package bo;

import dao.InforDao;
import model.Infor;

import java.util.*;

public class InforBo {
private InforDao dao;

public void setDao(InforDao dao) {//spring依赖注入
this.dao = dao;
}
//读取所有信息列表
public List<Infor> getInforList(Infor infor,int pagesize,int page){
infor.setRecordCount(dao.recordCount());
infor.setPagesize(pagesize);
infor.setPage(page);
if(infor.getPage()==1)
return dao.firstPage(infor);
else
return dao.otherPage(infor);
}

}

本类中,getInforList方法中,除了infor和page是必须的,pagesize为可选,普遍的我们希望页面尺寸可以在控制层自由选择,infor,page分别做为Action类的成员传递进来,为什么要这样做,看了后面action类的定义大家就明白了

6.编写ACTION类

package action;

import java.util.List;
import com.opensymphony.xwork2.ActionSupport;
import bo.InforBo;
import model.Infor;

public class InforListAction extends ActionSupport {
private InforBo inforBo;
private List<Infor> infors;
private Infor infor;
private int page=1;

public int getPage() {
return page;
}

public void setPage(int page) {
this.page = page;
}

public void setInforBo(InforBo inforBo) {
this.inforBo = inforBo;
}
public List<Infor> getInfors() {
return infors;
}
public Infor getInfor() {
return infor;
}
public String execute(){
infor=new Infor();
infors=inforBo.getInforList(infor, 20, page);
return SUCCESS;
}
}

至于分页标签,如“上一页”,“下一页”, 通过比如JSP标签对POJO对象的简单判断就能实现,以下是我实现的一个简单的分页标签

<s:if test="infor.page>1">

<a href="?page=1">第一页</a>

<a href="?page=<s:property value='page-1'/>">下一页</a>

</s:if>


<s:if test="infor.page<infor.pagecount">

<a href="?page=<s:property value='page+1'/>">下一页</a>

<a href="?page=<s:property value='infor.pagecount'/>">最后一页</a>

</s:if>

分享到:
评论

相关推荐

    ssi.rar_ibatis_ibatis struts2_java ssi_myeclipse ssi_struts2

    标题中的"ssi.rar_ibatis_ibatis_struts2_java ssi_myeclipse ssi_struts2"揭示了这个压缩包文件包含的内容,主要涉及到SSI(Server Side Include)技术、MyEclipse开发环境、以及三大框架——Struts2、Spring和...

    hibernate3.jar、ibatis-dao-2.jar、spring.jar、struts.jar、log4j-1.2.9.jar

    这些jar包是Java开发中非常重要的库文件,主要用于构建基于SSH(Spring、Struts、Hibernate)和SSI(Spring、Struts、iBatis)框架的Web应用程序。SSH和SSI是两种广泛使用的Java企业级开发框架组合,它们简化了开发...

    图文搭建SSI(struts+spring+ibatis)框架

    本文将详细介绍如何使用MyEclipse8.5进行SSI(Struts2、Spring2.5、iBatis)框架的整合搭建。首先,我们需要一个新的Web项目作为基础。 1. **创建Web Project** 在MyEclipse8.5中,选择`File` -&gt; `New` -&gt; `...

    DWC_ssi_user.pdf

    根据提供的文档信息,我们可以得出这份文档是关于DesignWare Synchronous Serial Interface (SSI) 的用户指南。接下来,我们将从几个方面来解析与理解这份文档中的关键知识点。 ### 一、产品概述 #### 1.1 ...

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

    在SSI框架中,我们可以利用Ibatis的分页插件或者自定义SQL来实现。例如,通过在查询SQL中添加LIMIT和OFFSET子句(在Oracle中可能需要使用ROWNUM),配合前端传递的页码和每页条数,就能实现动态分页。 项目中的...

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

    总的来说,这个项目是一个初学者的实践,展示了如何将传统的SSI技术与现代的Ibatis和AJAX结合,实现了一个具备分页查询功能的Web应用。通过这个项目,开发者可以学习到如何处理服务器端的动态内容、如何利用ORM框架...

    struts+spring+ibatis(SSI)的最简分页及标签

    总结起来,"struts+spring+ibatis(SSI)的最简分页及标签"是一个关于如何在Java Web开发中结合Struts的MVC架构、Spring的依赖管理和iBatis的数据访问来实现分页功能以及创建自定义标签的实践。这个过程涉及到Struts的...

    fsl_ssi_dbg.rar_SOC

    总结来说,"fsl_ssi_dbg.rar_SOC"是一个关于Freescale SoC上ALSA子系统中SSI DAI调试的资源,包含的"Fsl_ssi_dbg.c"源代码文件是理解和改进SoC音频处理性能的关键。这涉及到音频硬件驱动编程、DAI操作、调试技术和...

    Ibatis 2.3.4 数据库无关分页

    总结一下,Ibatis 2.3.4的数据库无关分页特性提供了一种跨数据库的分页解决方案,通过动态SQL和参数传递,使得分页逻辑独立于具体的数据库方言。这种方式提高了代码的可复用性和可维护性,也降低了系统迁移的成本。...

    SSI_Library.rar_SSI_SSI Verilog_logic_ssi verilog_verilog ssi

    SSI,全称是Small-Scale Integration,是一种早期的集成电路(IC)集成度分类方式,它主要包含基础的逻辑门电路,如与非门、或非门、非门等。在现代数字系统设计中,SSI仍然作为理解数字逻辑设计的基础。Verilog是一...

    SSI-ABZ.rar_FPGA ABZ_FPGA SSI_SSI 转 ABZ信号FPAG程序_abz_ssi fpga

    标题中的"SSI-ABZ.rar_FPGA ABZ_FPGA SSI_SSI 转 ABZ信号FPAG程序_abz_ssi fpga" 提到了几个关键术语:SSI、ABZ、FPGA以及转换程序。这些术语涉及到电子工程领域,特别是数字系统设计中的一个重要部分——现场可编程...

    ibatis类型

    iBATIS是Java开发中的一个流行数据库访问框架,它允许开发者将SQL语句直接集成到XML配置文件中,实现了SQL与Java代码的分离,提高了可维护性。在与SSI(可能是Spring、Struts、iBATIS的组合)整合时,iBATIS能发挥更...

    eclipse开发的ssi整合struts2+ibatis2.x+spring2.5

    在IT行业中,集成Struts2、iBatis2.x和Spring2.5是常见的企业级应用开发模式,这种架构被称为“SSH”(Struts、Spring、Hibernate)的变种,因为iBatis替代了传统的Hibernate作为持久层框架。Eclipse作为Java开发的...

    ssi_struts2_spring_ibatis 增删改查分页

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

    PyPI 官网下载 | galileo-ssi-1.2.tar.gz

    4. **Python库**:作为Python库,"galileo-ssi"提供了一组Python编程接口(APIs),让开发人员能够轻松地在他们的Python项目中利用其功能,例如处理分布式系统的协调或云原生应用的构建。 在解压"galileo-ssi-1.2....

    omap_ssi_port.rar_SSI

    这个驱动程序允许操作系统与硬件之间的通信,使开发人员能够利用OMAP SoC(System on Chip)的SSI功能。 首先,我们需要理解OMAP SSI的基本概念。SSI是一种同步串行接口,类似于SPI(Serial Peripheral Interface)...

    SSI Spring+struts1+ibatis案例

    在IT行业中,SSI(Spring、Struts1、iBatis)是经典的Java Web开发框架组合,它们各自负责应用的不同层面,协同工作以构建高效、可维护的系统。在这个"Spring+struts1+ibatis案例"中,我们将深入探讨这三个框架如何...

    spring.struts,ibatis集成包

    标题中的"spring.struts,ibatis集成包"是指将Spring、Struts和iBATIS这三种技术框架整合在一起的软件包。这种集成旨在提供一个高效、灵活且可扩展的Web应用程序开发环境。Spring作为核心框架,负责管理应用的业务...

    SSI(struts2+ibatis+spring)

    SSI,即Struts2、Spring和iBatis的整合,是一种常见的Java Web开发框架组合,用于构建高效、灵活的企业级应用程序。在这个小例子中,开发者已经完成了一个基本的CRUD(创建、读取、更新、删除)应用,并包含了完整的...

    ssi_rx.rar_SSI_SSI VHDL_VHDL SSI_uart_vhdl

    标题中的"SSI_rx.rar_SSI_SSI VHDL_VHDL SSI_uart_vhdl"表明这是一个关于SSI(Synchronous Serial Interface)串行同步接口接收部分的VHDL设计项目,使用了Xilinx ISE作为开发环境,并且包含了UART(Universal ...

Global site tag (gtag.js) - Google Analytics