[size=medium] 这两天一直在想怎么在现有系统上比较好的解决这个问题。能够跟现在的系统架构比较好的结合。原来的分页方法用的是ibatis自带的游标分页方法。
我们的调用的方法:
public List selectById(AmtbAnniversary model,int startRow,int pageSize) {
return (List) getSqlMapClientTemplate().queryForList("AMTB_ANNIVERSARY.selectById",model,startRow,pageSize);
}
这有速度跟内存的问题,当前的测试环境也就1w多条数据,还不是特别明显,但已经感觉出来了。所以准备好好解决这个问题。
根据以前的分页方法,首先想到的是针对不同的数据库在sql语句上进行分页,当前的数据库有h2和sybase。h2支持limit进行分页查询,如:
select * from cmtb_customer_identityinfo limit 0,10;
,恩,很好解决。sqlmap中的配置如下:
<select cacheModel="cache" id="selectByPage" parameterClass="AmtbAnniversary" resultClass="AmtbAnniversary">
select * from AMTB_ANNIVERSARY limit #startRec#,#lastRec#
</select>
我的的sqlmap参数一般都是用parameterClass,这是考虑到批量生产的问题,基本上用abator自动生成以后就不需要另外修改了,也不需要额外写parameterMap了。基于这样的需求,我只需要在model生成的时候extends一个baseModel就可以,其中baseModel包括startRec,lastRec等。这样的方法对于一般的数据库都应该是可以很好的解决了。
但是sybase不支持limit,也没有rownum.怎么解决呢,再google了下,发现12.5.3版本以上的已经支持top查询了。兴奋了一把,由于我们现在用的sybase用的是旧版本,不知道具体版本,但反正不能支持top,跟老大咨询了下,内网的sybase的版本比较搞,遂一通设置后,切换到内网测试。先是写了个简单的语句,果然支持,愈来愈兴奋了。来个标准的分页sql
SELECT TOP 10 *
FROM TestTable
WHERE (ID >
(SELECT MAX(id)
FROM (SELECT TOP 20 id
FROM TestTable
ORDER BY id) AS T))
ORDER BY ID
返回结果0,郁闷,检查了半天,没错啊,怎么会是0。再google,原来sybase对top的支持还不够好,不支持子查询的top。语句也不报错,真够狠的。这条路看来行不通了。
发现对于sybase的分页一般都是用存储过程,我也搞一搞,在网上看到了这条比较通用的sybase分页存储过程:
drop procedure getPageWiseData go
create procedure getPageWiseData
(
@sqlStr varchar(8000),
@start int,
@limit int
)
as
DECLARE @dt varchar(10) --生成临时表的随机数
BEGIN
--# variable to hold the first row number of the page.
SELECT @dt= substring(convert(varchar, rand()), 3, 10) --一个字符型的随机数
SELECT @sqlStr = stuff(@sqlStr, 1, 7, 'select rownum=identity(12), ')
SELECT @sqlStr = stuff(@sqlStr, charindex(' FROM ', upper(@sqlStr)), 6 ,' into tempdb..Lining' + @dt + ' from ')
execute (@sqlStr)
--# select the data with the calculated range for first and last row on page.
select @sqlStr = 'select * from tempdb..Lining' + @dt + ' where rownum >= '+convert(varchar, @start)+' and rownum <= '+convert(varchar, (@start+@limit))
execute (@sqlStr)
--删除临时表
SELECT @sqlStr = 'DROP TABLE tempdb..Lining'+@dt
EXECUTE (@sqlStr)
END
我稍微改了下,比原来的语句快了点。
这虽然不错,但是怎么跟我现在的系统结合呢,看看我调用的语句
<parameterMap class="map" id="params">
<parameter property="sqlStr" javaType="String" jdbcType="VARCHAR" mode="IN"/>
<parameter property="start" javaType="java.lang.Integer" jdbcType="int" mode="IN"/>
<parameter property="limit" javaType="java.lang.Integer" jdbcType="int" mode="IN"/>
</parameterMap>
<procedure id="FIRST" parameterMap="params" resultClass="CmtbCustomerIdentityinfo">
{call getPageWiseData(?,?,?)}
</procedure>
public List getByObj(CmtbCustomerIdentityinfo example,int startRow,int pageSize) {
Map params = new HashMap();
String s = "select convert(varchar,a.CUSTOMER_IDENTIFYID) CUSTOMER_IDENTIFYID,a.KHH,a.NAME,a.IDENTIFY_NO,a.CUST_STATE,b.USER_ID from CMTB_CUSTOMER_IDENTITYINFO a left join CMTB_CUSTOMER_IDENBELONG b on a.CUSTOMER_IDENTIFYID=b.CUSTOMER_IDENTIFYID where a.STATUS='1' and a.CUSTOMER_TYPE='0'";
params.put("sqlStr", s);
params.put("start", startRow);
params.put("limit", pageSize);
List list = (List) getSqlMapClientTemplate().queryForList("CMTB_CUSTOMER_IDENTITYINFO.FIRST", params);
return list;
}
看看上面的调用的代码,传入存储过程必须是要一个确定的,已经可以执行的sql,那么如果这个sql是包含参数的呢?我是不是要在queryForList之前,先构造这条sql语句呢?但是这部分是ibatis内部执行的,除非你放弃ibatis的执行过程。我目前对ibatis的了解还不深,不知道谁有比较好的方法。我
理想的状况是,因为这个sql的参数也是包含在model中的,那么调用的程序应该是像这样:
public List getCustomerIdentityinfoByObj(CmtbCustomerIdentityinfo example,int startRow,int pageSize) {
example.setStart(startRow);
example.setLimit(pageSize);
List list = (List) getSqlMapClientTemplate().queryForList("CMTB_CUSTOMER_IDENTITYINFO.FIRST", example);
return list;
}
这就看sqlmap是否能否很好的配置了,目前我是还不知道。
补充一点:看下那条sql语句中的convert(varchar,a.CUSTOMER_IDENTIFYID),之所以这样写是CUSTOMER_IDENTIFYID在原来的表已经是个主键了,所以在放到临时表的时候需要将起转换为一般的字段。
解决方案:
参见http://aimer311.iteye.com/blog/460127
[/size]
分享到:
相关推荐
本文将深入探讨Ibatis实现分页的相关知识点,并基于提供的标签“源码”和“工具”,分享如何在实际项目中运用Ibatis进行分页处理。 首先,了解Ibatis的基本概念。Ibatis是由Apache基金会维护的一个开源项目,它是一...
Ibatis SQLServerDialect 2008 分页 可实现SQLServerDialect 分页 支持ibatis3
Spring、iBatis和Oracle的结合提供了强大的数据处理能力。本文将深入探讨这些技术如何协同工作,实现高效的分页缓存策略。 首先,Spring是一个开源的Java框架,它为开发人员提供了依赖注入(DI)和面向切面编程...
ibatis_likehbm高效分页组件ibatis_likehbm高效分页组件ibatis_likehbm高效分页组件ibatis_likehbm高效分页组件ibatis_likehbm高效分页组件ibatis_likehbm高效分页组件 ibatis_likehbm高效分页组件 ibatis_likehbm...
为了简化代码,我们还可以自定义一个Ibatis分页插件,自动处理分页逻辑。例如,使用PageHelper插件,只需在配置中启用并设置相关参数,就可以自动实现分页。 四、总结 Ibatis实现分页技术主要依赖于SQL语句中的分页...
Ibatis会自动处理分页逻辑,返回指定页码的数据。 5. **处理结果**:在服务层或控制层,对返回的结果进行处理,如转换为对应的Java对象列表,或填充到视图模型中。 示例中的"ssi"可能是示例项目的名字,可能包含了...
在描述中提到了一个博客链接,虽然具体内容没有给出,但通常博主会分享关于iBATIS分页实现的详细步骤、常见问题以及可能的解决方案。iBATIS的分页实现主要有两种方法: 1. **基于存储过程的分页**:在数据库层面...
通过在后台实现SQL的分页查询,Struts2和Spring配合处理请求参数,可以实现在前端展示分页结果。这不仅减少了网络传输的数据量,也使得用户能够更方便地浏览和查找所需信息。 6. **上传附件**:在很多应用场景中,...
在IT行业中,分页是一种常见的数据处理技术,特别是在Web应用中,用于提高用户体验,避免一次性加载过多数据导致页面响应变慢。本项目基于ibatis框架实现了分页功能,覆盖了从底层数据库操作到页面展示的完整流程,...
ibatis 物理分页jar ,与官方ibatis不冲突,可直接使用。
在处理大量数据时,分页查询是必不可少的功能,可以有效地减少数据库负载并提高用户体验。Ibatis.NET提供了分页查询的实现,下面我们将深入探讨如何在Ibatis.NET中实现分页。 首先,理解分页的基本概念。分页通常...
5. Java服务层代码(如`UserService.java`):处理业务逻辑,包括调用iBATIS的SQL映射进行分页查询。 在iBATIS中实现分页通常有以下步骤: 1. **配置PageHelper插件**:如果你使用PageHelper,需要在项目中引入...
综上所述,"简单公文管理 struts+spring+ibatis +ajax 分页"是一个集成了多种技术的Web应用,它利用Struts进行页面控制,Spring管理业务逻辑,iBatis处理数据访问,Ajax提升用户体验,共同构建了一个高效、易用的...
公司的大部分项目都开始使用IBatis作为O/R Mapping了,但是在使用的过程中也发现了很多不方便和存在争议的地方,其中一个不方便的地方就是分页,目前的处理方式都是在sqlMap中写针对特定数据库的物理分页Sql语句,对于...
在分页场景下,Struts2会接收用户传递的分页参数(如当前页数、每页条数等),并调用对应的业务逻辑进行处理。 Spring框架则作为一个全面的容器,管理着应用中的对象及其依赖关系。在本例中,Spring将用来注入...
本知识点将深入探讨如何在Struts2框架中结合iBatis实现基于Freemarker模板的分页功能。 首先,我们需要理解iBatis,它是一个轻量级的Java持久层框架,它提供了一个SQL映射框架,允许开发者将SQL语句与Java代码分离...
"Ibatis连接Oracle的分页"是指利用Ibatis作为数据访问层,与Oracle数据库进行交互,并实现了分页查询功能。Oracle数据库支持多种分页方式,如ROWNUM伪列、ROWNUM配合子查询、ROW_NUMBER()窗口函数等。在这个项目中,...
Ibatis,作为一款轻量级的Java持久层框架,虽然功能强大,但在默认情况下,其分页方式是逻辑分页,即先查询所有数据,然后在应用程序层面进行分页处理,这种方式对于大数据量的查询来说,无疑会消耗大量的内存和CPU...
在Spring与iBATIS结合的分页实现中,通常会使用Spring的DataSourceTransactionManager来处理事务,通过SqlSessionTemplate或SqlSessionFactoryBean进行数据库操作。分页功能主要通过以下步骤实现: 1. **配置**:在...
本资源"ibatis mybatis 分页 crud 完整代码"包含了这两个框架在CRUD(创建、读取、更新、删除)操作以及分页功能上的实现,下面将详细介绍相关知识点。 1. **Ibatis**: Ibatis 是一款轻量级的Java ORM(对象关系...