Spring Dao层设计

来源:互联网 发布:mac git 排除目录 编辑:程序博客网 时间:2024/04/28 20:10

Spring DAO层设计

         Spring 为各种ORM框架提供了基于模板的Teplate ,同时还提供一支持类,通过支持类可能方便的使用模板,从而使用模板类方便的操作数据库,其实模板类对于Hibernate 就是对Session的一个代理,对于IBatis来说就是SqlMapClient的一个代理,我们可能使用自己的DAO继承SpringSupport,但是在实际的开发中这样的做法存在一定的缺陷,至少在框架的侵入性上面做得不是很好.因此我们可以在支持类的基础上再创建一个基类的方式来简化开发,加强代码利用的力度

 

DAO基类的设计,可以在HibernateDaoSupport的基础上实现自己的DAO,进行封闭,提供泛型的支持,泛型的支持对于对象的更新没有什么影响,但对于对象的检索带来很大的方便,在没有泛型支持的情况查询实体,不仅要指定主键还需要指定实体的类型,由于方法入参比较复杂,调用者还要对返回的结果进行强制转换。

如下图:展示了如何设计一个结构良好的DAO实现

 

package cn.com.snt.spring.dao;

 

import java.io.Serializable;

import java.util.List;

 

public interface BaseDao<T> {

         public T get(Serializable id);

         public List<T> getAll();

         public void save(Object o);

         public void remove(Object o);

         public void update(Object o);

}

 

package cn.com.snt.spring.dao;

public interface ForumDao{

         public long getForumnNumber();

}

package cn.com.snt.spring.dao;

import java.io.Serializable;

import java.util.Iterator;

import java.util.List;

public class ForumHibernateDao extends HibernateDaoBase<Forum> implements ForumDao{

         public long getForumnNumber() {

                   Iterator it=getHibernateTemplate().iterate("select count(f.forumnId) from Forum f");

                   return (Long)it.next();

         }

}

package cn.com.snt.spring.dao;

import java.io.Serializable;

import java.lang.reflect.ParameterizedType;

import java.lang.reflect.Type;

import java.util.List;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

/**

 * 自定义的Dao实现基类

 * @author LEPING LI

 *

 * @param <T>

 */

public class HibernateDaoBase<T> extends HibernateDaoSupport implements BaseDao<T> {

         private Class<T> entityClass;

         public HibernateDaoBase() {

                   Type genType=this.getClass().getGenericSuperclass();

                   Type[] params=((ParameterizedType)genType).getActualTypeArguments();

                   entityClass=(Class)params[0];

         }

         public T get(Serializable id) {

                   return (T)getHibernateTemplate().load(entityClass, id);

         }

         public void remove(Object o) {

                   getHibernateTemplate().delete(o);

         }

         public void save(Object o) {

                   getHibernateTemplate().save(o);

         }

         public void update(Object o) {

                   // TODO Auto-generated method stub

         }

         public List<T> getAll(){

                   return null;

         }

}

 

原创粉丝点击