`
领悟人生
  • 浏览: 84881 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Ibatis动态sql实现MySql SqlServer Oracle分页

阅读更多
最近在看iBatis时,想做用动态Sql做个分布。因为在做项目时用iBator工具生成没有分页的功能,只有一些我们常用的功能。所以要对生成后的代码做修改。我在Java高手真经的一书中看到有做了MySql SqlServer Oracle的分页。实现如下:
MySql-->
首先说说MySql的分页语句
   select * from user where...order by... limit 10,25   

根据以上的语句我们可以对ibator生成后的代码进行修改。
第一修改User_sqlMap.xml
修改前
<select id="ibatorgenerated_selectByExample"         resultMap="ibatorgenerated_BaseResultMap"
	parameterClass="com.demo.ibatis.beans.UserExample">
	select ID, LOGIN_NAME, PASSWORD
	from user
	<isParameterPresent>
		<include refid="user.ibatorgenerated_Example_Where_Clause" />
		       <isNotNull property="orderByClause">
				order by $orderByClause$
    	               </isNotNull>
		</isParameterPresent>
</select>

修改后
<select id="ibatorgenerated_selectByExample" resultMap="ibatorgenerated_BaseResultMap"
		parameterClass="com.demo.ibatis.beans.UserExample">
		select ID, LOGIN_NAME, PASSWORD
		from user
	<isParameterPresent>
		<include refid="user.ibatorgenerated_Example_Where_Clause" />
			<isNotNull property="orderByClause">
				order by $orderByClause$
    	                </isNotNull>
			[b]<isNotNull property="limitClauseStart">
				limit
				$limitClauseStart$,$limitClauseCount$
			</isNotNull>[/b]
	</isParameterPresent>
</select>

重要的是黑色的字体是添加到原来的xml中的。接下来修改UserExample.java
在该类中添加两个字段和相应的getter/setter方法
   protected String limitClauseStart;//起始参数
   protected String limitClauseCount;//数量参数

接下来就可以通过Dao调用selectByExample()方法测试,好的以上就是MySql的分页。SqlServer的分页比较难了,因为 SqlServer中没有limit的关键字。
看看SqlServer的分页语句,那当然 SqlServer人分布方法有很多种。这里我采用其中的一种。
语句如下:
  SELECT TOP 页大小 *
  FROM TestTable
  WHERE (ID >=
          (select max(id) from (SELECT TOP 页大小*页数 id
         FROM 表
         ORDER BY id) as t))
ORDER BY ID

接下来和上面的MySql一样也进行修改
修改xml
<select id="ibatorgenerated_selectByExample" resultMap="ibatorgenerated_BaseResultMap"
		parameterClass="com.demo.ibatis.beans.UserExample">
		[b] <isNotNull property="limitClauseStart">
			SELETE TOP $limitClauseCount$ * FROM user where (ID NOT IN 
                       (SELECT TOP $limitClauseStart$ ID 
    	          </isNotNull>[/b]
                   <isNull property="limitClauseStart">
			SELETE * 
		  </isNull>
                    FROM user 
		from user
	<isParameterPresent>
		<include refid="user.ibatorgenerated_Example_Where_Clause" />
			<isNotNull property="orderByClause">
				order by $orderByClause$
                               [b]  <isNotNull property="limitClauseStart">
				     ))order by $orderByClause$
			        </isNotNull>[/b]
    	                </isNotNull>
	</isParameterPresent>
</select>

接下来是ORacle的,和上面都是差不多的这里不多说。
语法:
select* from(select rownum tid,user.* FROM (select * from user where id>1 order by ID desc)user where where rownum<35) where tid>10;

修改Xml,
<select id="ibatorgenerated_selectByExample"     resultMap="ibatorgenerated_BaseResultMap"
		parameterClass="com.demo.ibatis.beans.UserExample">
		[b] <isNotNull property="limitClauseStart">
			select* from(select rownum tid,user.* FROM (
    	          </isNotNull>[/b]
                   select * from user
	<isParameterPresent>
		<include refid="user.ibatorgenerated_Example_Where_Clause" />
			<isNotNull property="orderByClause">
				order by $orderByClause$              
    	                </isNotNull>
                        [b]  <isNotNull property="limitClauseStart">
			       <![[CDATA )user where where rownum<$limitClauseCount$+$limitClauseStart$+1) where tid>$limitClauseStart$;]]>
		         </isNotNull>[/b]
	</isParameterPresent>
</select>

好的以上就是这次的代码,如果有错的请帮我指点一下...
5
0
分享到:
评论
5 楼 xxy_tidy_sky 2011-08-03  
where条件有问题的,只在not in嵌套里面有where ,外面没有where条件怎么行呢
4 楼 领悟人生 2011-06-16  
zsj614 写道
你的sqlserver的分页语句有问题,where 里的条件怎么只有里面的那个有。分出来肯定有问题的

呵呵,这个不会有问题。这个分页语句是我一直使用的。
如果有什么问题请指教一下。
3 楼 zsj614 2011-04-29  
你的sqlserver的分页语句有问题,where 里的条件怎么只有里面的那个有。分出来肯定有问题的
2 楼 领悟人生 2010-10-01  
当当猫 写道
不错好文章。不知道MSSQL那个语句的性能怎么样?

你说的是Mysql的分页语句吗?
1 楼 当当猫 2010-09-21  
不错好文章。不知道MSSQL那个语句的性能怎么样?

相关推荐

    ibatis sql生成工具

    同时,它支持多种数据库,包括但不限于MySQL、Oracle、SQL Server、PostgreSQL等,这使得该工具具有极高的兼容性和普适性。 在实际使用中,开发者可以通过输入必要的参数,如表名、字段名等,快速生成对应的Ibatis ...

    数据库迁移及区别比较(Oracle,Sql Server,MySql).docx

    3. **分页**:MySQL常使用`LIMIT`和`OFFSET`进行分页,而SQL Server和Oracle使用`ROW_NUMBER()`窗口函数或`ROWNUM`。 4. **内置函数**:每个数据库都有自己的内置函数集合,例如,Oracle的`DBMS_OUTPUT.PUT_LINE`在...

    mybatis详细介绍,特点,特性,用途,使用方法,学习方法文档

    4. **支持多种数据库**:MyBatis 支持 MySQL、Oracle、SQL Server 等多种数据库,适用于各种开发场景。 5. **高级功能支持**:如存储过程支持、分页查询、批量插入等高级功能,让 MyBatis 成为了处理复杂数据库...

    ibator的eclipse插件

    - **支持多种数据库**:ibator支持多种主流的数据库,如MySQL、Oracle、SQL Server等。 - **逆向工程**:从现有数据库表快速生成Java代码,节省手工编写的时间。 **4. 集成到项目** 生成的代码可以直接导入到...

    总结问题集合

    以上SQL语句分别在MySQL和Oracle中实现了分页查询,返回指定范围内的记录。 ### 5. Java String 类 在Java中,`String`类表示不可变的字符序列,这意味着一旦创建了`String`对象,它的值就不能被改变。对于频繁...

    文思面试题(java)

    2. **数据库与开发工具**:熟悉并能熟练运用至少一种关系型数据库,如MySQL、Oracle或SQL Server,以及常用的开发工具,如Eclipse、IntelliJ IDEA或NetBeans。面试时,要能够说明为何选择特定的数据库和开发工具,...

    spring-boot-mybatis-plus数据层框架

    - **多数据库支持**:分页插件支持MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、PostgreSQL等多种数据库。 #### 二、环境搭建与配置 为了在Spring Boot项目中集成MyBatis-Plus,需要进行以下步骤: 1. **导入...

    repid-framework 使用说明.docx

    - Ibatis 和 Ibatis3:直接修改生成的 `.java` 或 `.xml` 文件中的主键生成策略,如 MySQL 的 `auto_increment`。 - Spring_jdbc:根据策略类型修改 `DAO` 文件中的 `save()` 方法,例如针对 Oracle 的 `sequence`...

    java面试知识

    ##### Oracle分页 - 使用ROWNUM伪列结合子查询实现分页。 - 或使用WITH子句配合RANK()函数实现更复杂的分页逻辑。 ##### Oracle的基本数据类型 - **NUMBER**:数值类型。 - **VARCHAR2**:可变长度字符串。 - **...

    自整理Java关于基础和框架的面试题

    ##### Oracle分页 - 使用`ROWNUM`关键字进行分页。 ##### Oracle的基本数据类型 - NUMBER、VARCHAR2、DATE等。 ##### id、rowid、rownum的区别 - **id**:通常作为主键标识记录。 - **rowid**:Oracle特有的唯一...

    java必备知识点大全.pdf

    Oracle分页:Oracle提供了ROWNUM和ROWID进行分页查询。 Oracle的基本数据类型:包括 NUMBER、DATE、VARCHAR2等。 id、rowid、rownum的区别:id通常是主键字段的名称,rowid是Oracle数据库中每行数据的唯一标识,...

    DBKING使用指南

    目前工具在Oracle 11g、Microsoft SQLServer 2012、MySQL 5.x、DB2 10.x、Sybase 15.x、PostgreSQL 9.x、Derby 10.x上通过了测试。 2、通过生成器创建BO类及DAO层代码  这是一个配合dbking的代码...

Global site tag (gtag.js) - Google Analytics