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