无论使用哪个数据库,我都希望编写Java代码来处理数据库。我的问题是它不会与对象相关。有一些插入和查询,但大多数不是。
目前我们正在使用Postgresql和纯JDBC,但我们可能必须使它与Oracle一起使用。
Hibernate(我从未使用过)可以解决我的问题,还是应该去寻找别的东西?
答案 0 :(得分:3)
我喜欢@unludo的JPA答案,但我想我会添加一些额外的细节。
我建议您更改代码以使用您定义的持久性接口。
public interface DataPersister {
public void saveFoo(Foo foo);
public void findFooById(int id);
...
}
然后,您的第一个接口实现将使用JDBC / Postgresql。如果你想在封面下使用JPA那么很好。或者,如果你想切换到某些无SQL数据库甚至是平面文件,那就好了。
在您自己的代码中使用数据和持久性实现之间的分离之后,切换到不同的持久性更加容易。您可以使用像H2这样的廉价数据库进行测试,并在不久的将来迁移到新数据库时切换到生产中的Postgresql。
希望这有帮助。
答案 1 :(得分:3)
我已经为此创建了jOOQ。 jOOQ将SQL本身建模为Java中的domain-specific language。它包含使用标准和供应商特定的功能,例如内置函数,窗口函数,存储过程,分层查询等。只要有可能,就会为其他数据库模拟来自一个数据库的特定于供应商的功能。这样,大多数jOOQ生成的SQL都与其支持的13个数据库中的任何一个兼容。
请参阅此处的相关问题:
答案 2 :(得分:1)
Java的标准是JPA,它非常强大。 Hibernate是JPA提供商的行业标准。
JPA可以帮助您编写干净的持久层。您可以编写肯定不会中断的查询,因为它们在编译时验证。我喜欢使用弹簧,它很容易进行单元测试。但CDI现在也提供了相同的信息。
编写测试类也很容易。作为一个曾经教过我的同事,这个模型是你拥有的最重要的东西。你不希望它破裂或你有问题。
使用JPA,您还可以从实体生成架构,以用于您要使用的任何数据库。从经验来看,它也非常好。
JPA帮助您将良好实践付诸实践。这很有价值。
关于@hvgotcodes的答案,是的,你必须小心费用,但你也可以混合使用jdbc和jpa。这就是Dao的用途。
答案 3 :(得分:1)
Hibernate的问题在于您需要像对象模型那样对关系数据库进行建模。有时,这使得使用现有数据库变得困难。所以它取决于您的关系数据库。
其他框架(不是JPA)是Ibatis。试着看看这个框架。
答案 4 :(得分:0)
编写自己的sql的问题是你需要为你的RDBMS手动优化它。一些RDBMS支持不同的sql构造。
因此,您需要在切换到基于ORM的解决方案的开销之间取得平衡。或者,确保您的sql是100%标准,因此您不使用任何在一个RDBMS解决方案中工作而不在另一个RDBMS解决方案中的构造。
在您的特定情况下,修复您的sql可能比重写整个持久层以使用ORM更容易。有时最好的工具就是你所知道的工具。如果您当前的应用程序没有简洁的模型层,切换到ORM将需要大量工作。你当然可以使用hibernate,只使用strait sql查询,但如果你不打算对数据进行建模,那又有什么意义。
希望您的所有持久性问题都在一个DAO层中,并且有大量的集成测试,因此您可以快速确定切换RDBMS时会发生什么中断。如果您没有专注于持久性的集成测试,那么现在是时候开始编写它们了。