如何从prepareCall方法中获取自定义CallableStatement对象

时间:2010-09-01 18:49:24

标签: java mysql jdbc subclassing

我想创建一个扩展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()方法。

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

1 个答案:

答案 0 :(得分:4)

如果你有一个可管理的地方需要这样做,我建议一个简单的方法(比试图让数据库驱动程序返回你的自定义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();