package com.lyms.talkonlineweb.config;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.baomidou.mybatisplus.core.toolkit.PluginUtils;
import com.baomidou.mybatisplus.extension.handlers.AbstractSqlParserHandler;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlCommandType;
import org.apache.ibatis.plugin.*;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.SystemMetaObject;
import org.springframework.stereotype.Component;
import javax.sql.DataSource;
import java.sql.Connection;
import java.util.Date;
import java.util.Properties;
//mybatis 自定义拦截器
@Slf4j
@AllArgsConstructor
@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})})
@Component
public class DataScopeInterceptor extends AbstractSqlParserHandler implements Interceptor, MetaObjectHandler {
private DataSource dataSource;
@Override
public Object intercept(Invocation invocation) throws Throwable {
StatementHandler statementHandler = PluginUtils.realTarget(invocation.getTarget());
MetaObject metaObject = SystemMetaObject.forObject(statementHandler);
this.sqlParser(metaObject);
// 先判断是不是SELECT操作 不是直接过滤
MappedStatement mappedStatement = (MappedStatement) metaObject.getValue("delegate.mappedStatement");
if (!SqlCommandType.SELECT.equals(mappedStatement.getSqlCommandType())) {
return invocation.proceed();
}
if (SqlCommandType.INSERT.equals(mappedStatement.getSqlCommandType())) {
System.out.println("新增。。。。。。。。。。。。。。。。。。。。。。。。");
return invocation.proceed();
}
if (SqlCommandType.UPDATE.equals(mappedStatement.getSqlCommandType())) {
System.out.println("修改。。。。。。。。。。。。。。。。。。。。。。。。");
return invocation.proceed();
}
if (SqlCommandType.DELETE.equals(mappedStatement.getSqlCommandType())) {
System.out.println("删除。。。。。。。。。。。。。。。。。。。。。。。。");
return invocation.proceed();
}
// BoundSql boundSql = (BoundSql) metaObject.getValue("delegate.boundSql");
// // 执行的SQL语句
// String originalSql = boundSql.getSql();
// // SQL语句的参数
// Object parameterObject = boundSql.getParameterObject();
//
// originalSql = "select * from (" + originalSql + ") temp_data_scope where temp_data_scope." + 1 + " in (" + 2 + ")";
// metaObject.setValue("delegate.boundSql.sql", originalSql);
return invocation.proceed();
}
/**
* 生成拦截对象的代理
*
* @param target 目标对象
* @return 代理对象
*/
@Override
public Object plugin(Object target) {
if (target instanceof StatementHandler) {
return Plugin.wrap(target, this);
}
return target;
}
/**
* mybatis配置的属性
*
* @param properties mybatis配置的属性
*/
@Override
public void setProperties(Properties properties) {
}
/**
* 注解形式新增时给属性赋值
* @param metaObject
*/
@Override
public void insertFill(MetaObject metaObject) {
//新增时对类属性”createdtime“字段赋值,在属性上面加@TableField(value = "createdtime" ,fill = FieldFill.INSERT)主要是fill起作用
this.setInsertFieldValByName("createdtime", new Date(), metaObject);
}
/**
* 注解形式修改时给属性赋值
* @param metaObject
*/
@Override
public void updateFill(MetaObject metaObject) {
//新增时对类属性”updatedTime“字段更新,在属性上面加@TableField(value = "updated_time" ,fill = FieldFill.UPDATE)主要是fill起作用
this.setInsertFieldValByName("updatedtime", new Date(), metaObject);
}
}