mybatis定义拦截器
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定义拦截器的更多相关文章
- Mybatis Interceptor 拦截器原理 源码分析
Mybatis采用责任链模式,通过动态代理组织多个拦截器(插件),通过这些拦截器可以改变Mybatis的默认行为(诸如SQL重写之类的),由于插件会深入到Mybatis的核心,因此在编写自己的插件前最 ...
- mybatis Interceptor拦截器代码详解
mybatis官方定义:MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis ...
- struts2学习笔记(5)---自己定义拦截器
什么是拦截器? struts2中拦截器分为Struts2定义好的拦截器和自己定义的拦截器. 其作用是在一个Action运行之前进行拦截,在Action运行之后又增加某些操作. 实现原理 当请求一个Ac ...
- Struts2通过自己定义拦截器实现登录之后跳转到原页面
这个功能对用户体验来说是非常重要的.实现起来事实上非常easy. 拦截器的代码例如以下: package go.derek.advice; import go.derek.entity.User; i ...
- jquery.ajax与axios及定义拦截器
首先导入jquery和axios包 jquery.ajax function reg(){ var username = $("#username").val(); var pas ...
- Mybatis之拦截器原理(jdk动态代理优化版本)
在介绍Mybatis拦截器代码之前,我们先研究下jdk自带的动态代理及优化 其实动态代理也是一种设计模式...优于静态代理,同时动态代理我知道的有两种,一种是面向接口的jdk的代理,第二种是基于第三方 ...
- springmvc自己定义拦截器
Spring MVC也能够使用拦截器对请求进行拦截处理,用户能够自己定义拦截器来实现特定的功能,自己定义的拦截器必须实现HandlerInterceptor接口. 直接看下样例: package co ...
- Mybatis利用拦截器做统一分页
mybatis利用拦截器做统一分页 查询传递Page参数,或者传递继承Page的对象参数.拦截器查询记录之后,通过改造查询sql获取总记录数.赋值Page对象,返回. 示例项目:https://git ...
- Struct2_定义拦截器并使用注解方式作用在Action的方法中
一.目的:通过在方法上加注解控制哪些方法需要登陆后才能访问 二.方式:利用拦截器判断用户是否登陆 三.实现步骤 定义配置文件struts.xml添加节点 1 2 3 4 5 6 7 8 9 1 ...
随机推荐
- Linux-chmod_命令的详细用法讲解
Linux chmod 命令 chmod用于改变文件或目录的访问权限.用户用它控制文件或目录的访问权限.该命令有两种用法.一种是包含 字母和操作符表达式的文字设定法:另一种是包含数字的数字设定法. 1 ...
- tomcat进程意外退出的问题分析(转)
原文链接:http://hongjiang.info/why-kill-2-cannot-stop-tomcat/ 节前某个部门的测试环境反馈tomcat会意外退出,我们到实际环境排查后发现不是jvm ...
- 【Linux学习】3.Linux常见配置文件
一./etc 配置文件/etc/passwd 用户数据库,其中的域给出了用户名.真实姓名.家目录.加密口令和用户的其他信息 /etc/group 类似/etc/passwd ,但说明的不是用户而是组. ...
- OpenCV KNN 之 使用方法
http://blog.csdn.net/WL2002200/article/details/43149229 OpenCV 中KNN构造函数如下. C++: CvKNearest::CvKNeare ...
- awk二十问-【AWK学习之旅】
---===AWK学习之旅===--- 一行命令: 1.打印输入每行的字段总数: 最后一行的字段总数:END{print NF} 每行都显示字段总数: {print NF} 2.打印指定行: aw ...
- 20145312 《Java程序设计》第四周学习总结
20145312 <Java程序设计>第四周学习总结 学习笔记 Chapter 6 6.1何为继承 1.定义:面向对象中子类继承父类,避免重复的行为定义. 6.1.1 继承共同行为 1.以 ...
- [参考]C的scanf 和 C++的fscanf 的用法
说明:本文不适合新手学习,适合用来做参考.本文参考有其他博客的内容,不过年代久远已经忘记了,在此感谢各位博主! scanf函数 用 法:int scanf(char *format[,argument ...
- Forcing restore from package sources
https://docs.microsoft.com/en-us/nuget/consume-packages/package-restore#forcing-restore-from-package ...
- MongoTemplate WriteResult acknowledged=false 的问题
今天使用 MongoTemplate 的 update 操作时,发现 WriteResult 的 acknowledged 一直为 false ,个人首先想到可能时java驱动版本不对,在更换好对应版 ...
- 解决node-sass安装不了的问题
1.下载https://github.com/sass/node-sass-binaries/blob/master/win32-x64-48_binding.node到E:\primeng\lib目 ...