Spring4+Hibernate4를 기반으로 한 유니버설 데이터 액세스 층(Dao 층)의 설계와 실현!

24374 단어
범용성에 기초한 의존 주입.우리 프로젝트에 많은 모델들이 있을 때 그에 상응하는 Dao(DaoImpl), 서비스(ServiceImpl)도 증가할 것이다.
우리가 이런 모델에 대한 조작은 대부분이 유사하다. 다음은 내가 제시한 것들(명지의, 기타 자체 뇌보)이다.
1.save 2.saveAll 3.findById 4.update 5.saveOrUpdate 6.delete 7.deleteAll 8.deleteById 9.loadAll 10.load(int page,int rows) 11.getTotalCount 12.getScrollData(int firstResult, int maxResult) 13.getScrollData(int firstResult, int maxResult, LinkedHashMap orderby) 14.getScrollData(int firstResult, int maxResult, String where, Object[] params) 15.getScrollData(int firstResult, int maxResult, String where, Object[] params, LinkedHashMap orderby)
 
각 Dao(Dao Impl), Service(Service Impl)에서 이러한 메서드를 정의한 경우 계산해 보겠습니다.만약 20개의 모델이 있다면: 20*15*(2+2) = 1200입니다.나리, 이렇게 낡은 물건 더미에 1200가지 방법이 걸렸어!!!(다음에는 이걸로 코드를 채워서 재도 되겠다...)방법당 평균 20회, 방법당 평균 40회 복제.아무 잘못도 없을 것을 보증하는 것은 정말 힘든 일이다.다음은 우리가 더욱 선진적인 방법이다.[참고: 다음 방법은 반드시 Spring을 4로 업데이트해야 하며, Spring3은 일반 주입을 지원하지 않습니다!]
우리는 Dao(Dao Impl), 서비스(Service Impl)에서 BaseDao(Base Dao Impl), BaseService(Base Service Impl)를 정의한 다음에 ORM이 Hibernate를 사용하기 때문에 우리는 하나의 실체를 조작할 때 사실 두 가지 속성 {Model.id.class(메인 키 형식), Model.class(실체 클래스 유형)만 알아야 한다. 그래, 사실은 모두 Class 유형인지 서열화할 수 있는지.이렇게 하면 우리 BaseDao가 실현될 때 구체적으로 어떤 실체류인지, 모델에 따라 주목할 필요가 없다.id.class 및 Model.class는 조작의 모든 것을 얻을 수 있습니다.그리고 각 구체적인 Dao가 BaseDao를 계승하면 BaseDao에서 정의한 10여 가지 방법(중복할 필요가 없음)을 가질 수 있고 업무 수요에 따라 구체적인 Dao의 방법을 확장하여 어느 정도의 결합(기초 조작과 특수 조작의 결합)을 할 수 있다.그리고 구체적인 DaoImpl은 먼저 BaseDaoImpl(이렇게 하면 10여 가지 기초 방법의 실현을 생략할 수 있다)을 계승하여 자신의 Dao의 특수한 업무 논리 방법을 실현한다.결합 해제가 잘 됐어![물론 범용성을 바탕으로 한 만큼 모델류를 잘못 넘기지 마세요!!!]서비스 레이어도 마찬가지입니다!!!
다음은 패키지의 구조입니다.
com.xy.model {Car,Driver,Passenger}com.xy.dao {BaseDao,CarDao,DriverDao,PassengerDao}com.xy.dao.impl {BaseDaoImpl,CarDaoImpl,DriverDaoImpl,PassengerDaoImpl}com.xy.service {BaseService,CarService,DriverService,PassengerService}com.xy.service.impl {BaseServiceImpl,CarServiceImpl,DriverServiceImpl,PassengerServiceImpl}
다음은 프로필 정보입니다. [원래는 이것이 중요한 것이 아니라고 생각했는데 작성할 필요가 없었지만 붙였습니다.] ##웹.xml

    org.springframework.web.context.request.RequestContextListener


    org.springframework.web.context.ContextLoaderListener


    contextConfigLocation
    classpath:spring.xml,classpath:spring-hibernate.xml


    org.springframework.web.util.IntrospectorCleanupListener


    openSessionInViewFilter
    org.springframework.orm.hibernate4.support.OpenSessionInViewFilter
    
        singleSession
        true
    


    openSessionInViewFilter
    *.action

##Spring.xml



    
    

    
    


##Spring-hibernate.xml



    
    
        
        
        

        
        
        
        
        
        
        
        

        
        
        
        

        
        
        
        

        
        
        
        
        
        

        
        
        
    

    
    
        
        
            
                
                ${hibernate.hbm2ddl.auto}
                
                ${hibernate.dialect}
                
                ${hibernate.show_sql}
                
                ${hibernate.format_sql}
            
        
        
        
            
                com.xy.model
            
        

        
        
    

    
    
        
    

    
    

뒤에 포인트가 왔어요!!!
#BaseDao.java
public interface BaseDaoInter {
    /**
     *  session      session  
     * @return
     */
    public Session getSession();
    /**
     *             
     * @param t         
     * @return      ID
     */
    public K save(T t);
    /**
     *      【  】       
     * @param ct     【  】
     */
    public void saveAll(Collection ct);
    /**
     *   Id      
     * @param id         id  
     * @return        
     */
    public T findById(K id);
    /**
     *       
     * @param t             
     * @return         
     */
    public T update(T t);
    /**
     *                 
     * @param t         
     * @return         
     */
    public T saveOrUpdate(T t);
    /**
     *               
     * @param t         
     */
    public void delete(T t);
    /**
     *       
     * @param ct        
     */
    public void deleteAll(Collection ct);
    /**
     *   id      
     * @param id      id
     * @return       (id    )
     */
    public boolean deleteById(K id);
    /**
     *         
     * @return       
     */
    public QueryResult loadAll();
    /**
     *         
     * @param page       
     * @param rows          
     * @return  page      
     */
    public QueryResult load(int page,int rows);
    /**
     *       
     * @return   
     */
    public long getTotalCount();
    
    /******************************HQL******************************/
    /**
     *         
     * @return
     */
    public QueryResult getScrollData();
    /**
     *       
     * @param firstResult     ,      -1,       
     * @param maxResult         ,      -1,       
     * @return
     */
    public QueryResult getScrollData(int firstResult, int maxResult);
    /**
     *       
     * @param firstResult     ,      -1,       
     * @param maxResult         ,      -1,       
     * @param orderby   ,Key     ,Value asc/desc, :
     *  LinkedHashMap orderby = new LinkedHashMap();
        orderby.put("email", "asc");
        orderby.put("password", "desc");
     * @return
     */
    public QueryResult getScrollData(int firstResult, int maxResult, LinkedHashMap orderby);
    /**
     *       
     * @param firstResult     ,      -1,       
     * @param maxResult         ,      -1,       
     * @param where     ,  where   ,            ,         1  , :o.username=?1 and o.password=?2
     * @param params             
     * @return
     */
    public QueryResult getScrollData(int firstResult, int maxResult, String where, Object[] params);
    /**
     *       
     * @param firstResult     ,      -1,       
     * @param maxResult         ,      -1,       
     * @param where     ,  where   ,            ,         1  , :o.username=?1 and o.password=?2
     * @param params             
     * @param orderby   ,Key     ,Value asc/desc, :
     *  LinkedHashMap orderby = new LinkedHashMap();
        orderby.put("email", "asc");
        orderby.put("password", "desc");
     * @return
     */
    public QueryResult getScrollData(int firstResult, int maxResult, String where, Object[] params, LinkedHashMap orderby);

}

#CarDao.java
public interface CarDaoInter extends BaseDaoInter{
	
}

#DriverDao.java
public interface DriverDaoInter extends BaseDaoInter,Driver>{

}
#BaseDaoImpl.java
/**
 *       abstract   ,     BaseDaoImpl  @Repository  ,        clatt   
 * class        
 * 
 * @author BearSmall
 *
 * @param 
 */
public abstract class BaseDaoImpl
		implements BaseDaoInter {
	@Autowired
	private SessionFactory sessionFactory; //       session  【  get,set  】

	private Class clatt; // 【      Class  】

	/**
	 * //             sessionFactory
	 * 
	 * @return sessionFactory
	 */
	public SessionFactory getSessionFactory() {
		return sessionFactory;
	}

	/**
	 *     clatt    【                  】
	 * 
	 * @param clatt
	 */
	public BaseDaoImpl(Class clatt) {
		this.clatt = clatt;
	}

	// @SuppressWarnings("unchecked")
	// public BaseDaoImpl() {//        clatt ,      abstract  
	// ParameterizedType parameterizedType =
	// (ParameterizedType)this.getClass().getGenericSuperclass();
	// clatt= (Class)(parameterizedType.getActualTypeArguments()[0]);
	// }

	@Override
	public Session getSession() {
		return getSessionFactory().getCurrentSession();
	}

	@SuppressWarnings("unchecked")
	@Override
	public K save(T t) {
		Session session = getSession();
		return (K) session.save(t);
	}

	@Override
	public T findById(K id) {
		Session session = getSession();
		@SuppressWarnings("unchecked")
		T t = (T) session.get(clatt, id);
		return t;
	}

	@Override
	public void saveAll(Collection ct) {
		Session session = getSession();
		for (T t : ct) {
			session.save(t);
		}
	}

	@Override
	public T update(T t) {
		Session session = getSession();
		session.update(t);
		return t;
	}

	@Override
	public void deleteAll(Collection ct) {
		Session session = getSession();
		for (T t : ct) {
			session.delete(t);
		}
	}

	@Override
	public T saveOrUpdate(T t) {
		Session session = getSession();
		session.saveOrUpdate(t);
		return t;
	}

	@Override
	public void delete(T t) {
		Session session = getSession();
		session.delete(t);
	}

	@Override
	public boolean deleteById(K id) {
		Session session = getSession();
		@SuppressWarnings("unchecked")
		T t = (T) session.get(clatt, id);
		if (t == null)
			return false;
		session.delete(t);
		return true;
	}

	@SuppressWarnings("unchecked")
	@Override
	public QueryResult loadAll() {
		Session session = getSession();
		Criteria criteria = session.createCriteria(clatt);
		QueryResult result = new QueryResult<>();
		result.setDatas(criteria.list());
		result.setTotalCount(Long.parseLong(criteria
				.setProjection(Projections.rowCount()).uniqueResult()
				.toString()));
		return result;
	}

	@SuppressWarnings("unchecked")
	@Override
	public QueryResult load(int page, int rows) {
		Session session = getSession();
		Criteria criteria = session.createCriteria(clatt);
		criteria.setFirstResult((page - 1) * rows);
		criteria.setMaxResults(rows);
		QueryResult result = new QueryResult<>();
		result.setDatas(criteria.list());
		result.setTotalCount(Long.parseLong(criteria
				.setProjection(Projections.rowCount()).uniqueResult()
				.toString()));
		return result;
	}

	@Override
	public long getTotalCount() {
		Session session = getSession();
		Criteria criteria = session.createCriteria(clatt);
		Object object = criteria.setProjection(Projections.rowCount())
				.uniqueResult();
		long totalCount = 0;
		if (object != null) {
			totalCount = Long.parseLong(object.toString());
		}
		return totalCount;
	}

	/****************************** HQL ******************************/
	@Override
	public QueryResult getScrollData() {
		return getScrollData(-1, -1, null, null, null);
	}

	@Override
	public QueryResult getScrollData(int firstResult, int maxResult) {
		return getScrollData(firstResult, maxResult, null, null, null);
	}

	@Override
	public QueryResult getScrollData(int firstResult, int maxResult,
			LinkedHashMap orderby) {
		return getScrollData(firstResult, maxResult, null, null, orderby);
	}

	@Override
	public QueryResult getScrollData(int firstResult, int maxResult,
			String where, Object[] params) {
		return getScrollData(firstResult, maxResult, where, params, null);
	}

	@Override
	@SuppressWarnings("unchecked")
	public QueryResult getScrollData(int firstResult, int maxResult,
			String where, Object[] params, LinkedHashMap orderby) {
		String entityName = clatt.getSimpleName();
		String whereql = where != null && !"".equals(where.trim()) ? " where "
				+ where : "";
		Session session = getSession();
		Query query = session.createQuery("select o from " + entityName + " o"
				+ whereql + buildOrderby(orderby));
		if (firstResult != -1 && maxResult != -1)
			query.setFirstResult(firstResult).setMaxResults(maxResult);
		setQueryParameter(query, params);

		QueryResult qr = new QueryResult();
		// qr.setResultlist(query.getResultList());
		Query queryCount = session.createQuery("select count(o) from "
				+ entityName + " o" + whereql);
		setQueryParameter(queryCount, params);
		long count = (Long) queryCount.uniqueResult();
		qr.setTotalCount(count);
		qr.setDatas(query.list());
		return qr;
	}

	/**
	 *       
	 * 
	 * @param query
	 *                
	 * @param params
	 *               
	 */
	public static void setQueryParameter(Query query, Object[] params) {
		if (params != null) {
			for (int i = 0; i < params.length; i++) {
				query.setParameter(i, params[i]);
			}
		}
	}

	/**
	 *       
	 * 
	 * @param orderby
	 *                 asc/desc, Key   ,Value asc/desc
	 * @return
	 */
	public static String buildOrderby(LinkedHashMap orderby) {
		StringBuilder sb = new StringBuilder();
		if (orderby != null && !orderby.isEmpty()) {
			sb.append(" order by ");
			for (Map.Entry entry : orderby.entrySet()) {
				sb.append("o.").append(entry.getKey()).append(" ")
						.append(entry.getValue()).append(',');
			}
			sb.deleteCharAt(sb.length() - 1);
		}
		return sb.toString();
	}

}

#CarDaoImpl.java
@Repository("carDao")
public class CarDaoImpl extends BaseDaoImpl implements CarDaoInter{
	//             clazz ,        
	public CarDaoImpl() {
		super(Car.class);
	}	
}

#DriverDaoImpl.java
@Repository(value="driverDao")
public class DriverDaoImpl extends BaseDaoImpl implements DriverDaoInter{
	//             clazz ,        
	public DriverDaoImpl() {
		super(Driver.class);
	}
	
}

#BaseService.java

#CarService.java
public interface CarServiceInter extends BaseServiceInter{
	
}

#DriverService.java
public interface DriverServiceInter extends BaseServiceInter{
	
}

#BaseServiceImpl.java
@Transactional(propagation=Propagation.REQUIRED)
public abstract class BaseServiceImpl implements BaseServiceInter {

	@Autowired
	private BaseDaoInter baseDao;		//      session  【  get,set  】
	
	@Override
	public K save(T t) {
		return baseDao.save(t);
	}

	@Override
	public void saveAll(Collection ct) {
		baseDao.saveAll(ct);
	}

	@Override
	public T findById(K id) {
		return baseDao.findById(id);
	}

	@Override
	public T update(T t) {
		return baseDao.update(t);
	}

	@Override
	public T saveOrUpdate(T t) {
		return baseDao.saveOrUpdate(t);
	}

	@Override
	public void delete(T t) {
		baseDao.delete(t);
	}

	@Override
	public void deleteAll(Collection ct) {
		baseDao.deleteAll(ct);
	}

	@Override
	public boolean deleteById(K id) {
		return baseDao.deleteById(id);
	}

	@Override
	public QueryResult loadAll() {
		return baseDao.loadAll();
	}

	@Override
	public QueryResult load(int page, int rows) {
		return baseDao.load(page, rows);
	}

	@Override
	public long getTotalCount() {
		return baseDao.getTotalCount();
	}
	/******************************HQL******************************/

	@Override
	public QueryResult getScrollData() {
		return baseDao.getScrollData();
	}

	@Override
	public QueryResult getScrollData(int firstResult, int maxResult) {
		return baseDao.getScrollData(firstResult, maxResult);
	}

	@Override
	public QueryResult getScrollData(int firstResult, int maxResult,
			LinkedHashMap orderby) {
		return baseDao.getScrollData(firstResult, maxResult, orderby);
	}

	@Override
	public QueryResult getScrollData(int firstResult, int maxResult,
			String where, Object[] params) {
		return baseDao.getScrollData(firstResult, maxResult, where, params);
	}

	@Override
	public QueryResult getScrollData(int firstResult, int maxResult,
			String where, Object[] params, LinkedHashMap orderby) {
		return baseDao.getScrollData(firstResult, maxResult, where, params, orderby);
	}
	
}

#BaseService
public interface BaseServiceInter  {
	/**
	 *             
	 * @param t         
	 * @return      ID
	 */
	public K save(T t);
	/**
	 *      【  】       
	 * @param ct     【  】
	 */
	public void saveAll(Collection ct);
	/**
	 *   Id      
	 * @param id         id  
	 * @return        
	 */
	public T findById(K id);
	/**
	 *       
	 * @param t             
	 * @return         
	 */
	public T update(T t);
	/**
	 *                 
	 * @param t         
	 * @return         
	 */
	public T saveOrUpdate(T t);
	/**
	 *               
	 * @param t         
	 */
	public void delete(T t);
	/**
	 *       
	 * @param ct        
	 */
	public void deleteAll(Collection ct);
	/**
	 *   id      
	 * @param id      id
	 * @return       (id    )
	 */
	public boolean deleteById(K id);
	/**
	 *         
	 * @return       
	 */
	public QueryResult loadAll();
	/**
	 *         
	 * @param page       
	 * @param rows          
	 * @return  page      
	 */
	public QueryResult load(int page,int rows);
	/**
	 *       
	 * @return   
	 */
	public long getTotalCount();
	/******************************HQL******************************/
	/**
	 *         
	 * @return
	 */
	public QueryResult getScrollData();
	/**
	 *       
	 * @param firstResult     ,      -1,       
	 * @param maxResult         ,      -1,       
	 * @return
	 */
	public QueryResult getScrollData(int firstResult, int maxResult);
	/**
	 *       
	 * @param firstResult     ,      -1,       
	 * @param maxResult         ,      -1,       
	 * @param orderby   ,Key     ,Value asc/desc, :
	 *  LinkedHashMap orderby = new LinkedHashMap();
		orderby.put("email", "asc");
		orderby.put("password", "desc");
	 * @return
	 */
	public QueryResult getScrollData(int firstResult, int maxResult, LinkedHashMap orderby);
	/**
	 *       
	 * @param firstResult     ,      -1,       
	 * @param maxResult         ,      -1,       
	 * @param where     ,  where   ,            ,         1  , :o.username=?1 and o.password=?2
	 * @param params             
	 * @return
	 */
	public QueryResult getScrollData(int firstResult, int maxResult, String where, Object[] params);
	/**
	 *       
	 * @param firstResult     ,      -1,       
	 * @param maxResult         ,      -1,       
	 * @param where     ,  where   ,            ,         1  , :o.username=?1 and o.password=?2
	 * @param params             
	 * @param orderby   ,Key     ,Value asc/desc, :
	 *  LinkedHashMap orderby = new LinkedHashMap();
		orderby.put("email", "asc");
		orderby.put("password", "desc");
	 * @return
	 */
	public QueryResult getScrollData(int firstResult, int maxResult, String where, Object[] params, LinkedHashMap orderby);

}

#CarServiceImpl.java
@Service("carProxy")
public class CarServiceImpl extends BaseServiceImpl implements CarServiceInter {
    @Autowired
    private CarDaoInter carDao;        //      session  【  get,set  】
}

#DriverServiceImpl.java
@Service("driverProxy")
public class DriverServiceImpl extends BaseServiceImpl implements DriverServiceInter {
	@Autowired
	private DriverDaoInter driverDao;		//      session  【  get,set  】
}

좋은 웹페이지 즐겨찾기