上次写了关于ibatis处理sybase分页的问题,参见:
http://aimer311.iteye.com/blog/289411现在把它写完整,目前算是确定用该方案了。
其实要解决的问题就是在传入存储过程之前的sql构造过程。
分页存储过程如下:
if exists(select 1 from sysobjects where type = 'P' and name = 'asp_query_page') drop procedure asp_query_page
go
create procedure asp_query_page @sql varchar(2000),@start int, @pageSize int as
begin
declare @ipage int
declare @rcount int
declare @execsql varchar(2000)
declare @sql1 varchar(2000)
declare @t int,@p int,@n int,@l int
begin
set @sql1=@sql
set @n=0
set @l=0
set @t=charindex('select ',lower(@sql))
set @sql=substring(@sql,@t+7,char_length(@sql)-7)
set @n=@n+1
set @l=@l+7
while(@n!=0)
begin
set @t=charindex('select ',lower(@sql))
set @p=charindex('from ',lower(@sql))
if ((@t<@p) and (@t!=0))
begin
set @sql=substring(@sql,@t+7,char_length(@sql)-7)
set @n=@n+1
set @l=@l+6+@t
end
else
begin
set @sql=substring(@sql,@p+5,char_length(@sql)-5)
set @n=@n-1
set @l=@l+4+@p
end
end
set @execsql = substring(@sql1,1,@l-5)+' ,sybid=identity(12) into #temp '+substring(@sql1,@l-4,char_length(@sql1)-@l+5)
select @rcount=@start + @pageSize
set rowcount @rcount
set @execsql = @execsql || ' select * from #temp where sybid>' || convert(varchar,@start) || ' and sybid <= ' || convert(varchar,@rcount)
print @execsql
execute (@execsql)
set rowcount 0
end
end
ibatis的sqlMap配置如下:
<parameterMap class="java.util.HashMap" id="params">
<parameter javaType="String" jdbcType="CHAR" mode="IN" property="sql" />
<parameter javaType="int" jdbcType="numberic" mode="IN" property="start" />
<parameter javaType="int" jdbcType="numberic" mode="IN" property="pageSize" />
</parameterMap>
<procedure cacheModel="abatorgenerated_cache" id="selectByOrganId" parameterMap="params" resultMap="selectByOrganIdResult">
{call asp_query_page(?,?,?)}
</procedure>
程序中调用如下:
public List queryPageByProc(String sql, int start, int pageSize) {
QMap map = new QMap().add("sql", sql)
.add("start", new Integer(start))
.add("pageSize", new Integer(pageSize));
return getSqlMapClientTemplate().queryForList("PROCEDURE.asp_query_page", map);
}
这些都很好理解,接下来着重讲下如何在调用procedure之前讲sql完整的传入。我使用的方法其实很简单,多增加一个map文件用于存放所有需要分页的查询语句。文件的内容类似:
<?xml version="1.0" encoding="UTF-8"?>
<sqlMap namespace="TEST">
<select id="testWithParamMap">
select unique * from TEST where NAME LIKE '%#NAME#%'
[and EMAIL ='#EMAIL#'] and id=1 [and EMAIL= #EMAIL#]
</select>
<select id="testWithParamList">
select * from TEST a,ABC b
where
a.ID=?
[and a.EMAIL like '?']
and a.ID=?
[and a.email='?']
</select>
<select id="testWithParamStringArr">
select convert(varchar,b.id) id,b.groupid
from ABC b
WHERE A.ID=?
[AND A.EMAIL=?]
AND ID=?
[and a.name = ?]
</select>
</sqlMap>
然后解析这个文件,相当于预存了sql模板,当有不同的参数传入时,识别参数,返回最后的sql。目前的解析程序参数支持Map,List,String[].支持不定条件的查询等等。还没有遇到不支持的sql。
java代码的调用如下:
SqlStatement.getSql("BGM_ASSET_INFO.selectByOrganId", params)
整个过程只是增加了预编译sql语句的过程,其他调用与ibatis无异。
你可能会发现这个额外的Map配置文件有诸如:a.email='?'的语句,其实这也很好解决,可以参考sqlMap中多加一个Class="yourClass",然后根据你的VO的字段的类型具体判断是否需要加上'符号,多增加了一些类型解析过程而已。
分享到:
相关推荐
在描述中提到了一个博客链接,虽然具体内容没有给出,但通常博主会分享关于iBATIS分页实现的详细步骤、常见问题以及可能的解决方案。iBATIS的分页实现主要有两种方法: 1. **基于存储过程的分页**:在数据库层面...
三、Ibatis分页实现 1. SQL配置 在Ibatis的Mapper XML文件中,我们需要编写一个带有参数的SQL查询,这些参数通常包括当前页码和每页记录数。例如: ```xml SELECT * FROM your_table != null and pageSize != ...
4. **自定义分页实现**:如果不想依赖第三方插件,可以自定义一个拦截器实现分页。通过AOP(面向切面编程)或者MyBatis的Executor拦截器,对执行的SQL语句进行拦截,添加分页逻辑。 5. **性能优化**:在处理大数据...
标题"ibatis分页功能"指的就是如何在iBATIS框架中实现数据库查询的分页效果。分页不仅提高了用户体验,还能减少不必要的数据库负载。 描述中提到,分页功能是通过`page.tld`标签实现的。`tld`文件是JSP Tag Library...
本项目基于ibatis框架实现了分页功能,覆盖了从底层数据库操作到页面展示的完整流程,包括DAO层、Service层、Action层以及JSP页面的展示。 首先,我们来了解一下什么是ibatis。Ibatis是一个优秀的持久层框架,它...
以上就是使用Struts2、Spring和iBatis实现分页功能的基本流程。在实际开发中,你还需要考虑异常处理、国际化、性能优化等方面,确保应用的稳定性和用户体验。通过熟练掌握这三个框架的组合,你可以构建出强大且灵活...
本知识点将深入探讨如何在Struts2框架中结合iBatis实现基于Freemarker模板的分页功能。 首先,我们需要理解iBatis,它是一个轻量级的Java持久层框架,它提供了一个SQL映射框架,允许开发者将SQL语句与Java代码分离...
综上所述,这个实例展示了如何整合Struts2、Spring、iBatis和Oracle来构建一个完整的Web应用,实现了动态分页搜索和附件上传功能。这种架构具有良好的可扩展性和可维护性,适用于各种中大型企业级项目。开发者可以...
在Java Web开发中,Xwork和iBatis是两个非常重要的框架。Xwork是一个轻量级的MVC框架,主要用于处理Action...当然,实际项目中可能还需要考虑其他因素,比如查询优化、异常处理等,但基础的分页实现就是如此简单易懂。
在2.3.4这个版本中,Ibatis 提供了数据库无关的分页功能,这是一种在不依赖特定数据库语法的情况下实现分页查询的方法,有助于提高代码的可移植性和维护性。 数据库无关分页的核心思想是将分页参数(如当前页数和每...
在传统的iBatis框架中,分页通常采用逻辑分页的方式,即通过游标(ResultSet)来逐条处理数据,从而实现分页效果。这种方式虽然跨数据库兼容性好,但性能上不如数据库原生的物理分页高效。物理分页是直接在SQL语句中...
因此,我们需要通过修改Ibatis的源代码来实现物理分页,以提高查询效率。 物理分页是直接在数据库层面进行分页,避免了将所有数据加载到内存中的问题。下面我们将详细探讨如何在Ibatis中实现物理分页。 首先,了解...
Ibatis.NET提供了分页查询的实现,下面我们将深入探讨如何在Ibatis.NET中实现分页。 首先,理解分页的基本概念。分页通常涉及两个关键参数:当前页码(Page Number)和每页记录数(PageSize)。例如,如果当前页码...
Ibatis SQLServerDialect 2008 分页 可实现SQLServerDialect 分页 支持ibatis3
#### 分页实现步骤 1. **定义分页相关的XML映射文件**:如代码所示,创建一个独立的XML文件,包含用于分页的动态SQL语句。这包括`page_begin`和`page_end`两个部分,分别处理分页的起始和结束逻辑。 2. **编写动态...
总的来说,"spring+ibatis+oracle分页缓存源码"项目展示了如何在Spring管理的环境中,利用iBatis和Oracle数据库实现高效的数据分页和缓存策略。通过理解和实践这些技术,开发者可以构建出更加健壮、响应快速的Web...
在这个"struts2+spring+ibatis 实现分页"的项目中,我们将探讨如何将这三个框架整合起来,实现一个高效的分页功能。 首先,Struts2作为前端控制器,它处理来自客户端的请求,并调度到相应的Action进行处理。在分页...
同时,Ibatis也支持结果集的分页和延迟加载,进一步提升性能。 9. **插件扩展**: Ibatis允许开发者自定义插件,通过拦截器模式增强SqlSession或Executor的行为,例如日志记录、性能分析等。 这个自己编写的...
本教程将深入探讨如何使用Spring、iBatis和JSP这三个组件来集成实现数据库查询和分页功能。这三个技术结合,能够构建出高效、灵活且易于维护的数据访问层。 首先,Spring是一个开源的应用框架,提供依赖注入(DI)...
本资源"ibatis mybatis 分页 crud 完整代码"包含了这两个框架在CRUD(创建、读取、更新、删除)操作以及分页功能上的实现,下面将详细介绍相关知识点。 1. **Ibatis**: Ibatis 是一款轻量级的Java ORM(对象关系...