16.3 代码实现参考

16.3 代码实现参考

数据层负责与数据库连接,并提供实体对象的创建、查询、更新和删除等操作。当客户端通过应用服务器与数据库建立连接之后,每个线程与数据库只有一个连接对象。每当需要操作数据库时,就获得这个连接对象。DatabaseConnection类负责与数据库的连接以及对连接对象的维护。

【代码16.18】DatabaseConnection类

在代码16.18的第12行中,Thread Local可以称为线程本地变量,它是一种特殊的线程绑定机制,将变量与线程绑定在一起,为每一个线程维护一个独立的变量副本。在一个线程周期内,无论在哪个层级,只需通过其提供的get()方法就可轻松获取对象,不需要将对象进行多次的传递,这极大地提高了对于“线程级变量”的访问便利性。而本例中的变量就是当前线程与数据库的连接对象——Connection对象。

要获得与数据库的连接对象,只能通过调用代码16.18中第35行的静态方法DatabaseConnection.getConnection()实现。类DatabaseConnection是不需要创建对象的,所以代码16.18中的第14行将DatabaseConnection类的构造方法私有化。

要关闭与数据库的连接,需通过调用第44行的静态方法DatabaseConnection.close()实现。

数据层主要提供实体对象的创建、查询、更新和删除等操作,这里通过IDAO接口规范所有数据层类需要提供的方法。

【代码16.19】IDAO接口

数据层的操作针对的是数据库中的具体数据表,具体的数据表除了需要IDAO接口中的方法外,还可能需要其他操作,由此,针对每个数据表有单独的数据层规范接口,这些接口首先继承IDAO接口,然后针对不同的数据表操作给出调整和补充。

【代码16.20】IDeptDAO接口

【代码16.21】IEmp DAO接口

若数据层提供了接口,上层的业务层就可以面向数据层的接口编程了,与数据层方法的实现相分离。接下来介绍在数据层提供相关接口的实现类。

【代码16.22】DeptDAOImpl类

【代码16.23】Emp DAOImpl类

业务层在调用数据层功能的时候,需要调用数据层实现类的方法,并获得数据层实现类的对象。而数据层实现类是有可能改变的,数据层应该给业务层提供统一的获取数据层实例化对象的途径,使得数据层实现类的替换对于业务层也是透明的。下面通过DAOFactory类来提供获得数据层实现类对象的统一方法。

【代码16.24】DAOFactory类

数据层主要类的关系如图3.16.5所示。

图3.16.5 数据层主要类的关系

总结如下。

(1)数据层的功能

数据层负责持久化技术的实现(所谓持久化技术,指的是内存数据和外存数据之间的转换技术,典型的情况是内存中的对象模型与外存中的关系模型之间的转换。简单说,就是内存中的对象向外存中的关系型数据库进行存入或取出)。数据层对每个数据库中的数据表都提供一个类,实现该数据表的CRUD操作(增加、查询、更新、删除)。

(2)数据层的意义

数据层提供了数据访问的接口,数据库访问的细节对于上层的业务层是透明的,业务层可以专注于业务逻辑的实现。并且,持久化技术的切换(如不同数据库的移植)只局限在数据层的完成上,这提高了系统的可维护性、可复用性。

(3)数据层的组成

数据层一般包括DAO接口、DAO接口的实现类、DAO工厂类。

(4)持久化技术的实现框架

所谓框架,就是指实现某种特定任务的软件组件,它与具体的应用软件无关,主要是基本软件架构和体系的部分实现,软件人员可以按照这些架构的应用方式,将这些架构的实现纳入自己的应用系统中,实现更为复杂的应用系统。

本书第3篇中的软件架构设计只是一种简化的实现演示,是多种架构设计方式中的一种。对于持久化技术的实现,当前有比较成熟的实现框架,可以直接在应用系统中采用,如Hibernate、Mybatis等。