栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

jdbc ResultSetMetaData获取tableName问题

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

jdbc ResultSetMetaData获取tableName问题

1.问题

       有一个项目客户提出对已上线项目,不改代码的情况下,并且只能提供是jdbc连接与数据库mysql、oracle两种。对客户的需求做了大量的技术调研,mysql jdbc驱动可以使用自定义拦截器实现,但是oracle jdbc驱动没有这个。后来考虑使用java字节码增强形式对jdbc返回结果做拦截脱敏。但是在脱敏的过程当中发现oracle jdbc驱动执行完的sql ResultSet获取ResultSetMetaData中的getTableName方法获取的表名为空。

2.寻找解决方法

       因为制定的脱敏规则设置某个表某个字段按照某种规则脱敏。但是现在oracle jdbc驱动无法获取TableName。

经过查oracle官方发现:

 

 可以这么设置(注意:这里只举个例子,其他属性没加)

 Properties info = new Properties();
        info.setProperty("ResultSetMetaDataOptions","1");
        jdbcHandler = JdbcHandler.newJdbcHandler(url, info);

但是设置完依然获取不到TableName。

无奈去翻oracle ojdbc源码发现

发现源码未实现。 

最后想用实际项目postgres做测试发现增强后查询数据库死循环,翻看源码:

pg查询表名是去再次用sql查询数据库,因为增强的返回结果方法查询表名触发继续去查表名就成了死循环。 

最终无奈oracle、postgres只能根据列别名脱敏,无法知道表放弃。mysql可以获取表名、原始表列名、列别名、用户名、数据库名,完全按照这些制定规则脱敏。这篇文章是提醒大家避免入坑,解决方法还在继续探索中。。。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1032061.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号