applicationContext.xml

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"
lazy-init="false">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:SqlMapConfig.xml" />
<property name="plugins">
<list>
<bean class="com.fyh.www.common.interceptor.SqlLogInterceptor" />
</list>
</property>
</bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="annotationClass" value="org.springframework.stereotype.Repository" /><!-- 记得加注解 @Repository -->
<property name="basePackage" value="com.fyh.www" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>

SqlMapConfig.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration>
<settings>
<setting name="lazyLoadingEnabled" value="false" />
<setting name="cacheEnabled" value="true" />
</settings> <!-- 在map.xml文件中配置如下 -->
<!-- <cache type="org.mybatis.caches.ehcache.EhcacheCache"/> -->
</configuration>

记录sql语句拦截器的具体实现

package com.fyh.www.common.interceptor;

import java.sql.Connection;
import java.util.List;
import java.util.Properties;
import java.util.StringTokenizer; import org.apache.commons.beanutils.BeanUtils;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.ParameterMapping;
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.log4j.Logger;
/**
* mybatis 日志拦截器,只拦截实现了StatementHandler接口,方法参数 是Connection的prepare方法
* @author pc
*
*/ @Intercepts(@Signature(type=StatementHandler.class,method="prepare",args=Connection.class))
public class SqlLogInterceptor implements Interceptor { protected final Logger log = Logger.getLogger(SqlLogInterceptor.class); /**
* 对原方法prepare方法进行拦截增强
*/
@Override
public Object intercept(Invocation invocation) throws Throwable {
// TODO Auto-generated method stub
StatementHandler statementHandler = (StatementHandler)invocation.getTarget();
BoundSql boundSql = statementHandler.getBoundSql();
Object parameterObject = statementHandler.getParameterHandler().getParameterObject();
StringBuffer sb = new StringBuffer();
sb.append(new StringBuilder().append(removeBreakingWhitespace(boundSql.getSql())).toString());
List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
for (ParameterMapping parameterMapping : parameterMappings) {
String param = parameterMapping.getProperty();
try {
sb.append(new StringBuilder().append("[").append(param).append(":")
.append(BeanUtils.getProperty(parameterObject, param)).append("]").toString());
} catch (Exception e) {
sb.append(new StringBuilder().append("[").append(param).append(":").append(parameterObject).append("]").toString());
} } Object result = null;
try {
result = invocation.proceed();
log.info(sb.toString());
} catch (Exception e) {
log.error(sb.toString());
} return result;
} /**
* 去除空格和换行
* @param original 原始字符串
* @return
*/
public String removeBreakingWhitespace(String original){
StringTokenizer stringTokenizer = new StringTokenizer(original);
StringBuffer sb = new StringBuffer();
while(stringTokenizer.hasMoreTokens()){
sb.append(stringTokenizer.nextToken());
}
return sb.toString(); } /**
* 返回对象,如果返回原对象不拦截,如果返回代理则拦截
*/
@Override
public Object plugin(Object object) {
// TODO Auto-generated method stub
return Plugin.wrap(object, this);
}
/**
* 此方法用来获取配置参数
*/
@Override
public void setProperties(Properties properties) {
// TODO Auto-generated method stub } }

mybatis定义拦截器的更多相关文章

  1. Mybatis Interceptor 拦截器原理 源码分析

    Mybatis采用责任链模式,通过动态代理组织多个拦截器(插件),通过这些拦截器可以改变Mybatis的默认行为(诸如SQL重写之类的),由于插件会深入到Mybatis的核心,因此在编写自己的插件前最 ...

  2. mybatis Interceptor拦截器代码详解

    mybatis官方定义:MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis ...

  3. struts2学习笔记(5)---自己定义拦截器

    什么是拦截器? struts2中拦截器分为Struts2定义好的拦截器和自己定义的拦截器. 其作用是在一个Action运行之前进行拦截,在Action运行之后又增加某些操作. 实现原理 当请求一个Ac ...

  4. Struts2通过自己定义拦截器实现登录之后跳转到原页面

    这个功能对用户体验来说是非常重要的.实现起来事实上非常easy. 拦截器的代码例如以下: package go.derek.advice; import go.derek.entity.User; i ...

  5. jquery.ajax与axios及定义拦截器

    首先导入jquery和axios包 jquery.ajax function reg(){ var username = $("#username").val(); var pas ...

  6. Mybatis之拦截器原理(jdk动态代理优化版本)

    在介绍Mybatis拦截器代码之前,我们先研究下jdk自带的动态代理及优化 其实动态代理也是一种设计模式...优于静态代理,同时动态代理我知道的有两种,一种是面向接口的jdk的代理,第二种是基于第三方 ...

  7. springmvc自己定义拦截器

    Spring MVC也能够使用拦截器对请求进行拦截处理,用户能够自己定义拦截器来实现特定的功能,自己定义的拦截器必须实现HandlerInterceptor接口. 直接看下样例: package co ...

  8. Mybatis利用拦截器做统一分页

    mybatis利用拦截器做统一分页 查询传递Page参数,或者传递继承Page的对象参数.拦截器查询记录之后,通过改造查询sql获取总记录数.赋值Page对象,返回. 示例项目:https://git ...

  9. Struct2_定义拦截器并使用注解方式作用在Action的方法中

    一.目的:通过在方法上加注解控制哪些方法需要登陆后才能访问   二.方式:利用拦截器判断用户是否登陆   三.实现步骤 定义配置文件struts.xml添加节点 1 2 3 4 5 6 7 8 9 1 ...

随机推荐

  1. 安装和使用php的mcrypt扩展

    程序员们在编写代码程序时,除了要保证代码的高性能之外,还有一点是非常重要的,那就是程序的安全性保障.PHP除了自带的几种加密函数外,还有功能更全面的PHP加密扩展库和. 其中,Mcrypt扩展库可以实 ...

  2. 关于js的异常

    遇到异常,通常会有两种处理办法1.处理异常 try{ //可能出现异常的代码 }catch(e){ //处理异常 } 2.抛出异常 public void getName throws Excepti ...

  3. vue2+koa2+mongodb分页

    后端 const Koa = require('koa2'); const Router = require('koa-router'); const Monk = require('monk');/ ...

  4. 通过存储过程创建SQL作业

    USE dbNameGO/****** Object: StoredProcedure [dbo].[usp_Createjob] Script Date: 03/26/2014 14:36:30 * ...

  5. TOSCA自动化测试工具--打开已存在的Projects

    1.刚login账号的界面 2.找到左下角Browse,找到文件路径,选择文件,打开 3.展示已打开的project 4.这个页面上便可进行自己想要的操作 5.关闭projects,最下面状态栏进行有 ...

  6. Http:设置 浏览器中MIME 类型

    http://www.163ns.com/zixun/post/4602.html 自定义MIME类型支持FLV的相关设置 网络空间支持FLV的相关设置其实很简单,就是自定义一个MIME类型 一般虚拟 ...

  7. 在MySQL中使用explain查询SQL的执行计划

    1.什么是MySQL执行计划 要对执行计划有个比较好的理解,需要先对MySQL的基础结构及查询基本原理有简单的了解. MySQL本身的功能架构分为三个部分,分别是 应用层.逻辑层.物理层,不只是MyS ...

  8. char、varchar与text

    总结自:https://www.cnblogs.com/mjbrian/p/6866263.html char:       定长,长度范围是0~255. 当长度不足255时,用空格来填充剩下的字符. ...

  9. 20145302张薇《Java程序设计》第十周学习总结

    20145302 <Java程序设计>第十周学习总结 客户端和服务器端功能 客户端程序功能列表: 接收用户控制台输入 判断输入内容是否合法 按照协议格式发送数据 根据服务器端的反馈给出相应 ...

  10. 20145324 Java实验五

    1.运行教材上TCP代码,结对进行,一人服务器,一人客户端: 2.利用加解密代码包,编译运行代码,一人加密,一人解密: 3.集成代码,一人加密后通过TCP发送: 注:加密使用AES或者DES/AES或 ...