在上一篇已经介绍了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查询的。
分享到:
相关推荐
概述bearcat-dao 是一个 node.js 基于 SQL mapping 的 DAO 框架。实现了基于 SQL mapping 来对数据结果集进行映射,是一种半自动化的模式,相比较于 O/R mapping 全自动化的模式。 因此,在 bearcat-dao 里,开发者...
存贮过程进行操作,目前还有待完善,可以不用hibernate-generic-dao - Generic DAO, 用Spring3.2.0和Hibernate4替换,就是一个非常好的Struts2+Spring3+Hibernate4基于annotation的零配置的开发框架 借鉴网友的经验...
使用IDEA开发工具、SpringBoot工程、SSM框架、实现DAO层数据层开发案例讲解。
22.项目1-地区销售额-项目需求分析和分区Trident Spout开发 23.项目1-地区销售额-Trident代码开发一 24.项目1-地区销售额-Trident代码开发二 25.项目1-地区销售额-基于HBase存储的State运用 26.项目2-省份销售排行-...
使用Eclipse开发工具、SpringBoot工程、SSM框架、实现DAO层数据层开发案例讲解。
数据库访问层 -- Nutz.Dao 反转注入支持 -- Nutz.Ioc Mvc 框架 -- Nutz.Mvc Json 解析器 -- Nutz.Json 更多的简化Java语法的函数和类 -- Nutz.Lang 以及 Nutz.Castors 不依赖任何第三方 Jar 包,从而便于程序员建立...
22.项目1-地区销售额-项目需求分析和分区Trident Spout开发 23.项目1-地区销售额-Trident代码开发一 24.项目1-地区销售额-Trident代码开发二 25.项目1-地区销售额-基于HBase存储的State运用 26.项目2-省份销售排行-...
TomKingDAO-猫王DAO框架
在经典的J2EE四层体系结构的基础上增加数据持久层,提出了基于J2EE五层体系结构的Web开发框架;分析了基于Struts框架的J2EE架构中实现对象持久性的局限性,从中分离出对象持久层,并将Hibernate这个面向对象的轻量级...
完整版 Java开发实训课程系列-MyBatis框架技术 02.MyBatis核心配置与DAO开发(共34页).pptx 完整版 Java开发实训课程系列-MyBatis框架技术 03.MyBatis关联映射查询与缓存配置(共25页).pptx 完整版 Java开发实训...
22.项目1-地区销售额-项目需求分析和分区Trident Spout开发 23.项目1-地区销售额-Trident代码开发一 24.项目1-地区销售额-Trident代码开发二 25.项目1-地区销售额-基于HBase存储的State运用 26.项目2-省份销售排行-...
22.项目1-地区销售额-项目需求分析和分区Trident Spout开发 23.项目1-地区销售额-Trident代码开发一 24.项目1-地区销售额-Trident代码开发二 25.项目1-地区销售额-基于HBase存储的State运用 26.项目2-省份销售排行-...
22.项目1-地区销售额-项目需求分析和分区Trident Spout开发 23.项目1-地区销售额-Trident代码开发一 24.项目1-地区销售额-Trident代码开发二 25.项目1-地区销售额-基于HBase存储的State运用 26.项目2-省份销售排行-...
22.项目1-地区销售额-项目需求分析和分区Trident Spout开发 23.项目1-地区销售额-Trident代码开发一 24.项目1-地区销售额-Trident代码开发二 25.项目1-地区销售额-基于HBase存储的State运用 26.项目2-省份销售排行-...
22.项目1-地区销售额-项目需求分析和分区Trident Spout开发 23.项目1-地区销售额-Trident代码开发一 24.项目1-地区销售额-Trident代码开发二 25.项目1-地区销售额-基于HBase存储的State运用 26.项目2-省份销售排行-...
22.项目1-地区销售额-项目需求分析和分区Trident Spout开发 23.项目1-地区销售额-Trident代码开发一 24.项目1-地区销售额-Trident代码开发二 25.项目1-地区销售额-基于HBase存储的State运用 26.项目2-省份销售排行-...
22.项目1-地区销售额-项目需求分析和分区Trident Spout开发 23.项目1-地区销售额-Trident代码开发一 24.项目1-地区销售额-Trident代码开发二 25.项目1-地区销售额-基于HBase存储的State运用 26.项目2-省份销售排行-...
22.项目1-地区销售额-项目需求分析和分区Trident Spout开发 23.项目1-地区销售额-Trident代码开发一 24.项目1-地区销售额-Trident代码开发二 25.项目1-地区销售额-基于HBase存储的State运用 26.项目2-省份销售排行-...
Spring-springMVC-Mybatis通用Dao框架,附带sql文件,下载导入开发工具可直接运行查看效果
java web 开发框架学习java web 开发框架学习java web 开发框架学习java web 开发框架学习java web 开发框架学习java web 开发框架学习