Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.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
数据库层非ORM(Java)_Java_Database_Orm - Fatal编程技术网

数据库层非ORM(Java)

数据库层非ORM(Java),java,database,orm,Java,Database,Orm,我想编写Java代码来处理数据库,无论使用哪个数据库。我的问题是它与对象无关。有一些插入和查询是正确的,但大多数不是 现在我们正在使用Postgresql和纯JDBC,但我们可能必须让它与Oracle一起工作 Hibernate(我从未使用过)能解决我的问题吗?还是我应该去做其他事情?编写自己的sql的问题是,您需要为RDBMS手动优化它。一些RDBMS支持不同的sql结构 因此,您需要平衡这一点与切换到基于ORM的解决方案的开销。或者,确保您的sql是100%标准的,这样您就不会使用在一个RD

我想编写Java代码来处理数据库,无论使用哪个数据库。我的问题是它与对象无关。有一些插入和查询是正确的,但大多数不是

现在我们正在使用Postgresql和纯JDBC,但我们可能必须让它与Oracle一起工作


Hibernate(我从未使用过)能解决我的问题吗?还是我应该去做其他事情?

编写自己的sql的问题是,您需要为RDBMS手动优化它。一些RDBMS支持不同的sql结构

因此,您需要平衡这一点与切换到基于ORM的解决方案的开销。或者,确保您的sql是100%标准的,这样您就不会使用在一个RDBMS解决方案中工作而在另一个RDBMS解决方案中不工作的任何构造

在您的特定情况下,修复sql可能比重做整个持久层以使用ORM更容易。有时候最好的工具就是你所知道的。如果您当前的应用程序没有简明的模型层,那么切换到ORM将需要大量的工作。当然,您可以使用hibernate,只使用sql查询,但如果您不打算对数据建模,那又有什么意义呢


希望您所有的持久性关注点都在一个DAO层中,并且有大量的集成测试,这样您就可以快速识别切换RDBMS时出现的中断。如果您没有专注于持久性的集成测试,那么现在是开始编写它们的时候了。

Java的标准是JPA,它非常强大。Hibernate是JPA提供商的行业标准

JPA帮助您编写一个干净的持久层。您可以编写一定不会中断的查询,因为它们是在编译时验证的。我喜欢使用spring,它很容易进行单元测试。但我相信CDI现在也提供了同样的功能

编写测试类也很容易。正如一位同事曾经教我的那样,模型是你拥有的最重要的东西。你不想让它破裂,或者你有问题

使用JPA,您还可以从实体为您想要使用的任何数据库生成模式。根据经验,它也很好

JPA帮助你在工作中运用好的实践。这很有价值


关于@hvgotcodes-answer,是的,您必须小心成本,但您也可以混合使用jdbc和jpa。这就是Dao的用途。

Hibernate的问题在于需要像对象模型一样对关系数据库进行建模。有时,这会使使用现有数据库变得困难。因此,这取决于您的关系数据库


另一个框架(不是JPA)是Ibatis。试着看看这个框架。

我喜欢@unludo的JPA答案,但我想我应该添加一些额外的细节

我建议您将代码更改为使用您定义的持久性接口

  public interface DataPersister {
     public void saveFoo(Foo foo);
     public void findFooById(int id);
     ...
  }
然后,该接口的第一个实现将使用JDBC/Postgresql。如果你想在封面下使用JPA,那就好了。或者,如果您想切换到一些无SQL数据库或甚至是平面文件,则可以

一旦您在自己的代码中将数据的使用和持久化实现分离,那么切换到不同的持久化器就非常容易了。您可以使用廉价的数据库(如H2)进行测试,并在不久的将来迁移到新数据库时在生产中切换到Postgresql

希望这能有所帮助。

我正是为此而创建的。jOOQ将SQL本身建模为Java中的一个组件。它包括使用标准和特定于供应商的功能,如内置函数、窗口函数、存储过程、分层查询等。只要有可能,一个数据库中的特定于供应商的功能将模拟用于其他数据库。这样,jOOQ生成的大多数SQL都与它支持的13个数据库中的任何一个兼容

另请参见此处的相关问题:


我就是这样做的。我将一个CRM系统从JDBC移植到Hibernate,我发现我们仍然需要一些本机查询才能将其投入生产,使用该语言作为接口是实现这一点的方法。由于时间不够(我没有),我还没有用接口实现这一点。是的,我倒了一个DAO层,但是没有接口。我会尽快的。现在,这就是我想要的。谢谢我将在接下来的几天里研究它。