`
lh44601
  • 浏览: 7045 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

自己写的项目开发框架(4)--开发DAO层

 
阅读更多
在上一篇已经介绍了Persistence的全部功能,主要就是常用的数据库增删改查操作。既然持久类已完成接下来我们就需要通过它去完成我们的DAO层代码的开发了。

1.首先来看看我的DAO层代码:

1)基层的DAO接口:

/**
 * 
 * @author hao.liu
 *
 * @param <T> 制定dao的基本操作是对应的哪个实体类
 * @param <PK> 实体类的主键类型
 */
public interface IBaseDao<T,PK> {
	public PK saveObj(T obj);
	public void updateObj(T obj);
	public void deleteObj(T obj);
	public Object getEntityById(Serializable id);
	public void deleteObjById(Serializable id);
	public void deleteAll(Collection list);
	public List queryList(HQLInfo hql);
	public PageMapBean query(HQLInfo hql);
	public PageMapBean query(HQLInfo hql,Page page);
}



接口提供常用的数据库操作方法。

2)基层的DAO接口的实现类:

/**
 * 
 * @author hao.liu
 *
 * @param <T>
 * @param <PK>
 */

public abstract class BaseDao<T,PK extends Serializable> implements IBaseDao<T, PK> {
	//注入持久类
	private  Persistence persistence;
	//实体类对应的类型
	private Class<T> clazz;
	public BaseDao(){
		//获取实体类的运行时类型
		clazz=(Class<T>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
	}
	@Override
	public PK saveObj(T obj) {
		// TODO Auto-generated method stub
		return (PK)persistence.saveObj(obj);
	}
	@Override
	public void updateObj(T obj) {
		// TODO Auto-generated method stub
		persistence.updateObj(obj);
	}
	@Override
	public void deleteObj(T obj) {
		// TODO Auto-generated method stub
		persistence.deleteObj(obj);
	}
	@Override
	public T getEntityById(Serializable id) {
		return (T)persistence.getEntityById(clazz, id);
	}
	@Override
	public void deleteObjById(Serializable id) {
		// TODO Auto-generated method stub
		 persistence.deleteObjById(clazz, id);
	}
	@Override
	public void deleteAll(Collection list) {
		// TODO Auto-generated method stub
		persistence.deleteAll(list);
	}
	@Override
	public PageMapBean query(HQLInfo hql) {
		// TODO Auto-generated method stub
		return persistence.query(hql);
	}
	
	@Override
	public PageMapBean query(HQLInfo hql,Page page) {
		// TODO Auto-generated method stub
		return persistence.query(hql,page);
	}
	public Persistence getPersistence() {
		return persistence;
	}
	public void setPersistence(Persistence persistence) {
		this.persistence = persistence;
	}
	@Override
	public List queryList(HQLInfo hql) {
		// TODO Auto-generated method stub
		return persistence.queryList(hql);
	}
}

实现类主要是通过persistence类的方法完成数据库的操作。

clazz=(Class<T>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];

上面方法时获取泛型的运行时类型。

为什么要写个接口呢?其实我们也是可以通过写一个DAO将persistence注入给DAO就可以实现数据操作了。但是这样的话每个DAO类中都会有一个增,删,改方法。我通过接口的形式就让我们开发的DAO去实现接口,这样基层DAO中的方法就不需要在DAO中写了。这样代码就重复利用。

2.现在看看基层DAO 在spring中的配置:

<bean id="baseDao" class="com.lh446.commons.dao.BaseDao" abstract="true">
	<property name="persistence" ref="persistence"></property>
	</bean>

注意到配置时候我们的baseDao是abstract,代码中的BaseDao也是abstract,原因是BaseDao中的默认构造函数需要获取泛型类型,spring在注入baseDao时并不知道泛型的实际类型,这样spring注入就失败了。我们将baseDao注入成abstract,通过它的子类来实例化。


3.实现我们的DAO子类:

public interface ICodeDao extends IBaseDao<Code, Integer> {
       public HQLInfo queryCode(CodeDto dto);
}


public class CodeDaoImpl extends BaseDao<Code, Integer> implements ICodeDao {

	@Override
	public HQLInfo queryCode(CodeDto dto) {
		StringBuffer bf=new StringBuffer();
		bf.append(" from Code a ");
		bf.append(" where 1=1 ");
		bf.append(" and a.codeName= :codeName");
		bf.append(" and a.codeValue= :codeValue");
		bf.append(" and a.codeDisValue= :codeDisValue");
		bf.append(" order by a.codeId desc ");
		String sql=HQLInfoHelper.formatSQLStr(bf.toString());
		String[] params=HQLInfoHelper.getParaNames(sql);
		HQLInfo info=HQLInfoHelper.getHQLInfo(sql, params, dto);
		return info;
	}
<bean id="codeDao" class="com.lh446.authority.dao.impl.CodeDaoImpl" parent="baseDao">
	</bean>


这样我们的自己的DAO就能有基层DAO的所有方法了。

下一篇我们将讲解持久类中是如何实现Hibernate和jdbc查询的。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics