Spring 具有泛型类(dao、服务)的CRUD

Spring 具有泛型类(dao、服务)的CRUD,spring,hibernate,model-view-controller,jpa,controller,Spring,Hibernate,Model View Controller,Jpa,Controller,我从spring、hibernate、maven、jpa、springMVC开始我的大型应用程序。 目前我有30节课。(每个类有接口,我们有60个类) 我有两个包裹。(道与服务) 对于dao,我使用genericDao类。 我对所有Dao的分类摘要是: > package org.me.dao.jpageneric; import java.util.List; import javax.persistence.EntityManager; import javax.persisten

我从spring、hibernate、maven、jpa、springMVC开始我的大型应用程序。 目前我有30节课。(每个类有接口,我们有60个类) 我有两个包裹。(道与服务) 对于dao,我使用genericDao类。 我对所有Dao的分类摘要是:

>
package org.me.dao.jpageneric;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
 
import org.apache.log4j.Logger;
 
public abstract class GenericDAO<T, K> {
 
        @PersistenceContext(unitName="database")
        protected EntityManager em;
 
        protected Logger logger=Logger.getLogger(getClass());
 
        public abstract Query getByIdQuery(K id);
        public abstract Query getAllQuery();
 
        public T save(T saved) {
                if (saved == null) {
                  throw new IllegalArgumentException("L'argument de save() ne doit pas être nul.");
                }

                return (T) em.merge(saved);
        } // save()
 
        public void delete(T deleted) {
                if (deleted == null) {
                     throw new IllegalArgumentException("L'argument de delete() ne doit pas être nul.");
                }
                em.remove(deleted);
        } // delete().
 
        @SuppressWarnings("unchecked")
        public T get(K id) {
                if (id == null) {
                   throw new IllegalArgumentException("L'argument de get() ne doit pas être nul.");
                }
                Query query = getByIdQuery(id);
                return (T) query.getSingleResult();
        } 
        @SuppressWarnings("unchecked")
        public List<T> getAll() {
                logger.debug("Récupération de tous les objets");
                Query query = getAllQuery();
                return (List<T>) query.getResultList();
        } 
>
包org.me.dao.jpageneric;
导入java.util.List;
导入javax.persistence.EntityManager;
导入javax.persistence.PersistenceContext;
导入javax.persistence.Query;
 
导入org.apache.log4j.Logger;
 
公共抽象类GenericDAO{
 
@PersistenceContext(unitName=“数据库”)
受保护的实体管理器em;
 
受保护的记录器=Logger.getLogger(getClass());
 
公共摘要查询getByIdQuery(K id);
公共抽象查询getAllQuery();
 
公共T保存(T保存){
如果(已保存==null){
抛出新的IllegalArgumentException(“L'argument de save()ne doit pasêtre nul.”);
}
返回(T)em.merge(保存);
}//保存()
 
公共作废删除(T删除){
如果(已删除==null){
抛出新的IllegalArgumentException(“L'argument de delete()ne doit pasêtre nul.”);
}
em.remove(删除);
}//删除()。
 
@抑制警告(“未选中”)
公共不获取(K id){
if(id==null){
抛出新的IllegalArgumentException(“L'argument de get()ne doit pasêtre nul.”);
}
Query Query=getByIdQuery(id);
return(T)query.getSingleResult();
} 
@抑制警告(“未选中”)
公共列表getAll(){
调试(“我们的目标是什么”);
Query=getAllQuery();
return(List)query.getResultList();
} 
每个Dao都必须扩展这个类并实现他的接口(我必须为其他30个类做这个),我希望这是一个好的实践

之后,我为服务类创建了另一个抽象泛型类

package org.me.service.generic;
 
import java.util.List;
 
public abstract class GenericService<T,K> {
 
        public abstract T create(T saved);
        public abstract void remove(T deleted);
        public abstract T findById(K id) ;
        public abstract List<T> findAll();
 
}
package org.me.service.generic;
 
导入java.util.List;
 
公共抽象类泛型服务{
 
公共摘要T创建(T保存);
公开摘要无效删除(T删除);
公共摘要T findById(K id);
公共摘要列表findAll();
 
}
同样,所有服务类都必须扩展这个通用服务类并实现每个类的接口。 这又是一个好习惯吗

对于corse,每个类(包dao和服务)都有一个接口

另一个问题:我必须创建控制器,怎么做?为每个类创建一个控制器(也就是说30个控制器?) 如何处理html和jsp页面? 非常感谢。
对不起,我的英语不好。:-

在软件编程方面,一些公认的好做法是:

  • DRY(不要重复你自己)。如果你发现自己多次复制相同的代码,那只是一个等待发生的bug——特别是当需要重构(更改)重复的代码时
  • 不要重新发明轮子。看看SpringDataJPA项目,你已经可以使用它了

对于Spring MVC控制器,我不明白为什么您需要对所有控制器进行超类化。您只需要用
@controller
注释每个控制器类。将控制器执行的业务功能封装在服务类中是一个好主意,这样您就可以在其他地方重用它了Spring数据jpa替换了您的基因稻刀

你可以看看你的crud服务


或者,我建议查看spring roo,它为crud操作构建了web UI。

服务和控制器应该实现应用程序的用例。它们不应该包含任意的创建、删除和查找方法。假设您正在实现一个银行应用程序。您真的不想列出所有帐户(可能是数百万)或者所有的客户,对吗?而且,JPA有
EntityManager.find()
通过ID获取实体。使用该ID而不是查询。thnks获取这些信息。我已经更改了您所说的内容!更加简单且非常有用。我的应用程序适用于大使馆、旅行社和外交部。正如您所知:我的应用程序包含30个实体。我已经尝试了spring Data JPA,但我必须为所有DAO编写实现的每个方法(30个类)。使用我的解决方案,我不必这样做。只需制作例如:public class AddressDAO extend GenericDao实现IAddress{我不必在AddressDAO中编写任何方法。但是使用JpaRepository,我必须为所有类编写所有方法。我希望我的概念是正确的。如果你看到错误,请不要犹豫。感谢控制器:我应该为所有类创建30个控制器类?或者只为所有类创建一个控制器?thaknsI将尝试spring data JPaJ。请注意:您还可以在控制器级别上使用泛型。一个简单的控制器用于主数据的CRUD操作,它可以从pathvariable或requestparameter获取类名和id,这是很容易实现的。谢谢。是的,我对spring data jpa有很多不理解的地方!最后,它非常容易使用。另一个问题?可以添加吗spring数据rest到spring数据jpa?我看到了spring roo,这很有趣,但我对所有的框架都很感兴趣。可以使用spring数据jpa、spring数据rest和roo吗?spring数据rest构建在spring数据jpa的基础上,所以一旦spring数据jpa就位,就可以使用spring数据rest。spring数据rest和spring roo就不起作用了我认为两者结合得很好。仅供参考。如果我将spring data rest与spring data rest集成,那么控制器呢?它是嵌入的还是我必须创建的?看起来spring data rest提供了一个直接映射到jpa repo的控制器,所以您根本不需要编写控制器或服务层。