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层设计的更多相关文章

  1. DAO层,Service层,Controller层、View层 的分工合作

    DAO层:DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DAO的接口,然后在Spring的配置文件中定义此接口的实现类,然后就可在模块中调用此接口 ...

  2. [转]DAO层,Service层,Controller层、View层

    来自:http://jonsion.javaeye.com/blog/592335 DAO层 DAO 层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DA ...

  3. DAO层,Service层,Controller层、View层

    DAO层:DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DAO的接口,然后在Spring的配置文件中定义此接口的实现类,然后就可在模块中调用此接口 ...

  4. 分层 DAO层,Service层,Controller层、View层

    前部分摘录自:http://blog.csdn.net/zdwzzu2006/article/details/6053006 DAO层:DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务 ...

  5. DAO层,Service层,Controller层、View层介绍

    来自:http://jonsion.javaeye.com/blog/592335 DAO层 DAO 层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DA ...

  6. DAO层,Service层,Controller层、View层协同工作机制

    转自 http://www.blogdaren.com/post-2024.html DAO层:DAO层主要是做数据持久层的工 作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计D ...

  7. DAO层,Service层,Controller层、View层、entity层

    1.DAO(mapper)层:DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DAO的接口,然后在Spring的配置文件中定义此接口的实现类,然后就 ...

  8. java中Action层、Service层和Dao层的功能区分

    Action/Service/DAO简介: Action是管理业务(Service)调度和管理跳转的. Service是管理具体的功能的. Action只负责管理,而Service负责实施. DAO只 ...

  9. 搭建DAO层和Service层代码

    第一部分建立实体和映射文件 1 通过数据库生成的实体,此步骤跳过,关于如何查看生成反向工程实体类查看SSH框架搭建教程-反向工程章节 Tmenu和AbstractorTmenu是按照数据库表反向工程形 ...

  10. Java中Action层、Service层、Modle层和Dao层的功能区分

    一.Java中Action层.Service层.Modle层和Dao层的功能区分: 首先,这是现在最基本的分层方式,结合了SSH架构. modle层就是对应的数据库表的实体类.(即domain) Da ...

随机推荐

  1. .Net中JS调用后台的方法

    前台方法: <script type="text/jscript"> var k = "test"; var s = '<%=ShowMsg( ...

  2. DataPackage-数据库、表的区域设置和系统不一致导致处理失败

    问题描述:       最近学习Datapackage,创建完之后,部署处理但总是提示某某字段的区域设置和目标字段的区域设置不一致,具体如图:             测试发现其它的数据库表又没有这类 ...

  3. extern的困惑

    摘自:http://blog.csdn.net/fxjtoday/article/details/6021845 如果想明白为什么需要extern, 需要从编译和链接讨论起, 现代编译器一般采用按文件 ...

  4. Hidden Markov Model

    Markov Chain 马尔科夫链(Markov chain)是一个具有马氏性的随机过程,其时间和状态参数都是离散的.马尔科夫链可用于描述系统在状态空间中的各种状态之间的转移情况,其中下一个状态仅依 ...

  5. GLOG使用注意事项

    FLAGS_stderrthreshold     输出到stderr的门限,默认为2(ERROR),默认,ERORR以下的信息不打印到终端 FLAGS_alsologtostderr 当这个全局变量 ...

  6. 深入研究Block用weakSelf、strongSelf、@weakify、@strongify解决循环引用(下)

    深入研究Block捕获外部变量和__block实现原理 EOCNetworkFetcher.h typedef void (^EOCNetworkFetcherCompletionHandler)(N ...

  7. 如何优雅的实现界面跳转 之 统跳协议 - DarwinNativeRouter

    PS 感谢大家的关注,由于我本想开源4个库,除了router, 另外三个分别是native dispatcher, web dispatcher 和 react dispatcher , 所以rout ...

  8. [课程相关]homework-02

    一.如何组织代码 因为这个代码比较简单,用函数就足够了,个人觉得没必要用类,杀鸡不必用牛刀. 代码有点长,主要是加了很多判断参数的部分. 提取了一个公共的递归函数. 用了不少全局变量,可能当做参数传入 ...

  9. 有关ftp4j的FTPListParseException异常

    昨天换了个ftp服务器,发现程序出现了异常it.sauronsoftware.ftp4j.FTPListParseException,网上搜了下,说是FTPClient.list()时it.sauro ...

  10. poj 2057 树形dp 贪心

    思路:设sum[i],le[i],back[i],worm[i]分别表示以i为根节点需要的完成步数,叶子节点数,失败回退步数,以及i是否有虫. #include<iostream> #in ...