0 0

mybatis拦截器分页问题。我在SSM工程中使用mybatis拦截器做分页,但是拦截器的intercept有时候执行有时候不执行,不知道为什么5

我在SSM工程中使用mybatis拦截器做分页,但是拦截器的intercept有时候执行有时候不执行,不知道为什么,程序员没有没有经验呢?谢谢赐教

代码:
@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = { Connection.class })})
public class PageInterceptor implements Interceptor {

private static String sqlId = "";

private static String dialect = "";

public Object intercept(Invocation inv) throws Throwable {
System.out.println("到了");
RoutingStatementHandler handler = (RoutingStatementHandler) inv.getTarget();
StatementHandler delegate = (StatementHandler)ReflectionUtils.getFieldValue(handler, "delegate");
MappedStatement mappedStatement = (MappedStatement) ReflectionUtils.getFieldValue(delegate, "mappedStatement");

if(mappedStatement.getId().matches(sqlId)) { //只拦截id包含pages的SQL
BoundSql bound = delegate.getBoundSql();

//获得当前绑定Sql的参数对象
Object object = bound.getParameterObject();
if(object == null) {
return inv.proceed();
}
if(object instanceof PageEntity<?>) {
PageEntity<?> page = (PageEntity<?>)object;
String sql = bound.getSql();

String pageSql = getPageSql(sql, page);
ReflectionUtils.setFieldValue(bound, "sql", pageSql);
}
}
return inv.proceed();
}

public String getPageSql(String sql, PageEntity<?> page) {
//此处省略SQL拼接代码
return pageSql.toString();
}

public Object plugin(Object arg0) {
return Plugin.wrap(arg0, this);
}

public void setProperties(Properties property) {
sqlId = property.getProperty("sqlId"); //".*Pages*.*"
dialect = property.getProperty("dialect"); //"oracle"
}

}

配置:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-config.dtd">

<configuration>

<settings>
<setting name="cacheEnabled" value="true" />
<setting name="lazyLoadingEnabled" value="true" />
<setting name="multipleResultSetsEnabled" value="true" />
<setting name="useColumnLabel" value="true" />
<setting name="useGeneratedKeys" value="false" />
<setting name="defaultExecutorType" value="SIMPLE" />
</settings>
   <typeAliases>
        <typeAlias type="com.cifpay.user.entity.UserEntity" alias="user" />
        <typeAlias type="com.cifpay.role.entity.RoleEntity" alias="role" />
        <typeAlias type="com.cifpay.menu.entity.MenuEntity" alias="menu" />
        <typeAlias type="com.cifpay.role.entity.RoleMenuMapEntity" alias="roleMenuMap" />
        <typeAlias type="com.cifpay.role.entity.UserRoleMapEntity" alias="userRoleMap" />
   </typeAliases>

<plugins>
<plugin interceptor="com.cifpay.base.interceptor.PageInterceptor">
<property name="sqlId" value=".*Pages*.*"/>
<property name="dialect" value="oracle"/>
</plugin>
</plugins>

    <mappers>
        <mapper resource="com/cifpay/user/entity/User.sqlMap.xml" />
        <mapper resource="com/cifpay/role/entity/Role.sqlMap.xml" />
        <mapper resource="com/cifpay/menu/entity/Menu.sqlMap.xml"/>
        <mapper resource="com/cifpay/role/entity/RoleMenuMap.sqlMap.xml"/>
        <mapper resource="com/cifpay/role/entity/UserRoleMap.sqlMap.xml"/>
      
     </mappers>
</configuration>
2013年12月10日 10:15

2个答案 按时间排序 按投票排序

0 0

它所有的操作都是来源于MapperProxy的代理,它把拦截器放入拦截,它有一个

final MapperMethod mapperMethod = cachedMapperMethod(method);

我怀疑cacheMethod导致的,不过我自己重来未碰到过

2013年12月14日 16:29
0 0

是不是拦截器配置的问题

我实现分页 是在mybatis dao的xml里拼分页sql的,

2013年12月10日 13:52

