DataScopeInterceptor.java 4.17 KB
   1
   2
   3
   4
   5
   6
   7
   8
   9
  10
  11
  12
  13
  14
  15
  16
  17
  18
  19
  20
  21
  22
  23
  24
  25
  26
  27
  28
  29
  30
  31
  32
  33
  34
  35
  36
  37
  38
  39
  40
  41
  42
  43
  44
  45
  46
  47
  48
  49
  50
  51
  52
  53
  54
  55
  56
  57
  58
  59
  60
  61
  62
  63
  64
  65
  66
  67
  68
  69
  70
  71
  72
  73
  74
  75
  76
  77
  78
  79
  80
  81
  82
  83
  84
  85
  86
  87
  88
  89
  90
  91
  92
  93
  94
  95
  96
  97
  98
  99
 100
 101
 102
 103
 104
 105
 106
 107
 108
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);

}
}