Mybatis的拦截器配置

本文介绍了如何在Spring配置文件中设置Mybatis的拦截器,以实现自动填充创建时间和用户信息的功能。具体配置包括在SqlSessionFactoryBean中添加拦截器插件,并在拦截器类中判断SQL操作类型,针对新增和更新操作填充相应字段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 在spring的配置文件中配置

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

<property name="dataSource" ref="dataSource" />

<property name="configLocation" value="classpath:mybatis.xml" />

<!--多个可用,或;或空格分开 -->

<property name="typeAliasesPackage" value="com.tf.tadmin.entity"></property>

 

<property name="plugins">

<array>

<bean class="com.tf.tadmin.interceptor.AutoFillInterceptor">

<property name="properties">

<props>

<prop key="createTime">create_time</prop>

<prop key="createUser">create_user</prop>

<prop key="updateTime">update_time</prop>

<prop key="updateUser">update_user</prop>

</props>

</property>

</bean>

</array>

</property>

</bean>

  1. 书写拦截器

package com.tf.tadmin.interceptor;

 

import java.beans.PropertyDescriptor;

import java.util.Date;

import java.util.Properties;

 

 

import org.apache.ibatis.executor.Executor;

import org.apache.ibatis.mapping.MappedStatement;

import org.apache.ibatis.mapping.SqlCommandType;

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.slf4j.LoggerFactory;

 

import com.tf.tadmin.entity.Entity;

import com.tf.tadmin.entity.SessionUser;

import com.tf.tadmin.shiro.ShiroUtils;

import com.tf.tadmin.utils.DateUtils;

 

 

/**

 *

 * 主要为新增与修改时填写新增时间,人及修改时间,人

 *

 * @author mo.xf

 *

 * @since 1.0

 *

 */

@Intercepts({

@Signature(type = Executor.class, method = "update", args = { MappedStatement.class, Object.class })

})

public class AutoFillInterceptor implements Interceptor {

private static org.slf4j.Logger logger = LoggerFactory.getLogger(AutoFillInterceptor.class) ;

 

private Properties properties ;

 

public Object intercept(Invocation invocation) throws Throwable {

String methodName = invocation.getMethod().getName();  

MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];

String sqlId = mappedStatement.getId();  

 String namespace = sqlId.substring(0, sqlId.indexOf('.'));  

      Executor exe = (Executor) invocation.getTarget();  

SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType() ;

logger.debug("sqlCommandType:" + sqlCommandType) ;

//判断是否新增与更新

if(sqlCommandType.equals(SqlCommandType.INSERT) || sqlCommandType.equals(SqlCommandType.UPDATE)){

if(invocation.getArgs().length > 1){

Object parameter = invocation.getArgs()[1];

logger.debug("parameter type:" + parameter.getClass().getName()) ;

if(parameter instanceof Entity){

Entity entity = (Entity)parameter ;

String userid = "";

try{

 

SessionUser sessionUser = ShiroUtils.getSessionUser() ;

if(sessionUser != null){

userid = sessionUser.getName() ;

}

}catch(Exception e){

//e.printStackTrace() ;

logger.debug("Get userid exception:{}" ,e) ;

}

logger.debug("userid:" + userid ) ;

 

PropertyDescriptor createTime = new PropertyDescriptor((String)properties.get("createTime") , Entity.class);

PropertyDescriptor createUser = new PropertyDescriptor((String)properties.get("createUser") , Entity.class);

PropertyDescriptor updateTime = new PropertyDescriptor((String)properties.get("updateTime") , Entity.class);

PropertyDescriptor updateUser = new PropertyDescriptor((String)properties.get("updateUser") , Entity.class);

 

if(sqlCommandType.equals(SqlCommandType.INSERT)){

createTime.getWriteMethod().invoke(entity, DateUtils.formatDateTime(new Date())) ;

createUser.getWriteMethod().invoke(entity, userid) ;

 

updateTime.getWriteMethod().invoke(entity, DateUtils.formatDateTime(new Date())) ;

updateUser.getWriteMethod().invoke(entity, userid) ;

}else if(sqlCommandType.equals(SqlCommandType.UPDATE)){

updateTime.getWriteMethod().invoke(entity, DateUtils.formatDateTime(new Date())) ;

updateUser.getWriteMethod().invoke(entity, userid) ;

}

}

}

}

 

return invocation.proceed();

}

 

public Object plugin(Object target) {

return Plugin.wrap(target, this);

}

public void setProperties(Properties properties) {

this.properties = properties ;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值