我们编写了自己的包装器。这个话题值得写一篇论文,但我怀疑我是否有时间写它,所以这里有一些关键点:
我们拥抱了sql,并没有试图隐藏它。唯一的调整是添加对命名参数的支持。参数很重要,因为我们不鼓励使用动态 sql(出于安全原因),并且我们始终使用 ReadyStatements。
对于连接管理,我们使用Apache DBCP。这在当时很方便,但目前还不清楚现代JDBC实现需要多少(缺乏有关此内容的文档)。DBCP 还池化了预准备语句。
我们没有打扰行映射。相反(对于查询),我们使用类似于Apache dbutil的ResultSetHandler的东西,它允许您将结果集“馈送到”一个方法中,然后该方法可以将信息转储到您想要的任何位置。这更灵活,实际上,为行映射实现 ResultSetHandler 并不难。对于插入/更新,我们创建了一个通用记录类(基本上是一个带有一些额外花里胡哨的哈希图)。行映射(对我们来说)的最大问题是,一旦你执行一个“有趣”的查询,你就会陷入困境,因为你可能有映射到不同类的字段;因为您可能有一个分层的类结构,但一个平面结果集;或者因为映射很复杂且依赖于数据。
我们内置了错误日志记录。对于异常处理:在查询中,我们捕获并记录,但对于更新,我们捕获,记录和重新抛出未经检查的异常。
我们使用包装器方法提供事务支持。调用方提供执行事务的代码,我们确保事务得到正确管理,没有机会忘记完成事务,并内置回滚和错误处理。
稍后,我们添加了一个非常简单的关系方案,允许单个更新/插入应用于记录及其所有依赖项。为了简单起见,我们没有在查询中使用它,并且我们特别决定不支持删除,因为使用级联删除更可靠。
到目前为止,此包装器已在两个项目中成功使用。当然,它是轻量级的,但现在每个人都说他们的代码是轻量级的。更重要的是,它提高了程序员的工作效率,减少了错误的数量(并使问题更容易被追踪),并且如果需要,它相对容易跟踪,因为我们不相信仅仅为了提供漂亮的架构而添加很多层。