一个轻量级的JDBC辅助库,可替代Apache Commons DbUtils。

33

我刚开发了一个简单的JDBC帮助库,但已经意识到会是一个维护噩梦。

我不需要像Hibernate那样完整的ORM,只是需要一些轻便实用的东西,可以快速传递SQL语句进行JDBC调用而不用担心检查异常、手动关闭资源等问题...

根据您的经验,您能推荐一个好用的JDBC帮助库吗?

到目前为止,我看过了Apache Commons DbUtils(链接),它似乎还不错。还有其他想法吗?

6个回答

34

以下是一些工具列表,这些工具可以"缓解痛苦",当你与简单的JDBC交互时:


JDBC真的很棒,我认为应该将其从Spring Framework中外部化。 - deFreitas
1
@deFreitas:为什么?这只是一个单一的类,你可以在10-20分钟内自己编写它... - Lukas Eder
1
因为我认为重写JDCTemplate和PlatformTransactionManager并保持良好的代码质量以及所有核心功能不可能只需要20分钟,而且我不明白为什么要重写一些已经运行良好并由整个社区维护的东西。 - deFreitas
不确定您的意思。JdbcTemplate的本质只是JDBC API上的语法糖。但好吧,如果您不想自己编写,请直接复制粘贴Spring中的代码。它是ASL 2.0许可的,因此您可以自由使用它,删除Spring依赖项。但无论如何,您可能指的是其他内容。 - Lukas Eder
是我还是列表顺序有意义?我猜这是流行度的原因;-) - sajjadG
2
@sajjadG 前两个是按字母顺序排列的,其余的是随机的。 - Lukas Eder

6

还有一些轻量级的框架,比如ORMLiteMyBatis。虽然使用Spring和它的RowMappers也很简单,但需要直接与JDBC打交道。使用上述任何一个都能帮助你隐藏掉这些细节,同时不会像Hibernate那样过于复杂。


5

https://code.google.com/p/jdbc-helper/

以下是我从项目页面上复制的描述:

JdbcHelper受Spring Jdbctemplate和Commons Dbutils项目的启发,是一个非常小的库,用于帮助开发人员编写常见的jdbc操作。JdbcHelper非常轻量级,只有~70K,并且没有外部依赖。

4

有一个名为Yank的 JDBC 轻量级持久层,它封装了 DBUtils。使用它需要为每个表创建一个 POJO 和一个 DAO 类。通过 DBProxy 类编写自己的 SQL 语句并执行查询,无需处理连接、结果集或其他低级 JDBC 代码。截至2.0.0版本发布,Yank jar 的大小仅为13 KB,只依赖于 SLF4J、DBUtils 和第三方数据库 jar,支持任何数据库技术。


3
当我看到“BooksDAO.selectAllBooks()”时,就知道这不会很好地工作。这基本上是我6年前构建的东西,并且犯了我所犯的所有错误。应该是“new BooksDAO(transaction).selectAllBooks()”。事务标记和上下文不能与查询纠缠在一起,并且不应通过静态方式处理,否则可测试性和可调试性将受到影响。 - Scott Carey
“这不能很好地工作”是相当不公平的说法。事实上,如果您不需要在每个事务中执行多个语句,则它可以完美地工作。 Yank从未声称支持多语句事务。 - herrtim
我看过Yank的源代码,我认为这不是一个好的实践。我写了一个简单的DbUtils帮助文档。http://a123159521.iteye.com/blog/2200647 - zg_spring
1
@herrtim,我认为这个说法并不不公平。即使您不想在事务中支持多个语句,静态粘连也会让您陷入困境。您无法编写任何依赖于BooksDAO的代码,而不将其静态绑定到数据库和具体实现。我坚信SomeDAO.someStaticMethod()==不良实践。someDAOImplementation.someInstanceMethod()要好得多。 - Scott Carey
别浪费时间用Yank,它非常麻烦...你将花费数小时解决无法追踪的错误。最后,这个驱动程序无法执行更新,并且在转换SQL文本命令方面存在严重问题。 - marcello

1

Spring Framework(spring-dao)是你的好朋友。如果你正确地编写接口,以后(如果必要)就可以轻松切换到像 Hibernate 这样更强大的东西。同时,不要低估 Hibernate:Native SQL 赋予了你全面 SQL 功能的能力,而你仍然可以从对象映射中受益 - 除非你只需要执行像 select count(*) from ... 这样简单的查询,否则这些都是你必须编写的。



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接