Java 之后我可以用hibernate替换JDBC逻辑吗

Java 之后我可以用hibernate替换JDBC逻辑吗,java,hibernate,spring,jdbc,spring-mvc,Java,Hibernate,Spring,Jdbc,Spring Mvc,我正在用SpringMVC建立一个网站。由于我是JavaEE新手,我发现很难同时应用所有东西 那么,我是否可以开始用简单的JDBC和spring构建应用程序,然后用hibernate替换它 转换是否会更容易,所以我应该先学习hibernate,然后从网站开始?只有(至少)两个先决条件: 您可以在DAO层中完全抽象数据库访问。每个DAO都应该有一个接口和一个JdbcXDao实现。稍后您可以添加相同的HibernateXDao DAO应该返回域对象。任何结果集或语句都不应超出dao。例如,如果需要

我正在用SpringMVC建立一个网站。由于我是JavaEE新手,我发现很难同时应用所有东西

那么,我是否可以开始用简单的JDBC和spring构建应用程序,然后用hibernate替换它

转换是否会更容易,所以我应该先学习hibernate,然后从网站开始?

只有(至少)两个先决条件:

  • 您可以在DAO层中完全抽象数据库访问。每个DAO都应该有一个接口和一个
    JdbcXDao
    实现。稍后您可以添加相同的
    HibernateXDao

  • DAO应该返回域对象。任何结果集或语句都不应超出dao。例如,如果需要由给定用户获取消息,可以编写
    List messages=dao.getMessages(user)

如果不满足上述任一条件,您将很难迁移到hibernate


但是,您可能没有勇气在以后更改整个DAO层,所以请在hibernate上花更多的时间,直接从它开始。

如果构建应用程序只需要JDBC,我看不到仅仅使用hibernate重写所有内容的任何好处

Hibernate的主要目的是避免您使用普通的JDBC编写重复的插入/更新/删除/选择代码。您可以将一些简单的JDBC与Hibernate混合,并在需要时逐渐向应用程序添加ORM


话虽如此,对于需要复杂查询的简单数据库,在使用基于Hibernate的解决方案之前,我会选择普通JDBC 1000次。

是的,当然可以。如果你写得恰当,它甚至可以很容易做到

用接口启动持久层;仅允许客户端调用属于接口引用类型的对象。今天就把JDBC实现抛在身后;明天,您可以切换到Hibernate实现,而您的客户机将不再明智。这就是界面之美

大概是这样的:

package persistence;

public interface FooDao
{
    List<Foo> find();
    Foo find(Long id);
    void saveOrUpdate(Foo foo);
    void delete(Foo foo);
}
包持久化;
公共接口FooDao
{
列表查找();
Foo-find(长id);
作废保存或更新(Foo-Foo);
作废删除(Foo-Foo);
}

需要注意的一点是:此接口仅处理模型对象,而不是SQL。持久层处理关系数据库的方式从对象模型开始。这是Hibernate的一个要求。如果您希望有朝一日能够用Hibernate替换JDBC实现,那么它将立即成为您的JDBC实现所必需的。

+1-添加到不应超出DAO的结果集等,还要确保DAO接口不声明任何异常,如SQLException。我经常看到人们构建“技术中立”的DAO接口,但仍然在其中散布SQLException、IOException等。使用Hibernate可以进行测试。您将能够使用内存中的数据库(H2、HSQLDB..)进行单元测试。