上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
1.8 DAO模式
Hibernate已经提供了持久化层的基础架构,用户要做的就是利用这些基础来实现具体的业务。为符合分层的概念,数据访问细节不能和业务逻辑混杂在一起,应该将数据操作的类放在一起,对它们进行某种相似结构的抽象。接下来要介绍的就是一种典型的结构。
DAO(Data Access Object,数据访问对象)模式,是将所有对数据源的访问进行抽象和封装的一种设计模式。它所处的位置在业务层和数据源中间,起到屏蔽业务层了解数据底层设计细节的作用。DAO的设计应该遵循下面3个原则:
(1)面向接口编程,以适应数据底层的变动,向业务层公布的接口应当以DTO(数据传输对象)为参数和返回值。
(2)尽量将增删改查原子化(粒度小一些),这样业务层可以根据业务需求灵活地组合。(3)在包的划分上需要规范,所有DAO类都放在dao包中,如图1.9所示。
图1.9 5iJob包结构
1.8.1 DAO接口示例
下面的代码是5iJob用到的ISeekerDao接口的代码片段:
public interface ISeekerDao { /** * 保存Seeker实例 * @param seeker */ String save(Seeker seeker); }
1.8.2 DAO实现类示例
以下代码是5iJob用到的SeekerDaoImpl类的代码片段,可直接用于上机任务。
public class SeekerDaoImpl implements ISeekerDao { @Override public String save(Seeker seeker) { Session session = HibernateUtil.getSessionFactory().openSession();//使用HibernateUtil Transaction tx = null; try { tx = session.beginTransaction(); String id = (String) session.save(seeker); tx.commit(); return id; } catch (Exception e) { tx.rollback(); throw new RuntimeException(e); } finally { session.close(); } } }
可以看到,SeekerDaoImpl使用了Hibernate API完成了向数据库新增一个Seeker的任务。在业务层,可以这样来使用DAO:
public class SeekerServiceImpl implements ISeekerService { private ISeekerDao dao = new SeekerDaoImpl(); @Override public String register(Seeker seeker) { return dao.save(seeker); } }