Java - JDBC 替代方案

66

这只是理论问题。

我在Java应用程序中使用JDBC来使用数据库(选择,插入,更新,删除等)。我手动创建Java类,这些类将包含来自DB表的数据(属性= db列)。然后我进行查询(ResultSet)并填充这些类别的数据。我不确定这是否是正确的方式。

但我已经阅读了很多关于JDO和其他持久性解决方案的文章。

请问有人可以基于他们的经验推荐最佳的JDBC替代方案吗?

我还想了解JDO相对于JDBC的优势(用简单的语言解释)。

我已经通过谷歌检索到了很多这方面的东西,但来自“第一手”的意见总是最好的。

谢谢

15个回答

135

Java数据库持久化的历程早已历经了曲折:

  • JDBC是每个人最终用来与数据库通信的低级API。但是,如果没有使用更高级别的API,您必须自己完成所有繁重的工作(编写SQL查询,将结果映射到对象等)。

  • EJB 1.0 CMP Entity Beans 是第一次尝试构建更高级别API,并已被大型Java EE提供商(BEA、IBM)成功采用,但未被用户接受。Entity Beans太过复杂,负载过重(即表现不佳,性能较差)。失败!

  • EJB 2.0 CMP 尝试通过引入本地接口减少Entity Beans的一些复杂性,但大多数复杂性仍然存在。EJB 2.0也缺乏可移植性(因为对象关系映射不是规范的一部分,因此部署描述符是专有的)。失败!

  • 然后,JDO出现了,它是一个数据存储无关的对象持久化标准(可以与关系型数据库、面向对象数据库、XML、Excel、LDAP一起使用)。但是,虽然有几个开源实现,并且JDO已被小型独立供应商采用(主要是希望JDO用户从关系型数据库存储转换到面向对象数据库存储,但这显然从未发生),它在大型Java EE参与者和用户中的采用失败了(因为编织在开发时很麻烦并吓到了一些客户、查询API奇怪、实际上太抽象)。因此,虽然标准本身并未死亡,但我认为它已经失败了。失败!

  • 实际上,尽管存在两种标准,像 ToplinkHibernate 这样的专有API已经成为用户在对象关系映射(竞争标准、JDO 定位不清晰、CMP 先前失败和糟糕的营销对此负有一定责任)方面优先选择的对象与关系数据库持久性方法。Hibernate 实际上成为了这个领域的事实标准(它是一个伟大的开源框架)。成功!

  • 然后 Sun 发现他们必须简化事情(更普遍地说整个 Java EE),并且他们在 Java EE 5 中使用 JPA,Java Persistence API,这是 EJB 3.0 的一部分,并且是用于对象到关系数据库持久性的新标准。JPA 统一了 EJB 2 CMP、JDO、Hibernate 和 TopLink 的 API/产品,并似乎在 EJB CMP 和 JDO 失败的地方获得了成功(易用性和采用率)。成功!

  • 总之,Java 的数据库持久性标准是JPA,应该优先选择它而不是其他专有API(使用 Hibernate 的 JPA 实现是可以的,但要使用 JPA API)。它提供了比 JDBC 更高级别的 API,并旨在为您节省大量手动工作(这是简化的,但这就是想法)。


    1
    太棒了,这正是我想要的!非常感谢你的帮助!顺便问一下:你知道NetBeans IDE默认使用什么吗?例如,当我将数据库表拖放到JTable中时,NetBeans会生成一个带有某些管理功能的类...使用实体管理器、查询结果等。 - Mike
    1
    @Mike 谢谢。关于NetBeans,最新版本默认支持JPA(作为Sun的标准,这很有意义)。实际上,EntityManager是JPA的一部分。 - Pascal Thivent
    +1 成功/失败。请注意,为了完整起见,我可能会将JDBC RowSet和DataSet与普通的JDBC区分开来(这在某种程度上类似于ADO.NET DataSet)。虽然我从未使用过它们,也从未听说过有人使用它们。 - ewernli
    请您更新您的答案,包括对MyBatis的比较吗? - Marius

    13
    如果您想自己编写SQL而不想使用ORM,仍然可以从一些隐藏所有繁琐连接处理(try-catch-finally)的框架中受益。最终,您可能会忘记关闭连接...
    一个这样易于使用的框架是Spring JdbcTemplate

    8
    我可以推荐Hibernate。它被广泛使用(并且有很好的原因),而且Java Persistence API规范的主要设计者领导了Hibernate,这保证了它在可预见的未来会存在 :-) 如果可移植性和供应商中立对您很重要,您可以通过JPA使用它,因此将来您可以轻松地切换到另一个JPA实现。
    由于缺乏与JDO的个人经验,我无法真正比较两者。然而,Hibernate(或ORM一般)的好处乍一看似乎与JDO页面上列出的几乎相同。对我来说,最重要的点是:
    • DB中立性:Hibernate支持多种后台SQL方言,切换数据库就像在配置中更改单个行一样容易
    • 性能:默认情况下延迟获取,在引擎盖下进行了很多优化,这些优化需要使用JDBC手动处理
    • 您可以专注于领域模型和OO设计,而不是较低级别的数据库问题(但是如果您希望,当然可以微调DML和DDL)

    一个ORM工具的一个潜在缺点是它不太适合批量处理。如果您需要更新表中的100万行数据,则ORM默认情况下永远不会像JDBC批量更新或存储过程那样执行得好。虽然Hibernate可以合并存储过程,并且在某种程度上支持批处理(我对此还不熟悉,因此无法确定它在这方面是否与JDBC相比胜任任务-但是从我目前所知的来看,可能是的)。因此,如果您的应用程序需要一些批处理但主要处理单个实体,则Hibernate仍然可以使用。如果主要进行批处理,则JDBC可能是更好的选择。


    +1 - 你比我先说了。Hibernate是一个非常好的ORM,具有足够的灵活性,使您能够完成几乎任何您直接在JDBC中执行的任务。 - Elie
    2
    我听说过很多关于Hibernate的事情。你推荐在小项目中使用它吗?比如50个类,10-15个数据库表?还是坚持手动使用JDBC进行数据管理? - Mike
    @Mike 很好的问题。有人认为这对于小型项目来说有些过度了。我曾经使用过类似的ORM工具Cayenne(http://cayenne.apache.org)做过一个较小的项目,感觉还不错。所以我肯定会尝试一下它。在启动时可能需要做很多“额外”的工作,但在我看来,从长远来看它会得到回报。 - Péter Török

    8
    Hibernate要求您有一个对象模型来映射您的架构。如果您仍然只考虑关系架构和SQL,那么Hibernate也许不适合您。
    您必须愿意接受Hibernate将为您生成的SQL。如果您认为手写SQL可以做得更好,那么Hibernate也许不适合您。
    另一种选择是iBatis。如果JDBC是原始SQL,Hibernate是ORM,那么可以认为iBatis介于两者之间。它可以让您更多地控制执行的SQL。

    +1 for iBatis。它经常被忽视,但对于使用DBMS的专有功能进行只读复杂查询非常有用。 - Ondra Žižka
    太好了 - 为什么不直接编写SQL并省略冗余的东西呢? - duffymo

    6

    JDO是基于JDBC技术构建的。同样,Hibernate也需要使用JDBC。JDBC是Java关于数据库连接的基本规范。

    这意味着JDBC可以给你更多的控制权,但它需要更多的编程代码。

    JDO提供了更高层次的抽象和更少的编程代码,因为很多复杂性都被隐藏了。

    如果您正在问这个问题,我猜您不熟悉JDBC。我认为在有效地使用JDO、Hibernate或任何其他高级抽象工具之前,需要对JDBC有基本的了解。否则,您可能会遇到ORM工具表现出您无法理解的行为。

    Sun公司在其网站上提供了一个不错的入门材料,介绍了JDBC。http://java.sun.com/docs/books/tutorial/jdbc/


    3
    这就是Java持久化的运作方式。你刚学会Java,想将一些记录保存下来,于是开始学习JDBC。你很高兴地发现自己现在可以将数据保存到数据库中了。接着你决定写一个更大的应用程序。你意识到尝试、捕获、打开连接、关闭连接、从结果集传输数据到Bean等过程非常烦琐。于是你认为一定有更简单的方法。在Java中总会有替代方案。于是你进行了一些搜索,在短时间内就发现了ORM,最可能的是Hibernate。你非常兴奋,因为现在你不必再考虑连接问题了。你的表格会自动创建。你能以极快的速度前进。然后你决定承担一个真正的大项目,最初你进展得非常迅速,并且把所有增删改查操作都放置好了。但是要求不断变化,直到有一天你陷入困境。你尝试保存,但它不会级联到对象的子项。有些东西并没有像书中所解释的那样工作。你不知道怎么办,因为你没有编写Hibernate库。你希望自己写了SQL语句。现在是重新思考的时候了……随着你的成长,你意识到与数据库交互的最佳方式是通过SQL。你也意识到一些工具可以让你快速入门,但在长期使用中可能无法满足需求。这就是我的故事。我现在是一个非常开心的ibatis用户。

    3

    看看MyBatis。它经常被忽视,但对于使用DBMS的专有功能进行只读复杂查询非常有用。

    http://www.mybatis.org


    2
    Ebean ORM是另一种选择。Ebean使用JPA注释进行映射,但其架构设计为无会话状态。这意味着您不需要附加/分离的概念,也不需要持久化/合并/刷新 - 您只需简单地保存()您的bean即可。我希望Ebean比Hibernate、JPA或JDO更容易使用。因此,如果您正在寻找强大的替代JDO或JPA的方法,可以看看Ebean。

    2
    JPA/Hibernate是ORM的热门选择。它可以为您提供几乎所有需要的ORM功能。对于那些具有基本ORM需求的开发人员来说,学习曲线可能会很陡峭。
    有许多替代方案可供选择,这些方案为具有基本ORM要求的开发人员提供了较少的复杂性。例如,在sourceforge上查询: http://sourceforge.net/directory/language:java/?q=ORM 我偏爱我的解决方案Sormula:sourceforgebitbucket。Sormula旨在最小化复杂性,同时提供基本的ORM功能。

    1
    Hibernate,毫无疑问。它非常流行,甚至有一个.NET版本。
    此外,Hibernate可以很容易地与Spring框架集成。
    而且,它几乎可以满足任何开发者的需求。

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