我在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>
相关推荐
在"MyBatis拦截器分页与动态修改SQL及其参数值"的主题中,我们可以深入理解以下几个关键知识点: 1. **MyBatis拦截器**:MyBatis提供了一种插件机制,即拦截器(Interceptor),它基于Java的动态代理,可以在SQL...
为了使拦截器生效,还需要在MyBatis的配置文件中注册这个拦截器,并设置拦截器的顺序(因为可能有多个拦截器,顺序会影响执行效果)。 ```xml <!-- 可以配置其他属性 --> ``` 通过这样的方式,我们就...
4. **使用拦截器**:现在,当执行包含分页参数的Mapper方法时,拦截器会自动处理分页逻辑,无需在每个查询方法中重复编写分页代码。 除了上述基本的实现方式,还可以考虑结合MyBatis的`ExecutorType.SIMPLE`或`...
在自动封装版的MyBatis分页拦截器中,开发者通常会创建一个拦截器类,该类会拦截到执行SQL的时机,然后在SQL语句中动态添加分页相关的条件,如LIMIT和OFFSET子句,以实现数据的分页展示。 分页拦截器的核心思想是...
要使用MyBatis拦截器,我们需要在Spring配置文件中添加拦截器的配置。 ```xml <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <value>classpath*:xmlmapper/*.xml ...
在分页拦截器中,它会在执行查询之前对SQL进行修改,自动添加LIMIT和OFFSET子句,从而实现分页查询。 首先,我们要引入一个分页插件,例如PageHelper或者MyBatis-Plus。这两个都是广受欢迎的MyBatis分页插件,它们...
4. 兼容性测试:由于不同的Mybatis版本可能有不同的API或行为,因此需要确保拦截器在目标版本下正常工作。 在压缩包文件的`com`目录下,可能包含了实现分页拦截器的相关类文件,例如拦截器的Java源码、测试用例或...
intercept方法是拦截器要执行的方法,plugin方法是拦截器用于封装目标对象的,setProperties方法是用于在MyBatis配置文件中指定一些属性的。 在定义自己的Interceptor时,需要实现plugin方法和intercept方法。在...
4. **在Service层中使用**: 在业务逻辑中,我们可以将`Page`对象作为参数传递,MyBatis的拦截器会自动处理分页逻辑。 ```java @Service public class UserService { @Autowired private UserMapper userMapper; ...
SpringMVC中的拦截器(Interceptor)扮演着关键角色,它可以在请求被控制器处理之前或之后执行自定义逻辑。例如,拦截器可以用来实现登录验证、记录日志、性能监控等功能。在"spring+springMVC+mybatis拦截器分页"的...
在Mybatis框架中,拦截器(Interceptor)是一个重要的组件,它允许开发者在不修改框架核心逻辑的情况下,添加自定义的行为。例如,可以在SQL执行前后添加日志记录、性能监控等逻辑。本文将详细介绍Mybatis拦截器的...
MyBatis 拦截器是 MyBatis 框架中的一个重要组成部分,它允许开发者在执行 SQL 映射语句之前或之后插入自定义的行为。分页是 Web 应用程序中常见的需求,用于限制返回数据的数量,提高用户体验并减轻数据库负载。将...
MyBatis拦截器是MyBatis框架中的一种插件机制,允许用户自定义代码来扩展MyBatis的功能。在这个特定的实例中,我们讨论的是一个用于给参数对象属性赋值的拦截器。这个拦截器的主要目标是在执行增删改操作时,自动为...
Mybatis拦截器(Interceptor)是一种插件机制,它允许我们在Mybatis执行SQL语句之前或之后进行自定义操作,比如统计SQL执行时间、添加日志等。拦截器基于Java的动态代理实现,可以拦截Mapper接口方法的调用。 接...
通过mybatis拦截器将查询语句、更新语句、删除语句、插入语句中指定表明替换为另一个表名
MyBatis 分页拦截器是一种优化数据库查询性能的工具,它允许我们在不修改原有业务代码的情况下,实现对数据库查询结果的分页处理。在大型Web应用中,分页功能是必不可少的,因为它可以帮助用户更有效地浏览和管理...
在“Mybatis拦截器记录数据更新历史记录到MongoDB”这个项目中,我们需要创建一个自定义的拦截器类,该类需要实现`org.apache.ibatis.plugin.Interceptor`接口并覆写`intercept`方法。在这个方法里,我们可以捕获到...