换种方式,打印 MyBatis 执行 SQL 语句!( 二 )


  • 拦截方法入参是一种可配置操作 , 比如 @This Object obj 是为了获取当前类的执行对象 , @Origin Method method 是为了获取执行方法 。
  • 在 finally 块中 , 我们可以通过反射拿到当前类的属性信息 , 以及反射拿到执行的 SQL , 并做打印输出 。
2.3 编译打包 
在测试和开发 IDEA Plugin 插件之前 , 我们需要先进行一个打包操作 , 这个打包就是把字节码增强的代码打包整一个 Jar 包 。在 build.gradle -> shadowJar
换种方式,打印 MyBatis 执行 SQL 语句!

文章插图
 
 
  • 打包编译后 , 就可以在 build -> libs 下看到 jar:probe-agent-1.0-SNAPSHOT-all.jar 这个 Jar 就是用来做字节码增强处理的 。
2.4 测试验证 
这里在把写好的字节码增强组件给插件使用之前 , 可以做一个测试验证 , 避免每次都需要启动插件才能做测试 。
单元测试
public class ApiTest { public static void main(String[] args) throws Exception { String URL = "jdbc:mysql://127.0.0.1:3306/itstack?characterEncoding=utf-8"; String USER = "root"; String PASSword = "123456"; Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection(URL, USER, PASSWORD); String sql="SELECT * FROM USER WHERE id = ? AND name = ?"; PreparedStatement statement = conn.prepareStatement(sql); statement.setLong(1,1L); statement.setString(2,"谢飞机"); ResultSet rs = statement.executeQuery(); while (rs.next()) { System.out.println(rs.getString("name") + " " + rs.getString("address")); } } }
  • VM options:-javaagent:你的路径libsprobe-agent-1.0-SNAPSHOT-all.jar
  • 注意在测试运行的时候 , 你要给 ApiTest 配置 VM options 才能打印拦截 SQL 信息
 
测试结果
原始SQL: SELECT * FROM USER WHERE id = ? AND name = ? 替换SQL: SELECT * FROM USER WHERE id = 1 AND name = '谢飞机' 谢飞机 北京.大兴区.通明湖公园
  • 好啦 , 这样我们就可以拦截可以复制执行的 SQL 语句了 , 接下来我们再做下 IDEA Plugin 的处理 。
3. 通过插件开发引入探针 Jar 
接下来我们要把开发好的字节码增强 Jar 包 , 复制到 IDEA Plugin 插件开发模块中的 libs(可自己创建) 下 , 之后在 plugin.xml 配置加载 implementation fileTree(dir: 'libs', includes: ['*jar']) 这样就可以程序中 , 找到这个 jar 包并配置到程序中 。
3.1 复制 jar 到 libs 下
换种方式,打印 MyBatis 执行 SQL 语句!

文章插图
 
3.2 build.gradle 配置加载 dependencies { implementation fileTree(dir: 'libs', includes: ['*jar']) }
  • 通过 implementation fileTree 引入加载文件树的方式 , 把我们配置好的 Jar 加载到程序运行中 。
3.3 程序中引入 javaagent 
cn.bugstack.guide.idea.plugin.PerRun
public class PerRun extends JavaProgramPatcher { @Override public void patchJavaParameters(Executor executor, RunProfile configuration, JavaParameters javaParameters) { RunConfiguration runconfiguration = (RunConfiguration) configuration; ParametersList vmParametersList = javaParameters.getVMParametersList(); vmParametersList.addParametersString("-javaagent:" + agentCoreJarPath); vmParametersList.addNotEmptyProperty("guide-idea-plugin-probe.projectId", runConfiguration.getProject().getLocationHash()); } }
  • 通过继承 JavaProgramPatcher 类 , 实现 patchJavaParameters 方法 , 通过 configuration 属性来配置我们自己需要被加载的 -javaagent 包 。
  • 这样在通过 IDEA 已经安装此插件 , 运行代码的时候 , 就会执行到这个拦截和打印 SQL 的功能 。
3.4 plugin.xml 添加配置
  • 之后你还需要把开发好的加载类 , 配置到 java.programPatcher 这样就可以程序运行的时候 , 被加载到了 。
四、测试验证
  • 准备好一个有数据库操作的工程 , 需要的是 JDBC , 如果是其他的 , 你需要自己扩展
  • 启动插件后 , 打开你的工程 , 运行单元测试 , 查看打印区
 
启动插件
换种方式,打印 MyBatis 执行 SQL 语句!


推荐阅读