- 浏览: 1152316 次
- 性别:
- 来自: 火星郊区
博客专栏
-
OSGi
浏览量:0
文章分类
- 全部博客 (695)
- 项目管理 (48)
- OSGi (122)
- java (79)
- Vaadin (5)
- RAP (47)
- mysql (40)
- Maven (22)
- SVN (8)
- 孔雀鱼 (10)
- hibernate (9)
- spring (10)
- css (3)
- 年审 (6)
- ant (1)
- jdbc (3)
- FusionCharts (2)
- struts (4)
- 决策分析 (2)
- 生活 (10)
- 架构设计 (5)
- 破解 (2)
- 狼文化 (4)
- JVM (14)
- J2EE (1)
- 应用服务器 (1)
- 我的链接 (5)
- 数学 (2)
- 报表 (1)
- 百科 (6)
- Flex (7)
- log4j (2)
- PHP (1)
- 系统 (2)
- Web前端 (7)
- linux (6)
- Office (1)
- 安全管理 (5)
- python (2)
- dom4j (1)
- 工作流 (3)
- 养生保健 (4)
- Eclipse (8)
- 监控开发 (1)
- 设计 (3)
- CAS (1)
- ZK (41)
- BluePrint (3)
- 工具 (1)
- SWT (7)
- google (2)
- NIO (1)
- 企业文化 (2)
- Windoes (0)
- RCP (7)
- JavaScript (10)
- UML (1)
- 产品经理 (2)
- Velocity (10)
- C (1)
- 单元测试 (1)
- 设计模式 (2)
- 系统分析师 (2)
- 架构 (4)
- 面试 (2)
- 代码走查 (1)
- MongoDB (1)
- 企业流程优化 (1)
- 模式 (1)
- EJB (1)
- Jetty (1)
- Git (13)
- IPV6 (1)
- JQuery (8)
- SSH (1)
- mybatis (10)
- SiteMesh (2)
- JSTL (1)
- veloctiy (1)
- Spring MVC (1)
- struts2 (3)
- Servlet (1)
- 权限管理 (1)
- Java Mina (1)
- java 系统信息 (6)
- OSGi 基础 (3)
- html (1)
- spring--security (6)
- HTML5 (1)
- java爬虫搜索 (1)
- mvc (3)
最新评论
-
Tom.X:
http://osgia.com/
将web容器置于OSGi框架下进行web应用的开发 -
chenyuguxing:
你好, 为什么我的bundle export到felix工程中 ...
在Apache Felix中运行bundle -
string2020:
<niceManifest>true</ni ...
Bundle Plugin for Maven -
jsonmong:
OSGI,是未来的主流,目前已相当成熟。应用OSGI比较好的, ...
基于OSGi的声明式服务 -
zyhui98:
貌似是翻译过来的,有很少人在linux上做开发吧
如何成为“10倍效率”开发者
Mybatis的自带分页方法只是逻辑分页,如果数据量很大,内存会溢出,不知道为什么开源组织不在里面实现类似Hibernate的物理分页处理方法。在不改动Mybatis源代码的情况下,怎么使Mybatis支持物理分页呢?下面我们来看看。
(1)新建一个Java类Dialect.java,该类的内容如下:
- package org.mybatis.extend.interceptor;
- public abstract class Dialect {
- public static enum Type{
- MYSQL,
- ORACLE
- }
- public abstract String getLimitString(String sql, int skipResults, int maxResults);
- }
(2)新建一个Java类OracleDialect.java,该类继承Dialect 类,具体的内容如下:
- package org.mybatis.extend.interceptor;
- public class OracleDialect extends Dialect{
- /* (non-Javadoc)
- * @see org.mybatis.extend.interceptor.IDialect#getLimitString(java.lang.String, int, int)
- */
- @Override
- public String getLimitString(String sql, int offset, int limit) {
- sql = sql.trim();
- StringBuffer pagingSelect = new StringBuffer(sql.length() + 100 );
- pagingSelect.append("select * from ( select row_.*, rownum rownum_ from ( " );
- pagingSelect.append(sql);
- pagingSelect.append(" ) row_ ) where rownum_ > " ).append(offset).append( " and rownum_ <= " ).append(offset + limit);
- return pagingSelect.toString();
- }
- }
(3)新建一个Mybaits的拦截器PaginationInterceptor.java,实现Interceptor接口,该类的内容如下:
- package org.mybatis.extend.interceptor;
- import java.sql.Connection;
- import java.util.Map;
- import java.util.Properties;
- import org.apache.ibatis.executor.parameter.DefaultParameterHandler;
- import org.apache.ibatis.executor.statement.StatementHandler;
- import org.apache.ibatis.mapping.BoundSql;
- import org.apache.ibatis.plugin.Interceptor;
- import org.apache.ibatis.plugin.Intercepts;
- import org.apache.ibatis.plugin.Invocation;
- import org.apache.ibatis.plugin.Plugin;
- import org.apache.ibatis.plugin.Signature;
- import org.apache.ibatis.reflection.MetaObject;
- import org.apache.ibatis.session.Configuration;
- import org.apache.ibatis.session.RowBounds;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- @Intercepts ({ @Signature (type=StatementHandler. class ,method= "prepare" ,args={Connection. class })})
- public class PaginationInterceptor implements Interceptor {
- //日志对象
- protected static Logger log = LoggerFactory.getLogger(PaginationInterceptor. class );
- /* (non-Javadoc)
- * @see org.apache.ibatis.plugin.Interceptor#intercept(org.apache.ibatis.plugin.Invocation)
- */
- @Override
- public Object intercept(Invocation invocation) throws Throwable {
- StatementHandler statementHandler = (StatementHandler)invocation.getTarget();
- MetaObject metaStatementHandler = MetaObject.forObject(statementHandler);
- RowBounds rowBounds = (RowBounds)metaStatementHandler.getValue("delegate.rowBounds" );
- if (rowBounds == null || rowBounds == RowBounds.DEFAULT){
- return invocation.proceed();
- }
- DefaultParameterHandler defaultParameterHandler = (DefaultParameterHandler)metaStatementHandler.getValue("delegate.parameterHandler" );
- Map parameterMap = (Map)defaultParameterHandler.getParameterObject();
- Object sidx = parameterMap.get("_sidx" );
- Object sord = parameterMap.get("_sord" );
- String originalSql = (String)metaStatementHandler.getValue("delegate.boundSql.sql" );
- if (sidx != null && sord != null ){
- originalSql = originalSql + " order by " + sidx + " " + sord;
- }
- Configuration configuration = (Configuration)metaStatementHandler.getValue("delegate.configuration" );
- Dialect.Type databaseType = null ;
- try {
- databaseType = Dialect.Type.valueOf(configuration.getVariables().getProperty("dialect" ).toUpperCase());
- } catch (Exception e){
- //ignore
- }
- if (databaseType == null ){
- throw new RuntimeException( "the value of the dialect property in configuration.xml is not defined : " + configuration.getVariables().getProperty( "dialect" ));
- }
- Dialect dialect = null ;
- switch (databaseType){
- case ORACLE:
- dialect = new OracleDialect();
- break ;
- case MYSQL: //需要实现MySQL的分页逻辑
- break ;
- }
- metaStatementHandler.setValue("delegate.boundSql.sql" , dialect.getLimitString(originalSql, rowBounds.getOffset(), rowBounds.getLimit()) );
- metaStatementHandler.setValue("delegate.rowBounds.offset" , RowBounds.NO_ROW_OFFSET );
- metaStatementHandler.setValue("delegate.rowBounds.limit" , RowBounds.NO_ROW_LIMIT );
- if (log.isDebugEnabled()){
- BoundSql boundSql = statementHandler.getBoundSql();
- log.debug("生成分页SQL : " + boundSql.getSql());
- }
- return invocation.proceed();
- }
- /* (non-Javadoc)
- * @see org.apache.ibatis.plugin.Interceptor#plugin(java.lang.Object)
- */
- @Override
- public Object plugin(Object target) {
- return Plugin.wrap(target, this );
- }
- /* (non-Javadoc)
- * @see org.apache.ibatis.plugin.Interceptor#setProperties(java.util.Properties)
- */
- @Override
- public void setProperties(Properties arg0) {
- // TODO Auto-generated method stub
- }
- }
(4)将Mybatis的拦截器配置到Mybatis的全局配置文件(mybatis.cfg.xml)中,具体如下:
- <?xml version= "1.0" encoding= "UTF-8" ?>
- <!DOCTYPE configuration PUBLIC
- "-//mybatis.org//DTD Config 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-config.dtd" >
- <configuration>
- <properties>
- <property name="dialect" value= "oracle" />
- </properties>
- <plugins>
- <plugin interceptor="org.mybatis.extend.interceptor.PaginationInterceptor" />
- </plugins>
- </configuration>
(5)使用方法同Mybatis逻辑分页一样,拦截器会自动拦截执行SQL的地方,加上分页代码:
发表评论
-
Abator自动生成ibatis的相关配置和类
2012-11-14 16:02 1223一、abator自动生成配置: abator自动生成ibat ... -
sqlSession.getMapper(UserMapper.class)的使用方式
2012-09-10 13:33 10199说明: 1,本文采用的Mybatis框架版本为: mybat ... -
MyBatis的关于批量数据操作的体会
2012-09-06 08:53 1074MyBatis的前身就是著名的Ibatis,不知何故脱 ... -
Mybatis目录
2012-09-06 08:53 2072Mybatis使用篇之一:Mybatis介绍 ... -
Mybatis使用篇之七:存储过程调用
2012-09-05 11:27 1325如何使用Mybaits 调用数据库中的存储过程,下面以Ora ... -
Mybatis使用篇之四:整合Spring
2012-09-05 11:26 1781Mybaits为什么要整合Spring? 说白了其实 ... -
Mybatis使用篇之二:HelloWorld
2012-09-05 11:23 17131. 搭建开发环境 (1)新建一个Web工程,名称为 ... -
Mybatis使用篇之一:Mybatis介绍
2012-09-05 11:21 1889MyBatis是一个数据持久层框架,MyBatis 消除了 ... -
mybatis xml 一对多
2012-09-05 11:20 1328<? xml version = &q ...
相关推荐
1. **基于插件的分页**:MyBatis 提供了一个 PageHelper 插件,它可以方便地实现物理分页。首先,你需要在 Maven 或 Gradle 的依赖中添加 PageHelper 的依赖,然后在 MyBatis 的配置文件中启用该插件。PageHelper ...
mybatis实战教程mybatis in action之七实现mybatis分页源码下载 mybatis实战教程mybatis in action之八mybatis 动态sql语句 mybatis实战教程mybatis in action之九mybatis 代码生成工具的使用 mybatis ...
- 分页查询:通过设置RowBounds对象实现物理分页,或者使用Mybatis Plus等扩展库进行更复杂的分页。 - 复杂查询:利用Mybatis的动态SQL,可以轻松处理复杂条件的查询。 总结,Mybatis作为一款优秀的Java持久层...
4. 分页查询:内建的分页插件实现了物理分页和逻辑分页,支持多种数据库,且配置简单。 5. CRUD操作:提供了基本的增删改查接口,只需继承BaseMapper,即可一键生成对应的Mapper和XML文件。 三、主要功能 1. CRUD...
2. 物理分页:将数据预先分割成固定大小的页存储,每次请求时直接读取指定页的数据,适用于数据量极大且频繁访问的情况。 3. 记录数分页:先查询总记录数,然后计算出总页数,再根据页码获取数据,适用于数据量较小...
逻辑分页不同于物理分页,物理分页是在数据库层面进行数据切片,而逻辑分页则是在应用程序层面上实现,通常通过查询全部数据并按需显示每一页的数据。 这篇博客“java逻辑分页”可能详细介绍了如何在Java应用中实现...
1. 使用SQL语句实现分页:最直接的方法是在SQL查询语句中添加LIMIT和OFFSET关键字(MySQL),或者使用ROW_NUMBER()函数配合子查询(如Oracle、SQL Server)。例如: ```sql SELECT * FROM (SELECT ROW_NUMBER() ...
数据的物理分页使用的是开源项目Mybatis-Page-Helper ,也是非常的轻量和易于引入。hibernate-validator的数据实体验证也使得参数的验证变得简单了起来。随着不停的实现与增加功能,引入的东西也变得丰富了起来。 #...
这篇文章将深入探讨MybatisPlus的基本概念、核心特性以及使用示例,帮助开发者更好地理解和运用这个工具。 一、MybatisPlus简介 MybatisPlus是由百度开源的一个轻量级框架,它的主要目标是简化Mybatis的常规操作,...
3. **分页查询**:Mybatis Plus内置了分页插件,只需传入Page对象即可实现分页查询,支持多种数据库的分页方式。 4. **填充公共字段**:通过`@TableField(fill = FieldFill.INSERT)`或`@TableField(fill = ...
- 或使用WITH子句配合RANK()函数实现更复杂的分页逻辑。 ##### Oracle的基本数据类型 - **NUMBER**:数值类型。 - **VARCHAR2**:可变长度字符串。 - **DATE**:日期类型。 - **TIMESTAMP**:精确到毫秒的时间戳。...
PageHelper是MyBatis的物理分页插件,有助于提高查询性能。此外,项目还利用Swagger-UI生成API文档,方便接口的管理和测试。搜索引擎Elasticsearch用于提供高效的搜索功能,RabbitMQ处理消息队列,实现异步通信。...