Java – JDBC的替代

这只是理论上的问题。

我使用JDBC与我的Java应用程序使用数据库(select,插入,更新,删除或其他)。 我做“手动”Java类将包含来自数据库表(属性= DB列)的数据。 然后我做查询(ResultSet)并用数据填充这些类。 我不确定,如果这是正确的方法。

但是我已经读了很多JDO和其他持久性解决scheme。

有人可以根据他们的经验推荐最好的JDBCselect吗?

我也想知道JDO优于JDBC的优点(用简单的话来说)。

我已经能够谷歌这些东西,但“第一手”的意见总是最好的。

谢谢

Java中数据库持久化的故事已经漫长而曲折:

  • JDBC大家使用底层对话数据库的低级API。 但是,如果不使用更高级别的API,则必须自己完成所有的工作(编写SQL查询,将结果映射到对象等)。

  • EJB 1.0 CMP Entity Beans是高级API的第一次尝试,并已被大型Java EE提供程序(BEA,IBM)成功采用,但不是由用户采用。 实体豆太复杂,开销太多(理解,性能差)。 失败!

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

  • 然后是JDO ,它对象持久性的数据存储不可知的标准(可以与RDBMS,OODBMS,XML,Excel,LDAP一起使用)。 但是,虽然有几个开源实现,而JDO已经被小型独立供应商采用(大多数OODBMS供应商希望JDO用户以后可以从他们的RDBMS数据存储转换到OODBMS–但是这显然从未发生过)被大型Java EE玩家和用户所采用(因为编程在开发时是一种痛苦,吓倒了一些客户,一个奇怪的查询API,实际上太抽象了)。 所以,虽然标准本身并没有死亡,但我认为这是一个失败。 失败!

  • 事实上,尽pipe存在两个标准, Toplink ,老玩家或Hibernate等专有API已经被用户优先于EJB CMP和JDO,用于对象到关系数据库的持久性(标准之间的竞争,JDO的定位不明确, CMP和糟糕的市场营销在这方面有一部分责任),而Hibernate实际上成了这个领域的事实标准(这是一个很好的开源框架)。 成功!

  • 然后,Sun意识到他们必须简化事物(更一般地说是整个Java EE),并且在Java EE 5中使用JPA (Java持久性API,它是EJB 3.0的一部分)执行此操作,并且是对象到关系数据库持久性的新标准。 JPA统一了EJB 2 CMP,JDO,Hibernate和TopLink API /产品,并且在EJB CMP和JDO失败(易用性和采用)方面似乎取得了成功。 成功!

总之,Java的数据库持久化标准是JPA,并且应该比其他专有API(使用Hibernate的JPA实现是好的,但是使用JPA API)更好,除非ORM不是你所需要的。 它提供了比JDBC更高级别的API,旨在为您节省大量的手工工作(这是简化的,但这是想法)。

如果你想自己编写SQL,而不想使用ORM,那么你仍然可以从隐藏所有繁琐的连接处理(try-catch-finally)的框架中受益。 最终你会忘记closures连接…

Spring JdbcTemplate是一个非常容易使用的框架。

我可以推荐Hibernate 。 它被广泛的使用(出于很好的理由),并且Java持久化API规范由Hibernate的主要devise者领导的事实保证了它将在可预见的未来:-)如果可移植性和供应商中立对你是重要的,您可以通过JPA使用它,所以将来您可以轻松切换到另一个JPA实现。

由于缺乏JDO的个人经验,我无法真正比​​较两者。 然而,Hibernate(或者一般来说ORM)的好处看起来与JDO页面上列出的非常相似。 对我来说最重要的是:

  • 数据库中立性:Hibernate在后台支持多种SQL语言,在数据库之间切换就像在configuration中更改单行一样简单
  • 性能:默认情况下延迟获取,以及在底层进行更多的优化,您需要使用JDBC手动处理
  • 您可以专注于您的领域模型和面向对象devise,而不是更低级别的数据库问题(但如果您愿意的话,您当然也可以微调DML和DDL)

一个潜在的缺点(通常是ORM工具)是不适合批处理的。 如果您需要更新表中的1百万行,默认情况下,ORM将无法执行JDBC批处理更新或存储过程。 Hibernate可以结合使用存储过程,而且它在一定程度上支持批处理(我对此还不是很熟悉,所以我不能真正地说出与JDBC相比,这个任务是否合适 – 但是从我看来,至今知道,可能是)。 所以如果你的应用程序需要一些批处理,但主要处理个别实体,Hibernate仍然可以工作。 如果主要是做批处理,也许JDBC是一个更好的select。

Hibernate要求你有一个对象模型来映射你的模式。 如果你仍然只考虑关系模式和SQL,或许Hibernate不适合你。

您必须愿意接受Hibernate将为您生成的SQL。 如果你认为用手编码的SQL可以做得更好,也许Hibernate不适合你。

另一种select是iBatis。 如果JDBC是原始SQL,而Hibernate是ORM,那么iBatis可以被认为是两者之间的东西。 它使您可以更好地控制执行的SQL。

JDO构build了JDBC技术。 同样,Hibernate也需要JDBC。 JDBC是Java在数据库连接上的基本规范。

这意味着JDBC会给你更多的控制,但是它需要更多的pipe道代码。

JDO提供更高的抽象和更less的pipe道代码,因为很多复杂性是隐藏的。

如果你问这个问题,我猜你不熟悉JDBC。 为了有效地使用JDO或者Hibernate或者其他更高级的抽象工具,我认为需要对JDBC有基本的了解。 否则,您可能会遇到ORM工具显示您可能无法理解的行为的情况。

