在上一篇已经介绍了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查询的。