DAO在Spring JPA中是一种好的做法吗?

时间:2019-02-24 03:50:52

标签: java spring spring-boot

我正在从Udemy的教程中学习Spring,但是作者使用的是Spring Boot 1.5.6,我不确定他在做什么。在一个JPA示例中,他创建了一个Client实体(Serializable),然后创建了一个ClientDAO接口及其实现。实现看起来像这样:

@Repository
public class ClientDaoImpl implements IClientDao {
    @PersistenceContext
    private EntityManager em;

    @Transactional(readOnly=true)
    @Override
    public List<Client> findAll() {
        return em.createQuery("from Client").getResultList();
    }
}

这样做是一种好习惯吗?我看过一段视频,之前作者使用CrudRepository并在没有实现任何内容的情况下提供了服务,更不用说使用这种SQL了。这是因为它是Spring Boot的过时版本,还是一种好方法?这看起来很像旧的JavaEE,而不是Spring5。我应该忽略它,并使用CrudRepository和服务吗?

谢谢。

2 个答案:

答案 0 :(得分:3)

如果您可以使用尽可能少的代码来实现该服务,则始终是一个好习惯。因此,如果我们可以仅通过声明接口来创建DAO服务,那么它会更好,并且是spring DATA的官方文档所推荐的。

interface ClientDao extends CrudRepository<Cliente, Long> {
}

但是,出于学习的目的,最好以旧的方式进行练习以了解其工作原理。

答案 1 :(得分:1)

很好。您显示的示例根本不使用Spring Data-它使用Spring DAO + JPA集成。没关系Spring Data是对此的另一种抽象。使用ORM,典型的可能性是:

  • 纯冬眠+ Spring DAO
  • JPA + Spring DAO
  • JPA + Spring数据

使用哪种通常取决于个人喜好和经验。例如。我可以使用Spring Data,但是我个人的选择始终是Hibernate + Spring Dao。因此,这不是良好或不良做法的问题。

您的项目需求也会影响选择-例如性能要求可能会导致您放弃ORM,转而使用Spring JDBC和本机SQL查询。

要注意的一件事-您不会通过学习低级方法而浪费时间。因此,如果您不知道学习JDBC还是纯粹的JPA都是在浪费时间-那就永远不会。高级API始终基于低级API,如果不学习后者,就无法成为前者的专家。