DAO-数据访问对象(Data Access Object),是将业务逻辑层与持久性数据层解耦的一个集成层模式,它处理与持久性数据(关系数据库、面向对象数据库、纯文件、集成时遇到的遗产或者异类系统)的事务性交互,生成VO-值对象(Value Object)并将其返回给业务逻辑层。这样,业务逻辑层就不需要了解持久性数据的具体操作,而是直接操作值对象。(JSP页面里不会再有Connection conn = DriverManager.getConnection……什么的了)
这样,DAO模式中的四个参与角色就很明白了:
业务对象Business Object
数据访问对象Data Access Object
数据源Data Source
值对象Value Object
DAO模式实际上是一种代理模式,使对象(资源)的访问具有间接性,分类资源层和其他层客户端,如业务层或者表示层。
一个典型的 DAO 实现有以下组件:
一个 DAO 工厂类
一个 DAO 接口
一个实现了 DAO 接口的具体类
数据传输对象(有时称为值对象)
具体的 DAO 类包含访问特定数据源的数据的逻辑。
以上是从Core J2EE Patterns书中DAO一节以及一些网上资料中摘录的,Hibernate作为一个ORM的实现,分离出了持久层的操作,所以也是DAO模式。参照DAO的基本组件构架和“与猫同乐”的那个简单的例子,来分析一下Hibernate的基本构架和关键类。
DAO接口:net.sf.hibernate.Session接口,获取实例的方法SessionFactory.openSession();
Session接口是Hibernate应用的主要接口,一个Session实例是轻量级的,可以轻易的创建和销毁,由于应用程序在调用Hibernate时,会经常性的创建和销毁Session实例,所以Session实例必须是轻量级的。同时,Session不是线程安全的,一个session能并只能被一个线程调用。
Session处理对象的各种持久性操作,如存储、重新载入等,ses.save(princess);
DAO工厂类:net.sf.hibernate.SessionFactory类,生成方法
sessionFactory = new Configuration().configure().buildSessionFactory();
由于Hibernate的配置信息存放在xml里,所以由一个net.sf.hibernate.cfg.Configuration类来完成配置,它的configure()方法将读取hibernate.cfg.xml里的内容,Configuration是使用Hibernate需要的第一个类,以后使用的SessionFactory和Session等多为接口。具体的配置过程参见Configuration类的protected Configuration doConfigure(org.dom4j.Document doc) throws HibernateException;方法。
SessionFactory接口向应用程序提供Session实例,SessionFactory不是轻量级的,所以最好被所有的应用共享,通常为每个数据源创建一个SessionFactory。SessionFactory会处理各个ORM配置XML(Cat.hbm.xml),在它的实现类的构造函数里就载入所有的Mapping配置,见net.sf.hibernate.impl.SessionFactoryImpl的构造函数。