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 ...
随机推荐
- SQL Server返回插入数据的ID和受影响的行数
首先看看数据库里面的数据(S_Id为自增长标识列): sql server 中返回上一次插入数据的ID(标识值)有三种方式: 第一种 @@IDENTITY: insert into Student(S ...
- windows 下安装 rabbitmq报init terminating in do_boot错误
好长时间没有写东西了,记一个安装笔记吧. 目前市面上比较常用的几个消息中间件,rabbitmq算是风评比较好的,所以就拿来安装一下玩玩喽(很有可能也仅限于是安装一下....)安装过程不表,无非是下载E ...
- 论文笔记:CNN经典结构1(AlexNet,ZFNet,OverFeat,VGG,GoogleNet,ResNet)
前言 本文主要介绍2012-2015年的一些经典CNN结构,从AlexNet,ZFNet,OverFeat到VGG,GoogleNetv1-v4,ResNetv1-v2. 在论文笔记:CNN经典结构2 ...
- python的socket网络编程(二)
(注:本文部分内容摘自互联网,由于作者水平有限,不足之处,还望留言指正.) 国庆八天假,已过去3天了,加上明天又是中秋,还是决定在今晚把之前想写的东西写完.国庆节在宁波老家,吃好喝好睡好,就是没有好好 ...
- MVC的局部视图传参的小技巧--见人才网头部导航
当我们设计一个局部视图时,当出现有类似导航的功能(如:选择左边的某个按钮跳到某个页,且顶部导航也作相印改变),如果我们选择把导航作为局部视图来处理,调用就可以做如下处理: @Html.RenderAc ...
- platform_device和platform_driver的注册过程,及probe函数何时调用的分析 ⭐⭐⭐
add platform_device之后,需要注意的一个地方是这里,add是通过系统初始化里边调用platform_add_devices把所有放置在板级platform_device数组中的所有 ...
- Leetcode(93): Restore IP Addresses
Given a string containing only digits, restore it by returning all possible valid IP address combina ...
- 一文弄懂神经网络中的反向传播法——BackPropagation【转】
本文转载自:https://www.cnblogs.com/charlotte77/p/5629865.html 一文弄懂神经网络中的反向传播法——BackPropagation 最近在看深度学习 ...
- linux中__weak关键字的作用
答:1.可以重新定义同名函数或变量而编译时不报错
- openwrt设置uboot环境变量在flash上的存储地址
1.分析如下 ubootenv_add_app_config ubootenv_add_uci_config "/dev/mtd1" "0x40000" &qu ...