简单的 jdbc 包装器

2022-09-04 01:17:20

为了在我们的应用程序中实现数据访问代码,我们需要一些框架来包装jdbc(由于可扩展性,ORM不是我们的选择)。

我曾经使用过的最酷的框架是Spring-Jdbc。但是,我公司的政策是避免外部依赖,特别是spring,J2EE等。因此,我们正在考虑编写自己的方便的jdbc框架,其功能类似于Spring-jdbc:行映射,错误处理,java5的支持功能,但没有事务支持。

有没有人有编写这样的jdbc包装器框架的经验?如果有人有使用其他jdbc包装框架的经验,请分享您的经验。

提前致谢。


答案 1

我们编写了自己的包装器。这个话题值得写一篇论文,但我怀疑我是否有时间写它,所以这里有一些关键点:

  • 我们拥抱了sql,并没有试图隐藏它。唯一的调整是添加对命名参数的支持。参数很重要,因为我们不鼓励使用动态 sql(出于安全原因),并且我们始终使用 ReadyStatements。

  • 对于连接管理,我们使用Apache DBCP。这在当时很方便,但目前还不清楚现代JDBC实现需要多少(缺乏有关此内容的文档)。DBCP 还池化了预准备语句。

  • 我们没有打扰行映射。相反(对于查询),我们使用类似于Apache dbutil的ResultSetHandler的东西,它允许您将结果集“馈送到”一个方法中,然后该方法可以将信息转储到您想要的任何位置。这更灵活,实际上,为行映射实现 ResultSetHandler 并不难。对于插入/更新,我们创建了一个通用记录类(基本上是一个带有一些额外花里胡哨的哈希图)。行映射(对我们来说)的最大问题是,一旦你执行一个“有趣”的查询,你就会陷入困境,因为你可能有映射到不同类的字段;因为您可能有一个分层的类结构,但一个平面结果集;或者因为映射很复杂且依赖于数据。

  • 我们内置了错误日志记录。对于异常处理:在查询中,我们捕获并记录,但对于更新,我们捕获,记录和重新抛出未经检查的异常。

  • 我们使用包装器方法提供事务支持。调用方提供执行事务的代码,我们确保事务得到正确管理,没有机会忘记完成事务,并内置回滚和错误处理。

  • 稍后,我们添加了一个非常简单的关系方案,允许单个更新/插入应用于记录及其所有依赖项。为了简单起见,我们没有在查询中使用它,并且我们特别决定不支持删除,因为使用级联删除更可靠。

到目前为止,此包装器已在两个项目中成功使用。当然,它是轻量级的,但现在每个人都说他们的代码是轻量级的。更重要的是,它提高了程序员的工作效率,减少了错误的数量(并使问题更容易被追踪),并且如果需要,它相对容易跟踪,因为我们不相信仅仅为了提供漂亮的架构而添加很多层。


答案 2

Spring-JDBC太棒了。考虑到像Spring这样的开源项目,外部依赖性的负面影响是最小的。你可以采用最稳定的Spring版本,满足你的JDBC抽象要求,你知道,如果你遇到问题,你总是能够自己修改源代码-而不依赖于外部方。您还可以检查实现中是否存在您的组织在使用外部方编写的代码时可能存在的任何安全问题。


推荐