gpt4 book ai didi

java - 拦截Java中的所有数据库调用

转载 作者:行者123 更新时间:2023-12-04 01:45:51 25 4
gpt4 key购买 nike

我想在我的数据库中拦截插入查询并想更改它的插入值

例如,如果用户在数据库中插入一个值name = amitrai,我想将值从amitrai 更改为 < strong>&^&WQWSAKJSJA 然后存储。

总体而言,我希望拦截在 JDBC 连接中执行查询。

最佳答案

在数据库中使用触发器执行。

在我看来,实现这一点的最佳方法是直接在数据库中使用触发器。这正是它们的用途。他们将保证每个尝试插入/更新/合并 user.name 值的客户端都将通过此逻辑。其他一些不知道您的客户端拦截的开发人员不会有聪明的 Perl 脚本。

您在评论中提到的所有数据库产品都支持触发器。当然,缺点是您必须在想要支持的方言中重复您的编码/哈希逻辑。

在客户端执行,使用 JDBC 代理

如果出于某种原因必须在客户端中实现此逻辑,那么 JDBC 是一个很好的层来执行此操作。当然,您可以在更高层(例如,在 Hibernate 中)实现它,但话又说回来,您将冒一些 Java 客户端逻辑绕过这种编码的风险。

在JDBC层,你至少可以“合理地”保证每个Java客户端都会执行这个逻辑。

解决这个问题的一种方法是使用类似 jOOQ 的各种连接代理,包括 MockConnection ,它允许使用单一方法(有一些限制)拦截大多数 JDBC 调用,ParsingConnection ,它允许解析传递给 JDBC 的 SQL 字符串,然后进行转换。如果你想产生新的 SQL 逻辑,你会使用 VisitListener将 SQL 转换为其他内容。在你的例子中,你只是替换了一个绑定(bind)变量,所以你可以更容易地做到这一点。

免责声明:我为 jOOQ 背后的公司工作。可能还有其他支持类似行为的解决方案,其本质是代理(其他人为此提到了 p6spy)和解析,以确保您只替换您实际想要替换的值。与 jOOQ 一样,此类解决方案不应该强制您在客户端逻辑中实际使用 jOOQ,而是拦截您在 JDBC 层上执行的任何类型的 SQL。

忠告

虽然上述在某种程度上是可能的,但它可能很复杂,并且您可能仍然忽略了一些事情(例如 MERGE 语句,或 INSERT .. ON DUPLICATE KEY UPDATE 语句等)。触发器是解决此问题的最佳方法。

关于java - 拦截Java中的所有数据库调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58927766/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com