`
raymond.chen
  • 浏览: 1437300 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Mybatis的拦截器

 
阅读更多

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

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

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

    Mybatis拦截器记录数据更新历史记录到MongoDB

    本文将深入探讨如何使用Mybatis拦截器来记录数据更新历史记录,并将其存储到MongoDB中。 首先,我们来理解Mybatis拦截器的原理。Mybatis的拦截器是基于Java的动态代理机制实现的,它允许我们在特定的执行点(如SQL...

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

    下面我们将详细介绍如何通过Mybatis拦截器实现这一功能。 首先,了解Mybatis拦截器的基本概念。Mybatis拦截器(Interceptor)是一种插件机制,它允许我们在Mybatis执行SQL语句之前或之后进行自定义操作,比如统计...

    mybatis拦截器修改执行sql语句

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

    mybatis拦截器的完整实现

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

    MyBatis拦截器(csdn)————程序.pdf

    MyBatis拦截器概述 MyBatis拦截器是一种强大的工具,允许开发者在DAO层和数据库之间进行额外的处理。通过拦截器,可以实现诸如分页、插入和更新时间/人、数据权限、SQL监控日志等功能,从而提高开发效率。 MyBatis...

    MyBatis拦截器 添加查询条件动态修改sql

    通过mybatis的拦截器,实现为所有sql(或指定sql) 统一添加查询条件,譬如通过线程变量传递某参数(日期),来实现对指定参数的数据筛选,而不需要在每个查询前,手动将该条件注入到查询中。因该资料网络较少,故特此...

    Mybatis拦截器实现统计sql执行时间及打印完整sql语句

    Mybatis 拦截器是 Mybatis 框架中的一种高级特性,它允许开发者在特定的执行点插入自定义的代码逻辑。在本例中,我们关注的是如何使用拦截器来实现 SQL 执行时间的统计以及打印完整的 SQL 语句。这在调试和性能优化...

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

    综上所述,"spring+springMVC+mybatis拦截器分页"项目结合了三大框架的优势,通过SpringMVC的拦截器实现业务逻辑的扩展,利用MyBatis的分页插件处理后台数据,再由EasyUI提供友好的用户界面。这样的组合为高效且可控...

    MyBatis拦截器分页

    MyBatis拦截器分页是实现数据库查询优化和提高应用性能的一种有效手段。在MyBatis框架中,拦截器扮演着动态代理的角色,允许我们在执行SQL之前或之后进行额外的操作,比如统计、日志记录或者在本例中的分页处理。...

    Mybatis 如何防止 sql 注入?mybatis 拦截器了解过吗,应用场景是什么.详情介绍

    mybatis 拦截器了解过吗,应用场景是什么.详情介绍Mybatis 如何防止 sql 注入?mybatis 拦截器了解过吗,应用场景是什么.详情介绍Mybatis 如何防止 sql 注入?mybatis 拦截器了解过吗,应用场景是什么.详情介绍...

    MyBatis拦截器及分页插件

    MyBatis拦截器及分页插件 MyBatis拦截器是MyBatis框架中一个强大的功能,它允许用户在执行某些方法之前或之后执行某些逻辑。拦截器的使用可以极大地扩展MyBatis的功能,使其更加灵活和强大。 拦截器的设计初衷是...

    mybatis 拦截器

    mybatis拦截器以及JSqlParser解析sql和生成一个新的Sqlsource

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

    2. **配置拦截器**: 在Spring Boot的配置文件`application.yml`或`application.properties`中,我们需要配置MyBatis的拦截器,并将我们创建的`PaginationInterceptor`加入到拦截器链中。 ```yaml mybatis: ...

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

    ### Mybatis拦截器介绍及分页插件 #### 1.2 前言 在Mybatis框架中,拦截器(Interceptor)是一个重要的组件,它允许开发者在不修改框架核心逻辑的情况下,添加自定义的行为。例如,可以在SQL执行前后添加日志记录...

Global site tag (gtag.js) - Google Analytics