在他们的网站上Sun的Java教程提供了一个体面的介绍材料,通过JDBC指导您。 http://java.sun.com/docs/books/tutorial/jdbc/

看看MyBatis。 通常会被忽略,但对于使用DBMS的专有function的只读复杂查询来说,这非常好。

http://www.mybatis.org

JPA / Hibernate是ORM的stream行select。 它可以为您提供几乎所有您需要的ORMfunction。 学习曲线对于那些具有基本ORM需求的人来说可能是陡峭的。

JPA有许多替代scheme,为具有基本ORM要求的开发人员提供较less复杂度的ORM。 查询sourceforge例如: http ://sourceforge.net/directory/language:java/?q=ORM

我偏爱我的解决scheme,Sormula: sourceforge或bitbucket 。 Sormula旨在最大限度地减less复杂性,同时提供基本的ORM。

hibernate,当然。 它很受欢迎,甚至有一个.NET版本。

而且,hibernate可以很容易地与Spring框架集成。

而且,它将主要适合任何开发人员的需求。

GORM是一个令人兴奋的新select,它是Grails的ORM实现。 现在可以单独使用。 在引擎盖下它使用hibernate,但给你一个很好的图层上面有很酷的dynamic查找器等。

所有这些不同的抽象层最终都使用JDBC。 整个想法是自动化一些单调乏味和容易出错的工作,就像编译器自动化编写程序(调整数据结构的大小 – 没有问题,只是重新编译)中的许多繁琐工作一样。

但是,请注意,为了使这些工作有假设,你需要坚持。 这些通常是合理的,而且很容易处理,特别是如果你从Java端开始,而不是必须使用现有的数据库表。

JDO是单个Sun标准中各个项目的融合,也是我build议您学习的一个项目。 为了实现,请select您最喜欢的IDE在其各种向导中build议的那个。

还有我个人比较喜欢的扭矩( http://db.apache.org/torque/ ),因为它更简单,而且正是我所需要的。

随着扭矩我可以定义一个数据库与MySQL(好吧,我使用Postgresql,但也支持MySQL),然后扭矩可以查询数据库,然后生成数据库中的每个表的Java类。 使用Torque,您可以查询数据库并获取正确types的Java对象。

它支持where子句(可以使用Criteria对象,也可以自己编写sql)和连接。

它也支持外键,所以如果你有一个用户表和一个用户表可以拥有0个或更多的房子,那么在用户对象上将会有一个getHouses()方法,它会给你一个House对象列表用户自己的。

首先看看你可以编写的代码types,看看http://db.apache.org/torque/releases/torque-3.3/tutorial/step5.html ,其中包含的例子显示了如何加载/用扭矩保存/查询数据。 (本例中使用的所有类都是基于数据库定义自动生成的)。

这是如何与Java持久性。 你刚刚学过java,现在你想要坚持一些logging,你要学习JDBC。 您很高兴现在可以将您的数据保存到数据库中。 然后你决定写一个更大的应用程序。 你意识到,尝试,捕获,打开连接,closures连接,将结果集中的数据传送到你的bean已经变得非常繁琐。所以你认为必须有一个更简单的方法。 在Java中总是有一个select。 所以你做了一些Googlesearch,并在短时间内发现ORM,而最有可能的是,hibernate。 你太激动了,你现在不必考虑连接。 您的表正在自动创build。 你可以快速移动。 然后,你决定进行一个非常大的项目,一开始你的行动非常快,而且你已经完成了所有的粗暴行动。 要求不断提出,那么有一天你是被迫的。 你试图保存,但不能级联到对象的孩子。 完成了一些工作,正如你读过的书中所解释的那样。 你不知道该怎么做,因为你没有写hibernate库。 你希望你自己写了SQL。 现在是时候重新思考了……当你成熟的时候,你意识到与数据库交互的最好方式是通过SQL。 你也意识到有些工具让你开始的速度非常快,但是他们不能让你持续很久。 这是我的故事。 我现在是一个非常快乐的ibatis /用户。

Ebean ORM是另一种替代方法http://ebean-orm.github.io/

Ebean使用JPA注释进行映射,但是它被devise为无会话。 这意味着你没有附加/分离的概念,你不坚持/合并/刷新 – 你只是简单地保存()你的豆。

  • 我希望Ebean比Hibernate,JPA或者JDO更简单

所以如果你正在寻找一个强大的JDO或JPA的替代方法,你可以看看Ebean。

我推荐使用Hibernate,它连接到数据库的方式非常奇妙,之前几乎没有问题,但后来更稳定。 它使用基于ORM的映射,它减less了在查询范围内编写查询的时间,并允许以最小的努力更改数据库。 如果您需要任何基于video的教程,请让我知道我可以上传到我的服务器并向您发送链接。

这是如何与Java持久性。 你刚刚学过java,现在你想要坚持一些logging,你要学习JDBC。 您很高兴现在可以将您的数据保存到数据库中。 然后你决定写一个更大的应用程序。 你意识到,尝试,捕获,打开连接,closures连接,将结果集中的数据传输到你的bean已经变得非常繁琐。所以你认为必须有一个更简单的方法。 在Java中总是有一个select。 所以你做了一些Googlesearch,并在短时间内发现ORM,而最有可能的是,hibernate。 你太激动了,你现在不必考虑连接。 您的表正在自动创build。 你可以快速移动。 然后,你决定进行一个非常大的项目,一开始你的行动非常快,而且你已经完成了所有的粗暴行动。

将hibernate用作独立的JAR文件,然后将其分发到不同的Web应用程序。 这是迄今为止最好的解决scheme。 你必须devise你的类,接口,枚举来做一个抽象的DAO模式。 只要你有正确的实体和映射。 你只需要使用对象(实体)而不是HSQL。