Dao层和Service层设计

1、Dao接口层
public interface IBaseDao<T, ID extends Serializable>{
public abstract Serializable save(T t);
/*其他接口*/
}
2、StudentDao接口层
public interface IStudentDao extends IBaseDao<Student,Serializable> {
/*只有特殊的接口才在这里声明*/
}
3、BaseDao实现层
为了让BaseDaoImpl实现大部分的数据操作逻辑,必须要从泛型T获取实际的领域对象的类型,关键是理解getGenericSuperclass。
getGenericSuperclass() :
通过反射获取当前类表示的实体(类,接口,基本类型或void)的直接父类的Type,这里如果打印genType,结果为
com.huawei.happycar.dao.impl.BaseDaoImpl<com.huawei.happycar.domain.Student, java.io.Serializable>
getActualTypeArguments():
返回参数数组,参数中的第一个就是我们需要的领域对象类,打印entryClass,结果为
class com.huawei.happycar.domain.Student
再说一遍:
当我们在StudentServerImpl中初始化StudentDaoImpl的时候,会默认初始化调用这个BaseDaoImpl。
此时getClass就是:com.huawei.happycar.dao.impl.StudentDaoImpl
其父类为:com.huawei.happycar.dao.impl.BaseDaoImpl<com.huawei.happycar.domain.Student, java.io.Serializable>,这里要求该父类必须带泛型参数,否则报错
Constructor threw exception; nested exception is java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
接下来,从第一个泛型参数强制转换一下,就得到了领域对象Student。
public class BaseDaoImpl<T, ID extends Serializable> implements IBaseDao<T, ID> {
/*自动注入factory*/
@Autowired
private SessionFactory sessionFactory;
protected Class<T> entityClass;
/*获取第一个泛型类的参数,以确定实体类型*/
public BaseDaoImpl() {
Type genType = getClass().getGenericSuperclass();
Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
entityClass = (Class) params[0];
}
/*sessionFactory*/
public SessionFactory getSessionFactory() {
return sessionFactory;
}
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
/**
* 需要开启事物,才能得到CurrentSession
*/
public Session getSession() {
Session session = null;
try
{
session = sessionFactory.getCurrentSession();
}
catch(HibernateException ex)
{
session = sessionFactory.openSession();
}
return session;
}
/*具体接口实现*/
......
}
4、StudentDao实现层
@Repository("studentDaoImplBean")
public class StudentDaoImpl extends BaseDaoImpl<Student, Serializable> implements IStudentDao{
/*只实现特殊的接口*/
}
5、Service接口
public interface StudentService {
Serializable saveStudent(Student student);
List<Student> listAllStudent();
Page<Student> getSutdentPage(String currentPageNum);
}
6、Service实现
@Service("studentServiceBean")
public class StudentServiceImpl implements StudentService {
/*自动注入*/
@Autowired
public StudentDaoImpl studentDaoImpl;
@Override
public Serializable saveStudent(Student student) {
return studentDaoImpl.save(student);
}
}
Dao层和Service层设计的更多相关文章
- DAO层,Service层,Controller层、View层 的分工合作
DAO层:DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DAO的接口,然后在Spring的配置文件中定义此接口的实现类,然后就可在模块中调用此接口 ...
- [转]DAO层,Service层,Controller层、View层
来自:http://jonsion.javaeye.com/blog/592335 DAO层 DAO 层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DA ...
- DAO层,Service层,Controller层、View层
DAO层:DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DAO的接口,然后在Spring的配置文件中定义此接口的实现类,然后就可在模块中调用此接口 ...
- 分层 DAO层,Service层,Controller层、View层
前部分摘录自:http://blog.csdn.net/zdwzzu2006/article/details/6053006 DAO层:DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务 ...
- DAO层,Service层,Controller层、View层介绍
来自:http://jonsion.javaeye.com/blog/592335 DAO层 DAO 层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DA ...
- DAO层,Service层,Controller层、View层协同工作机制
转自 http://www.blogdaren.com/post-2024.html DAO层:DAO层主要是做数据持久层的工 作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计D ...
- DAO层,Service层,Controller层、View层、entity层
1.DAO(mapper)层:DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DAO的接口,然后在Spring的配置文件中定义此接口的实现类,然后就 ...
- java中Action层、Service层和Dao层的功能区分
Action/Service/DAO简介: Action是管理业务(Service)调度和管理跳转的. Service是管理具体的功能的. Action只负责管理,而Service负责实施. DAO只 ...
- 搭建DAO层和Service层代码
第一部分建立实体和映射文件 1 通过数据库生成的实体,此步骤跳过,关于如何查看生成反向工程实体类查看SSH框架搭建教程-反向工程章节 Tmenu和AbstractorTmenu是按照数据库表反向工程形 ...
- Java中Action层、Service层、Modle层和Dao层的功能区分
一.Java中Action层.Service层.Modle层和Dao层的功能区分: 首先,这是现在最基本的分层方式,结合了SSH架构. modle层就是对应的数据库表的实体类.(即domain) Da ...
随机推荐
- SiteMesh学习笔记
SiteMesh是一个轻量级的web应用框架,实现了Decorator模式.它的目标是将多个页面都将引用的jsp页面通过配置加载到相应的jsp文件中. 在我们的项目中,每个jsp都需要添加两个top和 ...
- SSO-Javascript模拟IE登录,不让IIS弹出登录窗口
解决方案: 用JS模拟IE用户登录,再跳转到对应的系统. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transiti ...
- Linux 进程管理剖析--转
地址:http://www.ibm.com/developerworks/cn/linux/l-linux-process-management/index.html Linux 是一种动态系统,能够 ...
- maven管理多模块系统
1.创建mydemo项目cd d:\myworkmvn archetype:create -DgroupId=com.example.mydemo -DartifactId=mydemo 生成myde ...
- [转]关于ASP.NET(C#)程序中TEXTBOX下动态DIV跟随[AJAX应用]
本文转自:http://blog.csdn.net/lolenboy/article/details/1665814 说明: 环境:ASPNET(c#),SQL2K 事例:TEXTBOX下跟随DIV, ...
- ZOJ 3209 Treasure Map (Dancing Links)
Treasure Map Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu Submit S ...
- [改善Java代码]减少HashMap中元素的数量
在系统开发中我们经常会使用HashMap作为数据集容器,或者是用缓冲池来处理,一般很稳定,但偶尔也会出现内存溢出的问题(OutOfMemory错误),而且这经常是与HashMap有关的.而且这经常是与 ...
- python方式实现scoket通信
要想明白这个网络通信还真的是离不开实现它实现流程图,看明白了大体很多都知道,觉得这个博主画的不错,地址是 http://www.cnblogs.com/wangcq/p/3520400.html 1. ...
- CSS行高--line-height
遇到的问题:在css中,不理解line-height:1与line-height:1px的区别 发现的过程:最近在学做一个网站的过程中,设置两行文字之间的行高时需要用到line-height,发现了这 ...
- http协议的总结说明
关于http协议已经有很多大牛们的讨论,从他们的文章中获益匪浅,作为一个通信专业的学生,还是想从计算机网络的角度谈一下自己的认识.http协议全称超文本传输协议,是一种允许将超文本标记语言(HTML) ...