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

标签 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() 方法。

关于执行此操作的最佳方法有什么想法吗?

最佳答案

如果您需要执行此操作的地方数量可控,我建议使用一种简单的方法(比尝试让数据库驱动程序返回您的自定义 CallableStatement 对象更容易)是制作一个包装器或装饰器包装您从 db 获得的 CallableStatement 对象。基本上创建一个实现 CallableStatement 的所有方法的类,将 CallableStatement 对象作为其构造函数的参数,并将所有方法调用委托(delegate)给另一个对象,除了 execute() 和 executeQuery() 你还在委托(delegate)给其他对象 execute() 方法之前和之后调用您的日志记录方法。

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

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

关于java - 如何从 prepareCall 方法中获取自定义 CallableStatement 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3621177/

相关文章:

Mysql分组与计数

java - 在sql jdbc查询中使用datediff

java - JDBC 中缺少 dll

java - 注释或关键字告诉对象的垃圾收集器首先删除

java - FileInboundAdapter - 在运行时设置新触发器

php - 如何使用代码点火器框架在查询 php 中将动态对象转换为数组

java jdbi3 withHandle删除不更新数据库

java - 在 Activity 中的可运行状态中调用 setAdapter 引发 NullPointerException

java - Spring MVC 中的 Hibernate 自动更新表

mysql - 在 virtualmin 中创建虚拟服务器(无法完成安装)