Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate vs JDBI_Java_Sql_Hibernate_Dropwizard_Jdbi - Fatal编程技术网

Java Hibernate vs JDBI

Java Hibernate vs JDBI,java,sql,hibernate,dropwizard,jdbi,Java,Sql,Hibernate,Dropwizard,Jdbi,我正在使用Dropwizard框架(版本0.7.0)构建一个web服务。它涉及到对数据库执行一些只读查询,操作结果集,然后返回该数据集。我使用MySQL作为数据库引擎。由于我是这个框架的新手,我想知道我应该选择哪个选项:Hibernate还是JDBI。如果您对数据库的工作很少,那么就使用JDBI,否则就使用Hibernate,因为它非常强大,并且为您的持久性逻辑提供了许多附加功能。实际上,这两种解决方案都只是“锁定” 如果您想使用持久化模型类型接口,请针对JPA(如果您确定它只返回到关系数据库)

我正在使用Dropwizard框架(版本0.7.0)构建一个web服务。它涉及到对数据库执行一些只读查询,操作结果集,然后返回该数据集。我使用MySQL作为数据库引擎。由于我是这个框架的新手,我想知道我应该选择哪个选项:Hibernate还是JDBI。

如果您对数据库的工作很少,那么就使用JDBI,否则就使用Hibernate,因为它非常强大,并且为您的持久性逻辑提供了许多附加功能。

实际上,这两种解决方案都只是“锁定”

如果您想使用持久化模型类型接口,请针对JPA(如果您确定它只返回到关系数据库)或JDO(如果您可能想返回到关系数据库和其他类型数据库,如无SQL移动)编写代码。这是因为使用这两种解决方案中的任何一种,当出现问题时,您可以切换持久性提供程序,而无需重写大部分代码

如果您想使用过程持久性模型(直接处理SQL查询等),那么可以使用JDBi甚至JDBC。JDBi在JDBC上提供了一个非常好的抽象;但是,在某些情况下,您需要较低级别的访问(出于性能原因,您正在协调调整查询和数据库)。同样,JDBC是一种标准,您可以轻松地将一个数据库替换为另一个数据库;然而,SQL本身并不容易替换

为了修正SQL交换问题,我建议使用一组属性文件来保存查询,然后使用资源加载器类型的机制将正确数据库的SQL绑定到代码。它不是100%万无一失;但它确实让你走得更远


现在,如果你问我会用什么,我强烈推荐JDO。

这两种我都用过。我在Grails和传统的Spring应用程序中使用了Hibernate和GORM,在Dropwizard中使用了JDBI

我非常喜欢JDBI的简单性,下面是我为什么喜欢它而不是Hibernate的几个原因

  • 我确切地知道要执行什么样的SQL来获取我请求的数据。使用Hibernate,有时您可能需要对HQL进行大量的修改,并将对象配置为您想要返回的内容。您最终求助于SQL,但很难将结果正确地映射回域对象,或者放弃并允许hibernate逐个获取它们

  • 我不需要担心延迟/急切抓取,以及这将如何影响我在大型数据集上的查询时间

  • 映射并不复杂,因为您可以自己管理它们,并且不必依赖于获得注释和优化的正确组合


  • 特别是对于您的情况,听起来您需要一些轻量级的东西,因为您没有太多的用例,在我看来,这肯定是JDBI优于Hibernate。

    “在不重写大部分代码的情况下切换持久性提供程序”有点。。。太乐观了。对于一个不平凡的项目,更改JPA提供者将是一个挑战。我曾经参与过这样一个项目(Hibernate->EclipseLink),结果比预期的要困难得多。(这是一个纯粹基于JPA的应用程序!)。如果您的应用程序使用了一些没有JPA替代方案的扩展(如hibernate envers)…@Gmugra如果您仅使用ANSI SQL(几乎没有人约束自己)保持非常严格的控制,您可以非常轻松地切换。问题是,人们最终对SQL或DML命令进行了特定于服务器的扩展,这些扩展是不可移植的。JDO的好处是,如果您这样做的话,JDO堆栈将编写与服务器匹配的SQL。对于只需要简单SQL的简单应用程序,您确实会很好。(但为什么要将巨大的ORM应用于琐碎的应用程序呢?)但任何向左和向右的步骤,即使相对简单,都会导致可能的问题。e、 相对简单的JPQL查询在Hibernate中运行良好,但需要对EclipseLink进行修改(通常是愚蠢的修改),因此我们遇到了很多问题。此外,JPA规范并非总是100%明确。在某些情况下,提供程序可能会采用不同的方式,根据规范,这些方式是可以的,但彼此不兼容。@Gmugra正如我前面所说的,您总是可以使用JDO。没有SQL,不需要修改SQL。