- 在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>
- 书写拦截器
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 ;
}
}