【问题标题】:How can I get a custom CallableStatement object out of a prepareCall method如何从 prepareCall 方法中获取自定义 CallableStatement 对象
【发布时间】:2010-09-01 18:49:23
【问题描述】:

我想创建一个扩展 CallableStatement 对象的子类。我想这样做,以便我可以覆盖 execute 和 executeQuery 方法来跟踪每个 SP 调用的一些指标。

目前我的代码如下所示:

Connection db = poolingDataSource.getConnection();
CallableStatement cstmt = db.prepareCall("{call pSampleStoredProc()}");
ResultSet rs = cstmt.executeQuery();

其中 poolingDataSource 来自 apache commons dbcp 包。我的实现使用 JDBC 连接到 MySQL 数据库。

目前,prepareCall 方法返回一个 com.mysql.jdbc.JDBC4CallableStatement。我希望能够对此进行更改,以便它返回我自己的类,该类扩展了 JDBC4CallableStatement 但覆盖了 execute() 和 executeQuery() 方法。

关于最佳方式的任何想法?

【问题讨论】:

    标签: java mysql jdbc subclassing


    【解决方案1】:

    如果你有很多地方需要这样做,我建议一个简单的方法(比试图让数据库驱动程序返回你的自定义 CallableStatement 对象更容易)是制作一个包装器或装饰器包裹从 db 获得的 CallableStatement 对象。基本上创建一个实现 CallableStatement 的所有方法的类,将 CallableStatement 对象作为其构造函数的参数,并将所有方法调用委托给另一个对象,但对于 execute() 和 executeQuery() 你也在委派给其他对象 execute() 方法之前和之后调用您的日志记录方法。

    当然还有其他方法可以做到这一点,这让我觉得更容易。

    Connection db = poolingDataSource.getConnection();
    CallableStatement cstmt = db.prepareCall("{call pSampleStoredProc()}");
    MyCallableStatement mystmt = new MyCallableStatement( cstmt );
    ResultSet rs = mystmt.executeQuery();
    

    【讨论】:

    • CallableStatement mystmt = new MyCallableStatement( cstmt );。实际上,您也可以将 Connection 包装起来。
    • 这是个好主意,虽然没有我希望的那么优雅。 :-) Tom,您的评论让我了解了如何以更可重用的方式执行此操作,以便团队中的其他程序员不必记住使用 MyCallableStatement。除非其他人能想出更优雅的解决方案,否则就是这样。
    • @tackline 如果目标是封装,那么我会包装整个事情(DataSourceConnectionCallableStatement)。因此,对于客户端代码,它绝对是透明的。
    • 我发现在我自己的一些通用实用程序方法中包装我获得连接的代码非常有帮助,这样如果/当我需要返回并更改某些内容或添加某些内容时(如日志记录)然后我可以在该实用程序方法中做任何我需要做的事情,而不是更改应用程序中获得数据库连接的每一段代码。这将是一个很好的例子。 :)
    • 我最终创建了一个装饰连接对象,该对象返回一个装饰的 CallableStatement。由于我的连接创建过程是在通用代码中(在我上面给出的示例中没有表示),这提供了一种理想的方式来创建这些装饰对象,只需最少的代码更改(并且新代码应该在没有甚至考虑一下。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    • 2012-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多