上次写了关于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源码实现sql分页。由于ibatis默认分页是全部查出,然后再从中取出相应的数据实现分页,效率底。所以需要扩展
struts2+spring+ibatis+oracle+分页搜索+上传附件实例!完整版!
一直以来ibatis的分页都是通过滚动ResultSet实现的,应该算是逻辑分页吧。逻辑分页虽然能很干净地独立于特定数据库,但效率在多数情况下不及特定数据库支持的物理分页,而hibernate的分页则是直接组装sql,充分利用...
博文链接:https://qdj21.iteye.com/blog/233137
Ibatis SQLServerDialect 2008 分页 可实现SQLServerDialect 分页 支持ibatis3
struts2+spring+ibatis 实现分页
用Ibatis实现的分页技术,简单,方便。
小弟新手,第一次发自己的项目,整合了ssi,实现了ibatis连接oracle的分页,这个分页没有网上说的那么复杂,只是拼了sql分页语句就可以了
spring与ibaits的集成,jsp进行分页查询。
一直以来ibatis的分页都是通过滚动ResultSet实现的,应该算是逻辑分页吧。逻辑分页虽然能很干净地独立于特定数据库,但效率 在多数情况下不及特定数据库支持的物理分页,而hibernate的分页则是直接组装sql,充分...
struts2 Spring ibatis 整合实现增删改查以及分页 含有sql 到oracle数据库里执行就好了很适合新手 那个功能都实现了 而且代码很清晰
rt简例 20202020202020202020
Spring MVC+ibatis+Oracle资源整合,实现简单的增删改查
Struts2+Spring+ibatis实现怎删改查以及分页的功能。本文档将项目的配置文件、源代码等全部实现。方便初学者学习ssi三大框架的整合,以及一个相对复杂的难题——与ssi框架结合的分页。该文档十分详细,按照代码结构...
spring+hibernate+struts2+ibatis框架,同时实现了分页的方法,可以直接做为项目框架用。
spring ibatis 已经实现物理分页,eclipse 工程 直接导入即可,默认spring 引用注解,里面含对应bean配置(已经注释了),典型的spring MVC+ibatis ,内置junit 测试用例
使用Spring集成struts2、ibatis、poi实现的增删改查功能,包括采用jquery实现的无刷新查询机分页、dwr实现的两级联动、以及采用poi动态将数据库数据导出成excel,本demo采用mysql数据库,附有建表sql,项目导入...
Struts2+Spring+Ibatis+Ext,ext光是实现了登陆! 业务主要是简单的实现了两张表的增删改查!还有对查询的结果了Ibatis的分页,据库是Sql Server 2000!