1:问题的提出
MyBatis执行sql时,如果sql有参数,它的值就会在日志中打印出来,比如像这样:
==》Parameters:abc(String)
有一天领导问我,如果这个参数是私密数据,直接打印出来不太好,能不能给数据脱敏,于是我开始研究这个问题。
研究这个问题的思路有三个方向:1、阅读学习源码,先了解myBatis框架的整体架构。2、跟着代码一步一步debug,找到打印日志的地方,然后思考怎么实现我们要的功能。3、MyBatis本身是提供拦截器机制给用户的,尝试是否能借用拦截器机制实现功能。
2:问题研究
2.1 对MyBatis框架基本的了解
如果本身对MyBatis缺乏整体架构的了解就开始研究问题,很容易陷入纷乱芜杂的代码中。所以我们第一步就是对MyBatis有一个基本的认知。
MyBatis主要有以下组件:
初看这几个组件会很懵,难以形成对MyBatis基本的认识、其实MyBatis本质上就是对java的jdbc操作做了封装以简化对数据库的操作,那么myBatis的操作就免不了jdbc的痕迹,所以我们先来看jdbc是怎么操作数据库的。以下是一个jdbc操作数据库的简单例子:
//首先定义下连接数据的URL、用户名、密码
String url="jdbc:oracle:thin:@192.168.10.165:1521:oracle";
String user="oracle";
String password="oracle";
try {
//1.加载驱动,使用了反射的知识
Class.forName("oracle.jdbc.driver.OracleDriver");
/*
* 使用DriverManager获取数据库连接
* 其中返回的Connection就代表了JAVA程序和数据库的连接
* 不同数据库的URL写法需要查看驱动文档知道,用户名、密码由DBA分配
*/
Connection conn=DriverManager.getConnection(url, user, password);
//使用Connection来创建一个Statemen