相关推荐

    MyBatis拦截器分页与动态修改SQL及其参数值

    在"MyBatis拦截器分页与动态修改SQL及其参数值"的主题中,我们可以深入理解以下几个关键知识点: 1. **MyBatis拦截器**:MyBatis提供了一种插件机制,即拦截器(Interceptor),它基于Java的动态代理,可以在SQL...

    MyBatis拦截器分页

    为了使拦截器生效,还需要在MyBatis的配置文件中注册这个拦截器,并设置拦截器的顺序(因为可能有多个拦截器,顺序会影响执行效果)。 ```xml &lt;!-- 可以配置其他属性 --&gt; ``` 通过这样的方式,我们就...

    mybatis使用拦截器实现分页操作

    4. **使用拦截器**:现在,当执行包含分页参数的Mapper方法时,拦截器会自动处理分页逻辑,无需在每个查询方法中重复编写分页代码。 除了上述基本的实现方式,还可以考虑结合MyBatis的`ExecutorType.SIMPLE`或`...

    mybatis分页拦截器(自动封装版)剖析.pdf

    在自动封装版的MyBatis分页拦截器中,开发者通常会创建一个拦截器类,该类会拦截到执行SQL的时机,然后在SQL语句中动态添加分页相关的条件,如LIMIT和OFFSET子句,以实现数据的分页展示。 分页拦截器的核心思想是...

    mybatis拦截器实现通用权限字段添加的方法

    要使用MyBatis拦截器,我们需要在Spring配置文件中添加拦截器的配置。 ```xml &lt;bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"&gt; &lt;value&gt;classpath*:xmlmapper/*.xml ...

    mybatis 分页拦截器及拦截器配置

    在分页拦截器中,它会在执行查询之前对SQL进行修改,自动添加LIMIT和OFFSET子句,从而实现分页查询。 首先,我们要引入一个分页插件,例如PageHelper或者MyBatis-Plus。这两个都是广受欢迎的MyBatis分页插件,它们...

    Mybatis分页拦截器

    4. 兼容性测试:由于不同的Mybatis版本可能有不同的API或行为,因此需要确保拦截器在目标版本下正常工作。 在压缩包文件的`com`目录下,可能包含了实现分页拦截器的相关类文件,例如拦截器的Java源码、测试用例或...

    MyBatis拦截器及分页插件

    intercept方法是拦截器要执行的方法,plugin方法是拦截器用于封装目标对象的,setProperties方法是用于在MyBatis配置文件中指定一些属性的。 在定义自己的Interceptor时,需要实现plugin方法和intercept方法。在...

    springboot+mybatis拦截器实现自动分页

    4. **在Service层中使用**: 在业务逻辑中,我们可以将`Page`对象作为参数传递,MyBatis的拦截器会自动处理分页逻辑。 ```java @Service public class UserService { @Autowired private UserMapper userMapper; ...

    spring+springMVC+mybatis拦截器分页 源码

    SpringMVC中的拦截器(Interceptor)扮演着关键角色,它可以在请求被控制器处理之前或之后执行自定义逻辑。例如,拦截器可以用来实现登录验证、记录日志、性能监控等功能。在"spring+springMVC+mybatis拦截器分页"的...

    Mybatis拦截器介绍及分页插件示例

    在Mybatis框架中,拦截器(Interceptor)是一个重要的组件,它允许开发者在不修改框架核心逻辑的情况下,添加自定义的行为。例如,可以在SQL执行前后添加日志记录、性能监控等逻辑。本文将详细介绍Mybatis拦截器的...

    mybatis拦截器分页

    MyBatis 拦截器是 MyBatis 框架中的一个重要组成部分,它允许开发者在执行 SQL 映射语句之前或之后插入自定义的行为。分页是 Web 应用程序中常见的需求,用于限制返回数据的数量,提高用户体验并减轻数据库负载。将...

    MyBatis拦截器:给参数对象属性赋值的实例

    MyBatis拦截器是MyBatis框架中的一种插件机制,允许用户自定义代码来扩展MyBatis的功能。在这个特定的实例中,我们讨论的是一个用于给参数对象属性赋值的拦截器。这个拦截器的主要目标是在执行增删改操作时,自动为...

    mybatis拦截器修改执行sql语句

    通过mybatis拦截器将查询语句、更新语句、删除语句、插入语句中指定表明替换为另一个表名

    通过Mybatis拦截器自动定位慢SQL并记录日志

    Mybatis拦截器(Interceptor)是一种插件机制,它允许我们在Mybatis执行SQL语句之前或之后进行自定义操作,比如统计SQL执行时间、添加日志等。拦截器基于Java的动态代理实现,可以拦截Mapper接口方法的调用。 接...

    mybatis分页拦截器

    MyBatis 分页拦截器是一种优化数据库查询性能的工具,它允许我们在不修改原有业务代码的情况下,实现对数据库查询结果的分页处理。在大型Web应用中,分页功能是必不可少的,因为它可以帮助用户更有效地浏览和管理...

    mybatis拦截器的完整实现

    MyBatis拦截器是MyBatis框架中一个强大的特性,它允许我们在MyBatis执行SQL语句前后插入自定义逻辑,比如日志记录、性能分析、动态修改SQL等。在这个"mybatis拦截器的完整实现"项目中,我们可以通过设置拦截器来观察...

Global site tag (gtag.js) - Google Analytics