for循环执行 mybatis_Mybatis插件开发(1) - 数据脱敏

本文介绍了如何开发一个Mybatis插件,用于数据脱敏。详细阐述了项目结构、Maven配置、数据库及Mybatis配置、Log4j2配置、Domain层和DAO层开发。重点在于Mybatis拦截器的实现,该拦截器在查询后对结果进行处理,对带有自定义注解的敏感属性进行隐藏,最后展示了运行效果和拦截器生效的证据。
摘要由CSDN通过智能技术生成

1.项目结构

开发工具:IDEA + Maven

d9b1cc71fb51a9ddcbbcf33ad288fa94.png

2.配置

2.1.Maven配置

pom.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>        mybatis-configuration-plugins        org.poiuy1.0-SNAPSHOT4.0.0    mybatis-configuration-plugins-sensiticedata    1414mysql            mysql-connector-java            8.0.22org.mybatis            mybatis            3.5.6org.apache.logging.log4j            log4j-core            2.12.1

2.2.DB配置

db.properties配置文件

db.driver = com.mysql.cj.jdbc.Driverdb.url = jdbc:mysql://192.168.245.128:9906/poiuy_studydb.username = rootdb.password = xxx

2.3.Mybatis配置

mybatis_config.xml配置文件,配置中除了以往的properties、environments和mapper配置外,增加了plugins配置,UserDataInterceptor是自定义拦截器

<?xml version="1.0" encoding="UTF-8"?>

2.4.Log4j2配置

log4j2.xml配置文件

<?xml version="1.0" encoding="UTF-8" ?>

3.Domian层开发

MybatisUser类对应数据库中的表,此处省略get、set方法

package org.poiuy.mybatis.config.plugins.domain;import org.poiuy.mybatis.config.plugins.util.anno.UserData;import java.time.LocalDate;/** * @author Poiuy * @Description */public class MybatisUser {    private int id;    private String username;    @UserData    private String secure;    private int age;    private LocalDate brith;    @UserData    private String email;  ...    @Override    public String toString() {        return "MybatisUser{" +                "id=" + id +                ", username='" + username + ''' +                ", secure='" + secure + ''' +                ", age=" + age +                ", brith=" + brith +                ", email='" + email + ''' +                '}';    }}

其中使用了自定义注解@UserData

package org.poiuy.mybatis.config.plugins.util.anno;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * @author Poiuy * @Description */@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface UserData {}

4.DAO层开发

Mapper接口类,只有一个查询方法

package org.poiuy.mybatis.config.plugins.mapper;import org.poiuy.mybatis.config.plugins.domain.MybatisUser;/*** @author Poiuy* @Description*/public interface MybatisUserMapper {public MybatisUser selectByName(String name);}

Mapper配置文件

<?xml version="1.0" encoding="UTF-8"?>   SELECT * FROM mybatis_user WHERE username = #{username}

5.Mybatis插件开发

自定义Mybatis拦截器,该拦截器的功能是对查询结构的数据中的敏感数据进行处理

拦截其拦截的对象是Executor,方法是查询方法query。在Mybatis执行该方法获得结果之后,对结果进行二次处理

在处理过程中,判断结果的属性上是否有自定义注解,如果有则将该属性的值隐藏

package org.poiuy.mybatis.config.plugins.util.mybatis;import org.apache.ibatis.executor.Executor;import org.apache.ibatis.mapping.MappedStatement;import org.apache.ibatis.plugin.*;import org.apache.ibatis.session.ResultHandler;import org.apache.ibatis.session.RowBounds;import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;import org.poiuy.mybatis.config.plugins.util.anno.UserData;import java.lang.reflect.Field;import java.util.List;import java.util.Properties;/** * @author Poiuy * @Description 对查询的数据中的brith字段进行处理,处理逻辑可以另行封装,此处只做简单处理 */@Intercepts(@Signature(type = Executor.class,method = "query",args = {MappedStatement.class,Object.class, RowBounds.class, ResultHandler.class}))public class UserDataInterceptor implements Interceptor {    private static final Logger logger = LogManager.getLogger(UserDataInterceptor.class);    private boolean open = false;    @Override    public Object intercept(Invocation invocation) throws Throwable {        //执行Executor的query方法获取数据        Object result = invocation.proceed();        logger.trace("Interceptor open is :" + open );        if(open){            if(result == null){                return null;            }            if(result instanceof List){                return processList((List)result);            }            return process(result);        }        return result;    }    private List processList(List result) {        if(result.isEmpty()){            return result;        }        for(Object obj : result){            process(obj);        }        return result;    }    private Object process(Object result) {        Class> clazz = result.getClass();        Field[] declaredFields = clazz.getDeclaredFields();        if(declaredFields.length == 0){            return result;        }        for(Field field : declaredFields){            try {                field.setAccessible(true);                if(field.getAnnotation(UserData.class) != null){                    field.set(result,"******");                }            } catch (IllegalAccessException e) {                e.printStackTrace();            }        }        return result;    }    @Override    public Object plugin(Object target) {        return Plugin.wrap(target,this);    }    @Override    public void setProperties(Properties properties) {        String open = properties.get("open").toString();        this.open = Boolean.valueOf(open);    }}

6.运行结果

在Application中执行简单的查询,通过查询结果看是否达到了预期的效果

package org.poiuy.mybatis.config.plugins;import org.apache.ibatis.builder.xml.XMLConfigBuilder;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;import org.poiuy.mybatis.config.plugins.domain.MybatisUser;import org.poiuy.mybatis.config.plugins.mapper.MybatisUserMapper;import java.io.IOException;import java.io.InputStream;/** * @author Poiuy * @Description */public class Application {    private static final Logger logger = LogManager.getLogger(Application.class);    public static void main(String[] args) {        SqlSession sqlSession = null;        try {            InputStream config = Resources.getResourceAsStream("mybatis/mybatis_config.xml");            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(config);            sqlSession = factory.openSession();            MybatisUserMapper mybatisUserMapper = sqlSession.getMapper(MybatisUserMapper.class);            MybatisUser mybatisUser = mybatisUserMapper.selectByName("张四");            logger.trace(mybatisUser);        } catch (IOException e) {            e.printStackTrace();        } finally {            if(sqlSession != null){                sqlSession.close();            }        }    }}

通过日志可以看到,数据库中查询出来的是正常的数据,而Domain类属性上有自定义注解的属性却变成了******,说明拦截器已经生效

c0133ffe364891d5746a1e1be5b8c389.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值