【问题标题】:Can I amend the executed SQL before execution using an AspectJ pointcut我可以使用 AspectJ 切入点在执行之前修改执行的 SQL
【发布时间】:2011-07-11 19:20:41
【问题描述】:

我正在尝试向使用 AspectJ 的系统中执行的所有 SQL 添加特定的 SQL。

我以前没有使用过 AspectJ,但我相信我需要做的是在

上创建一个切入点

调用(PreparedStatement Connection.prepareStatement(String))

并提供建议

之前(连接 con,字符串 sql): 调用(PreparedStatement Connection.prepareStatement(字符串)) && 目标(con) && 参数(sql){ sql = "执行 myStordProc();" + sql; }

在这之后 Connection.prepareStatement() 方法将继续使用更改后的字符串?

或者我应该拦截对 prepareStatement 和 executeQuery 的调用并创建一条建议,将其更改为 addBatch() 添加我存储的过程调用作为第一批 sql,然后最终使用 executeBatch() 执行原始 sql?

任何指针将不胜感激。

谢谢

【问题讨论】:

  • 乔,我认为这样做是有可能的,但看起来非常可怕。我强烈建议您尝试寻找另一种解决方案。问问自己为什么?还有什么...?
  • @Augusto 它看起来确实很吓人,我考虑的另一个选择是创建一个实现 java.sql.Connection 的包装器/类并将 java.sql.Connection 的实例重构到包装器,但我有点担心关于重构那么多事件。

标签: java sql-server aspectj pointcuts


【解决方案1】:

如果你想修改一个参数值,你需要在通知周围使用,以便你可以使用修改后的值进行调用:

around(...): ... {
    proceed("exec myStordProc();" + sql);
}

【讨论】:

  • 谢谢,我打算试试看:public aspect AuditAspect { pointcut prepareStatement(String sql): call(PreparedStatement Connection.prepareStatement(..)) && args(sql); Object around(String sql): prepareStatement(sql) { return proceed("exec dbo.AuditDatabase_SetSessionInfo" + sql); } }
猜你喜欢
  • 2023-04-02
  • 1970-01-01
  • 2017-06-26
  • 2011-12-09
  • 1970-01-01
  • 1970-01-01
  • 2016-09-14
  • 1970-01-01
  • 2021-03-08
相关资源
最近更新 更多