`
aimer311
  • 浏览: 96429 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

ibatis分页实现

    博客分类:
  • java
阅读更多
上次写了关于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的字段的类型具体判断是否需要加上'符号,多增加了一些类型解析过程而已。
2
1
分享到:
评论

相关推荐

    ibatis分页

    在描述中提到了一个博客链接,虽然具体内容没有给出,但通常博主会分享关于iBATIS分页实现的详细步骤、常见问题以及可能的解决方案。iBATIS的分页实现主要有两种方法: 1. **基于存储过程的分页**:在数据库层面...

    ibatis实现分页技术

    三、Ibatis分页实现 1. SQL配置 在Ibatis的Mapper XML文件中,我们需要编写一个带有参数的SQL查询,这些参数通常包括当前页码和每页记录数。例如: ```xml SELECT * FROM your_table != null and pageSize != ...

    ibatis 之分页

    4. **自定义分页实现**:如果不想依赖第三方插件,可以自定义一个拦截器实现分页。通过AOP(面向切面编程)或者MyBatis的Executor拦截器,对执行的SQL语句进行拦截,添加分页逻辑。 5. **性能优化**:在处理大数据...

    ibatis分页功能

    标题"ibatis分页功能"指的就是如何在iBATIS框架中实现数据库查询的分页效果。分页不仅提高了用户体验,还能减少不必要的数据库负载。 描述中提到,分页功能是通过`page.tld`标签实现的。`tld`文件是JSP Tag Library...

    基于ibatis的分页

    本项目基于ibatis框架实现了分页功能,覆盖了从底层数据库操作到页面展示的完整流程,包括DAO层、Service层、Action层以及JSP页面的展示。 首先,我们来了解一下什么是ibatis。Ibatis是一个优秀的持久层框架,它...

    例1:struts2+spring+ibatis 实现分页

    以上就是使用Struts2、Spring和iBatis实现分页功能的基本流程。在实际开发中,你还需要考虑异常处理、国际化、性能优化等方面,确保应用的稳定性和用户体验。通过熟练掌握这三个框架的组合,你可以构建出强大且灵活...

    iBatis分页(基于Struts2和Freemarker)

    本知识点将深入探讨如何在Struts2框架中结合iBatis实现基于Freemarker模板的分页功能。 首先,我们需要理解iBatis,它是一个轻量级的Java持久层框架,它提供了一个SQL映射框架,允许开发者将SQL语句与Java代码分离...

    struts2+spring+ibatis+oracle+分页搜索+上传附件实例

    综上所述,这个实例展示了如何整合Struts2、Spring、iBatis和Oracle来构建一个完整的Web应用,实现了动态分页搜索和附件上传功能。这种架构具有良好的可扩展性和可维护性,适用于各种中大型企业级项目。开发者可以...

    Xwork+iBatis分页

    在Java Web开发中,Xwork和iBatis是两个非常重要的框架。Xwork是一个轻量级的MVC框架,主要用于处理Action...当然,实际项目中可能还需要考虑其他因素,比如查询优化、异常处理等,但基础的分页实现就是如此简单易懂。

    Ibatis 2.3.4 数据库无关分页

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

    对IBatis分页的改进,使ibatis支持hibernate式的物理分页.doc

    在传统的iBatis框架中,分页通常采用逻辑分页的方式,即通过游标(ResultSet)来逐条处理数据,从而实现分页效果。这种方式虽然跨数据库兼容性好,但性能上不如数据库原生的物理分页高效。物理分页是直接在SQL语句中...

    修改ibatis源代码实现物理分页

    因此,我们需要通过修改Ibatis的源代码来实现物理分页,以提高查询效率。 物理分页是直接在数据库层面进行分页,避免了将所有数据加载到内存中的问题。下面我们将详细探讨如何在Ibatis中实现物理分页。 首先,了解...

    Ibatis.net 分页

    Ibatis.NET提供了分页查询的实现,下面我们将深入探讨如何在Ibatis.NET中实现分页。 首先,理解分页的基本概念。分页通常涉及两个关键参数:当前页码(Page Number)和每页记录数(PageSize)。例如,如果当前页码...

    Ibatis SQLServerDialect 2008 分页

    Ibatis SQLServerDialect 2008 分页 可实现SQLServerDialect 分页 支持ibatis3

    ibatis分页技术

    #### 分页实现步骤 1. **定义分页相关的XML映射文件**:如代码所示,创建一个独立的XML文件,包含用于分页的动态SQL语句。这包括`page_begin`和`page_end`两个部分,分别处理分页的起始和结束逻辑。 2. **编写动态...

    spring+ibatis+oracle分页缓存源码

    总的来说,"spring+ibatis+oracle分页缓存源码"项目展示了如何在Spring管理的环境中,利用iBatis和Oracle数据库实现高效的数据分页和缓存策略。通过理解和实践这些技术,开发者可以构建出更加健壮、响应快速的Web...

    struts2+spring+ibatis 实现分页.rar

    在这个"struts2+spring+ibatis 实现分页"的项目中,我们将探讨如何将这三个框架整合起来,实现一个高效的分页功能。 首先,Struts2作为前端控制器,它处理来自客户端的请求,并调度到相应的Action进行处理。在分页...

    ibatis 框架原理实现

    同时,Ibatis也支持结果集的分页和延迟加载,进一步提升性能。 9. **插件扩展**: Ibatis允许开发者自定义插件,通过拦截器模式增强SqlSession或Executor的行为,例如日志记录、性能分析等。 这个自己编写的...

    spring+ibatis+jsp集成实现数据库查询分页

    本教程将深入探讨如何使用Spring、iBatis和JSP这三个组件来集成实现数据库查询和分页功能。这三个技术结合,能够构建出高效、灵活且易于维护的数据访问层。 首先,Spring是一个开源的应用框架,提供依赖注入(DI)...

    ibatis mybatis 分页 crud 完整代码

    本资源"ibatis mybatis 分页 crud 完整代码"包含了这两个框架在CRUD(创建、读取、更新、删除)操作以及分页功能上的实现,下面将详细介绍相关知识点。 1. **Ibatis**: Ibatis 是一款轻量级的Java ORM(对象关系...

Global site tag (gtag.js) - Google Analytics