Mybatis采用责任链模式,通过动态代理组织多个拦截器,通过这些拦截器可以改变Mybatis的默认行为。Mybatis的拦截器实现机制,使用的是JDK的InvocationHandler。
Mybatis对以下接口进行拦截:
Executor
是 Mybatis的内部执行器,它负责调用StatementHandler操作数据库,并把结果集通过 ResultSetHandler进行自动映射,另外,他还处理了二级缓存的操作。
执行SQL语句,并且对事务、缓存等提供统一接口
StatementHandler
是Mybatis直接和数据库执行sql脚本的对象。另外它也实现了Mybatis的一级缓存。
对 statement 进行预处理,并且提供统一的原子的增、删、改、查接口
ResultSetHandler
是Mybatis把ResultSet集合映射成POJO的接口对象。
可以对Mybatis的结果集自动映射进行修改。
PameterHandler
是Mybatis实现Sql入参设置的对象。
注解类:
@Intercepts:用于表明当前对象是一个Interceptor
@Signature:表明要拦截的接口、方法以及对应的参数类型
自定义拦截器:
@Intercepts({ @Signature(type=Executor.class, method="query" , args={MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}), @Signature(type=ResultSetHandler.class, method="handleResultSets", args={Statement.class}), @Signature(type=ParameterHandler.class, method="setParameters", args=PreparedStatement.class), @Signature(type=StatementHandler.class, method="prepare", args={Connection.class, Integer.class}) }) public class SeasyInterceptor implements Interceptor{ @Override public Object intercept(Invocation invocation) throws Throwable { System.out.println(invocation.getMethod().getName()); System.out.println(invocation.getTarget().getClass().getName()); Object result = null; if(invocation.getTarget() instanceof ResultSetHandler){ result = invocation.proceed(); System.out.println("ResultSetHandler >> " + result.getClass().getName()); }else if(invocation.getTarget() instanceof Executor){ System.out.println("Executor..."); result = invocation.proceed(); }else if(invocation.getTarget() instanceof ParameterHandler){ System.out.println("ParameterHandler..."); ParameterHandler parameterHandler = (ParameterHandler) invocation.getTarget(); PreparedStatement ps = (PreparedStatement) invocation.getArgs()[0]; Field boundSqlField = parameterHandler.getClass().getDeclaredField("boundSql"); boundSqlField.setAccessible(true); BoundSql boundSql = (BoundSql) boundSqlField.get(parameterHandler); String originalSql = boundSql.getSql(); System.out.println(originalSql); result = invocation.proceed(); }else if(invocation.getTarget() instanceof StatementHandler){ System.out.println("StatementHandler..."); StatementHandler statementHandler = (StatementHandler) invocation.getTarget(); MetaObject metaStatementHandler = SystemMetaObject.forObject(statementHandler); BoundSql boundSql = (BoundSql) metaStatementHandler.getValue("delegate.boundSql"); String originalSql = boundSql.getSql(); System.out.println(originalSql); result = invocation.proceed(); }else{ result = invocation.proceed(); } return result; } @Override public Object plugin(Object target) { return Plugin.wrap(target, this); } @Override public void setProperties(Properties properties) { String prop1 = properties.getProperty("prop1"); System.out.println("prop1=" + prop1); } }
Mybatis的配置类:
@Configuration @EnableTransactionManagement //开启注解式事务 @MapperScan("com.seasy.mybatis.mapper") public class MybatisConfig implements TransactionManagementConfigurer{ @Autowired DataSource dataSource; @Bean(name = "sqlSessionFactory") public SqlSessionFactory sqlSessionFactoryBean()throws Exception{ SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); //加载Mybatis的xml配置文件 PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); bean.setMapperLocations(resolver.getResources("classpath:mappers/*.xml")); //分页插件 PageHelper Properties prop = new Properties(); prop.setProperty("offsetAsPageNum", "true"); prop.setProperty("rowBoundsWithCount", "true"); prop.setProperty("reasonable", "true"); prop.setProperty("dialect", "mysql"); prop.setProperty("supportMethodsArguments", "true"); prop.setProperty("returnPageInfo", "check"); prop.setProperty("params", "count=countSql"); PageHelper pageHelper = new PageHelper(); pageHelper.setProperties(prop); Properties prop2 = new Properties(); prop2.setProperty("prop1", "value1"); SeasyInterceptor seasyInterceptor = new SeasyInterceptor(); seasyInterceptor.setProperties(prop2); bean.setPlugins(new Interceptor[] { pageHelper, seasyInterceptor }); return bean.getObject(); } @Bean public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) { return new SqlSessionTemplate(sqlSessionFactory); } @Bean @Override public PlatformTransactionManager annotationDrivenTransactionManager() { return new DataSourceTransactionManager(dataSource); } }
相关推荐
MyBatis拦截器实现通用权限字段添加的方法 MyBatis拦截器是一种非常实用的技术,可以用来实现各种复杂的数据库操作。本文将详细介绍如何使用MyBatis拦截器来实现通用权限字段添加,达到灵活、可靠、可维护的数据库...
MyBatis拦截器是MyBatis框架中的一种插件机制,允许用户自定义代码来扩展MyBatis的功能。在这个特定的实例中,我们讨论的是一个用于给参数对象属性赋值的拦截器。这个拦截器的主要目标是在执行增删改操作时,自动为...
在"MyBatis拦截器分页与动态修改SQL及其参数值"的主题中,我们可以深入理解以下几个关键知识点: 1. **MyBatis拦截器**:MyBatis提供了一种插件机制,即拦截器(Interceptor),它基于Java的动态代理,可以在SQL...
本文将深入探讨如何使用Mybatis拦截器来记录数据更新历史记录,并将其存储到MongoDB中。 首先,我们来理解Mybatis拦截器的原理。Mybatis的拦截器是基于Java的动态代理机制实现的,它允许我们在特定的执行点(如SQL...
下面我们将详细介绍如何通过Mybatis拦截器实现这一功能。 首先,了解Mybatis拦截器的基本概念。Mybatis拦截器(Interceptor)是一种插件机制,它允许我们在Mybatis执行SQL语句之前或之后进行自定义操作,比如统计...
通过mybatis拦截器将查询语句、更新语句、删除语句、插入语句中指定表明替换为另一个表名
MyBatis拦截器是MyBatis框架中一个强大的特性,它允许我们在MyBatis执行SQL语句前后插入自定义逻辑,比如日志记录、性能分析、动态修改SQL等。在这个"mybatis拦截器的完整实现"项目中,我们可以通过设置拦截器来观察...
MyBatis拦截器概述 MyBatis拦截器是一种强大的工具,允许开发者在DAO层和数据库之间进行额外的处理。通过拦截器,可以实现诸如分页、插入和更新时间/人、数据权限、SQL监控日志等功能,从而提高开发效率。 MyBatis...
通过mybatis的拦截器,实现为所有sql(或指定sql) 统一添加查询条件,譬如通过线程变量传递某参数(日期),来实现对指定参数的数据筛选,而不需要在每个查询前,手动将该条件注入到查询中。因该资料网络较少,故特此...
Mybatis 拦截器是 Mybatis 框架中的一种高级特性,它允许开发者在特定的执行点插入自定义的代码逻辑。在本例中,我们关注的是如何使用拦截器来实现 SQL 执行时间的统计以及打印完整的 SQL 语句。这在调试和性能优化...
综上所述,"spring+springMVC+mybatis拦截器分页"项目结合了三大框架的优势,通过SpringMVC的拦截器实现业务逻辑的扩展,利用MyBatis的分页插件处理后台数据,再由EasyUI提供友好的用户界面。这样的组合为高效且可控...
MyBatis拦截器分页是实现数据库查询优化和提高应用性能的一种有效手段。在MyBatis框架中,拦截器扮演着动态代理的角色,允许我们在执行SQL之前或之后进行额外的操作,比如统计、日志记录或者在本例中的分页处理。...
mybatis 拦截器了解过吗,应用场景是什么.详情介绍Mybatis 如何防止 sql 注入?mybatis 拦截器了解过吗,应用场景是什么.详情介绍Mybatis 如何防止 sql 注入?mybatis 拦截器了解过吗,应用场景是什么.详情介绍...
MyBatis拦截器及分页插件 MyBatis拦截器是MyBatis框架中一个强大的功能,它允许用户在执行某些方法之前或之后执行某些逻辑。拦截器的使用可以极大地扩展MyBatis的功能,使其更加灵活和强大。 拦截器的设计初衷是...
mybatis拦截器以及JSqlParser解析sql和生成一个新的Sqlsource
2. **配置拦截器**: 在Spring Boot的配置文件`application.yml`或`application.properties`中,我们需要配置MyBatis的拦截器,并将我们创建的`PaginationInterceptor`加入到拦截器链中。 ```yaml mybatis: ...
### Mybatis拦截器介绍及分页插件 #### 1.2 前言 在Mybatis框架中,拦截器(Interceptor)是一个重要的组件,它允许开发者在不修改框架核心逻辑的情况下,添加自定义的行为。例如,可以在SQL执行前后添加日志记录...