package study.mybatis.interceptor;
import java.sql.Connection;
import java.util.Properties;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
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 study.mybatis.dialect.Dialect;
import study.mybatis.dialect.MySql5Dialect;
@Intercepts({@Signature(type=StatementHandler.class,method="prepare",args={Connection.class})})
publicclass PaginationInterceptor implements Interceptor{
privatefinalstatic Log log = LogFactory.getLog(PaginationInterceptor.class);
@Override
public Object intercept(Invocation invocation) throws Throwable {
StatementHandler statementHandler = (StatementHandler)invocation.getTarget();
BoundSql boundSql = statementHandler.getBoundSql();
MetaObject metaStatementHandler = MetaObject.forObject(statementHandler);
RowBounds rowBounds = (RowBounds)metaStatementHandler.getValue("delegate.rowBounds");
if(rowBounds ==null|| rowBounds == RowBounds.DEFAULT){
return invocation.proceed();
}
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){
thrownew RuntimeException("the value of the dialect property in configuration.xml is not defined : "+ configuration.getVariables().getProperty("dialect"));
}
Dialect dialect =null;
switch(databaseType){
case MYSQL:
dialect =new MySql5Dialect();
}
String originalSql = (String)metaStatementHandler.getValue("delegate.boundSql.sql");
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()){
log.debug("生成分页SQL : "+ boundSql.getSql());
}
return invocation.proceed();
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
@Override
publicvoid setProperties(Properties properties) {
}
}
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 );
相关推荐
在本案例中,我们将探讨如何利用MyBatis的拦截器功能实现分页操作,以此来提高代码的复用性和可维护性。下面将详细阐述这一过程。 首先,我们需要了解MyBatis拦截器的基本概念。MyBatis拦截器类似于Java的AOP(面向...
Mybatis分页拦截器是Mybatis框架中一种实用的扩展机制,用于实现高效的数据库查询分页功能。在Mybatis中,拦截器扮演着插件的角色,可以监听并修改Mybatis执行过程中的某些行为。本话题将深入探讨Mybatis分页拦截器...
本教程将详细讲解如何利用拦截器来实现这一功能。 首先,我们需要理解Spring Boot和MyBatis的基础。Spring Boot简化了Spring应用程序的开发过程,它提供了预配置的依赖项、内嵌的HTTP服务器(如Tomcat)以及自动...
在"MyBatis拦截器分页与动态修改SQL及其参数值"的主题中,我们可以深入理解以下几个关键知识点: 1. **MyBatis拦截器**:MyBatis提供了一种插件机制,即拦截器(Interceptor),它基于Java的动态代理,可以在SQL...
MyBatis 分页拦截器是实现数据库查询分页效果的一种高效解决方案。在传统的SQL查询中,我们通常需要手动编写分页语句,但这容易出错且不易维护。通过使用分页拦截器,我们可以将分页逻辑封装起来,使得在编写Mapper...
MyBatis 分页拦截器是一种优化数据库操作的技术,它的主要目的是在不修改大量现有业务代码的情况下,实现对数据库查询结果的自动分页。在自动封装版的MyBatis分页拦截器中,开发者通常会创建一个拦截器类,该类会...
MyBatis拦截器分页是实现数据库查询优化和提高应用性能的一种有效手段。在MyBatis框架中,拦截器扮演着动态代理的角色,允许我们在执行SQL之前或之后进行额外的操作,比如统计、日志记录或者在本例中的分页处理。...
总结来说,MyBatis拦截器实现分页功能需要定义一个分页对象来存储分页参数,然后通过实现Interceptor接口并重写intercept方法来修改原始SQL语句,最后在MyBatis配置中正确注册拦截器。这样就可以在不侵入原有业务...
MyBatis拦截器是MyBatis框架中一个强大的功能,它允许用户在执行某些方法之前或之后执行某些逻辑。拦截器的使用可以极大地扩展MyBatis的功能,使其更加灵活和强大。 拦截器的设计初衷是为了供用户在某些时候可以...
综上所述,"spring+springMVC+mybatis拦截器分页"项目结合了三大框架的优势,通过SpringMVC的拦截器实现业务逻辑的扩展,利用MyBatis的分页插件处理后台数据,再由EasyUI提供友好的用户界面。这样的组合为高效且可控...
本文将详细介绍Mybatis拦截器的原理及其应用,并通过一个具体的分页插件示例来展示如何使用拦截器。 #### 1.3 Interceptor接口 Mybatis提供了`Interceptor`接口作为自定义拦截器的基础。此接口包含三个主要方法: ...
MyBatis拦截器是基于AOP(面向切面编程)的一种机制,它允许我们在特定的执行点(如SQL语句的执行、参数的设置等)插入自定义的行为。分页拦截器就是在执行SQL之前或之后,对SQL语句进行修改,添加必要的分页条件,...
此外,可以定义一个PageHelper类或自定义拦截器来实现更灵活的分页功能。 - **Mapper接口(UserMapper.java)**:定义与数据库交互的方法,如`selectUsersByPage`,该方法返回一个List并接收RowBounds作为参数。 ...
在本主题中,我们将深入探讨如何利用Mybatis的拦截器机制来实现分页功能。 分页是Web应用中常见的需求,它能帮助用户更有效地浏览大量数据。Mybatis虽然没有内置的分页功能,但通过自定义拦截器,我们可以轻松地...
总结来说,MyBatis 的拦截器机制为实现分页提供了一种高效、灵活的方式。通过拦截器,我们可以统一处理分页逻辑,降低代码复杂度,同时还能优化查询性能,提升开发效率。结合实际业务需求,正确配置和使用拦截器,能...
MyBatis 自动分页实现的关键是使用拦截器来拦截 SQL 语句并将其修改为分页查询语句。拦截器可以在执行 SQL 语句之前和之后进行拦截, таким образом,可以在执行 SQL 语句之前将其修改为分页查询语句,...