Java 如何从prepareCall方法中获取自定义CallableStatement对象
我想创建一个扩展CallableStatement对象的子类。我希望这样做,以便可以重写execute和executeQuery方法,以跟踪每个SP调用的一些指标 目前我有如下代码:Java 如何从prepareCall方法中获取自定义CallableStatement对象,java,mysql,jdbc,subclassing,Java,Mysql,Jdbc,Subclassing,我想创建一个扩展CallableStatement对象的子类。我希望这样做,以便可以重写execute和executeQuery方法,以跟踪每个SP调用的一些指标 目前我有如下代码: Connection db = poolingDataSource.getConnection(); CallableStatement cstmt = db.prepareCall("{call pSampleStoredProc()}"); ResultSet rs = cstmt.executeQuery()
Connection db = poolingDataSource.getConnection();
CallableStatement cstmt = db.prepareCall("{call pSampleStoredProc()}");
ResultSet rs = cstmt.executeQuery();
其中PooligDataSource来自apache commons dbcp包。我的实现使用JDBC连接到MySQL数据库中
目前,prepareCall方法返回com.mysql.jdbc.JDBC4CallableStatement。我希望能够更改它,以便它返回我自己的类,该类扩展JDBC4CallableStatement,但重写execute()和executeQuery()方法
关于最好的方法有什么想法吗?如果有很多地方需要这样做,我建议一个简单的方法(比试图让数据库驱动程序返回自定义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对象更容易)是制作一个包装器或装饰器来包装从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=新的MyCallableStatement(cstmt)代码>。实际上,您也可以包装连接。这是一个好主意,尽管不像我希望的那样优雅。:-)Tom,你的评论让我想到了如何以一种更可重用的方式来实现这一点,这样团队中的其他程序员就不必记得使用MyCallableStatement了。除非其他人能想出一个更优雅的解决方案,否则就是这样。@tackline如果目标是封装,那么我会将整个事情包装起来(DataSource
,Connection
,CallableStatement
)。因此,对于客户端代码来说,这将是绝对透明的。我发现将代码封装在我自己的某个通用实用程序方法中,这样当我需要返回并更改某些内容或添加某些内容(如日志记录)时,它将非常有帮助然后我就可以在这个实用方法中做我需要做的任何事情,而不是改变应用程序中获得db连接的每一段代码。这将是一个很好的例子。:)我最终创建了一个装饰连接对象,它返回一个装饰的CallableStatement。由于我的连接创建过程是在公共代码中进行的(在我上面给出的示例中没有表示),因此这是一种理想的方法,可以用最少的代码更改来创建这些装饰对象(新代码应该在不考虑这些更改的情况下获取这些更改)。CallableStatement mystmt=new MyCallableStatement(cstmt)代码>。实际上,您也可以包装连接。这是一个好主意,尽管不像我希望的那样优雅。:-)Tom,你的评论让我想到了如何以一种更可重用的方式来实现这一点,这样团队中的其他程序员就不必记得使用MyCallableStatement了。除非其他人能想出一个更优雅的解决方案,否则就是这样。@tackline如果目标是封装,那么我会将整个事情包装起来(DataSource
,Connection
,CallableStatement
)。因此,对于客户端代码来说,这将是绝对透明的。我发现将代码封装在我自己的某个通用实用程序方法中,这样当我需要返回并更改某些内容或添加某些内容(如日志记录)时,它将非常有帮助然后我就可以在这个实用方法中做我需要做的任何事情,而不是改变应用程序中获得db连接的每一段代码。这将是一个很好的例子。:)我最终创建了一个装饰连接对象,它返回一个装饰的CallableStatement。由于我的连接创建过程是在公共代码中进行的(在我上面给出的示例中没有表示),因此这提供了一种理想的方法来创建这些装饰对象,只需最少的代码更改(新代码应该在不考虑这些更改的情况下获取这些更改)