我正在从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和服务吗?
谢谢。
答案 0 :(得分:3)
如果您可以使用尽可能少的代码来实现该服务,则始终是一个好习惯。因此,如果我们可以仅通过声明接口来创建DAO服务,那么它会更好,并且是spring DATA的官方文档所推荐的。
interface ClientDao extends CrudRepository<Cliente, Long> {
}
但是,出于学习的目的,最好以旧的方式进行练习以了解其工作原理。
答案 1 :(得分:1)
很好。您显示的示例根本不使用Spring Data-它使用Spring DAO + JPA集成。没关系Spring Data是对此的另一种抽象。使用ORM,典型的可能性是:
使用哪种通常取决于个人喜好和经验。例如。我可以使用Spring Data,但是我个人的选择始终是Hibernate + Spring Dao。因此,这不是良好或不良做法的问题。
您的项目需求也会影响选择-例如性能要求可能会导致您放弃ORM,转而使用Spring JDBC和本机SQL查询。
要注意的一件事-您不会通过学习低级方法而浪费时间。因此,如果您不知道学习JDBC还是纯粹的JPA都是在浪费时间-那就永远不会。高级API始终基于低级API,如果不学习后者,就无法成为前者的专家。