天天看点

MySQL数据库学习笔记(十一)----DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)

【正文】

一、dao模式简介

dao即data access object,数据访问接口。数据访问:故名思义就是与数据库打交道。夹在业务逻辑与数据库资源中间。

dao模式实际上是两个模式的组合,即data accessor (数据访问者)模式和 active domain object(领域对象)模式。data accessor 模式实现了数据访问和业务逻辑的分离;active domain object 模式实现了业务数据的对象化封装。

需要注意的是,dao设计模式是java ee中的设计模式,而非java se中的23种设计模式。

二、实现dao模式

一个典型的dao实现有下列几个组件:

一个dao接口;

一个实现dao接口的具体类; 

数据传递对象(dto):有些时候叫做值对象(vo)或领域模型(domain)

这种实现模式就是一个套路,记熟就好了。不过在这之前,如果有不明白的地方,还是要回顾一下之前几篇博文中的知识:preparedstatement接口重构增删改查、封装jdbc工具类。好了,下面直接上代码。

三、代码实现

我们一下面的这张数据表为例:

MySQL数据库学习笔记(十一)----DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)

新建java工程文件daotest01,最终的工程文件结构如下:

MySQL数据库学习笔记(十一)----DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)

dbutils:初步封装的jdbc工具类;

db-config.properties:属性文件,方便修改配置信息;

person类就是领域模型,表示是对它(数据库表)进行增删改查。

persondao接口:专门对person类进行操作(例如增删改查)的接口。注:这里不直接写操作类,是因为接口利于维护,可以在这里写上公共的代码。一个领域模型对应一个dao接口。

perondaoimpl类:实现上面的perondao接口

步骤如下:

注:第(1)、(2)步操作和上一篇博文是一模一样的,这里只是为了保证本篇文章的完整性,所以重新写一下。

(1)先新建一个dbutils工具类:(package com.util.db)

MySQL数据库学习笔记(十一)----DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)
MySQL数据库学习笔记(十一)----DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)

注意:26行中,注意获取属性文件的包名是否正确。稍后会定义这个属性文件。

28行:既然是工具类,一般不要实例化,此时可以采用单例设计模式,或者将构造方法私有化。

26行:很明显可以看到,我们是将连接数据库的url、用户名,密码等信息编写在一个属性文件(jdbc.properties)中,稍后再来定义这个属性文件。

31行:为避免重复代码,使用静态代码块:只会在类加载的时候执行一次。

42行:定义一个获取数据库连接的方法

60行:关闭数据库连接

(2)接下来新建一个属性文件,new-->file,命名为:db-config.properties,代码如下:

以后如果需要修改配置信息,只需要在这里改就行了。注意在上面的dbutils类中是怎么来调用这个配置信息的。

紧接着新建文件,定义好person类:(package com.vae.domain)

MySQL数据库学习笔记(十一)----DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)
MySQL数据库学习笔记(十一)----DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)

这个person类就是领域模型,表示是对它进行增删改查。

(3)定义persondao接口:专门对person类进行操作(例如增删改查)的接口(package com.vae.dao)

MySQL数据库学习笔记(十一)----DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)
MySQL数据库学习笔记(十一)----DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)

(4)定义perondaoimpl实现类 ,实现上面的perondao接口(package com.vae.dao.impl)

MySQL数据库学习笔记(十一)----DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)
MySQL数据库学习笔记(十一)----DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)

我们在各自的增删改查里都抛出了异常,如果出现异常,就会抛出相应的错误信息。

总结:这样的话,我们就封装好了jdbc的工具类。以后如果要用的话,可以直接在主方法里调用这个类就行了。