使用Hibernate框架轻松连接数据库(蓝桥杯软件大赛培训教材-Java方向)
上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);
            }
        }