MySQL数据库学习笔记(十一)----DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)
【声明】
欢迎转载,但请保留文章原始出处→_→
生命壹号:http://www.cnblogs.com/smyhvae/
文章来源:http://www.cnblogs.com/smyhvae/p/4059514.html
【正文】
一、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工具类。好了,下面直接上代码。
三、代码实现
我们一下面的这张数据表为例:

新建Java工程文件DaoTest01,最终的工程文件结构如下:

- DBUtils:初步封装的JDBC工具类;
- db-config.properties:属性文件,方便修改配置信息;
- Person类就是领域模型,表示是对它(数据库表)进行增删改查。
- PersonDao接口:专门对Person类进行操作(例如增删改查)的接口。注:这里不直接写操作类,是因为接口利于维护,可以在这里写上公共的代码。一个领域模型对应一个Dao接口。
- PeronDaoImpl类:实现上面的PeronDao接口
步骤如下:
注:第(1)、(2)步操作和上一篇博文是一模一样的,这里只是为了保证本篇文章的完整性,所以重新写一下。
(1)先新建一个DBUtils工具类:(package com.util.db)
package com.util.db; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ResourceBundle; /**
* 数据库操作工具类
* @author lamp
*
*/
public class DBUtils { //数据库连接地址
public static String URL;
//用户名
public static String USERNAME;
//密码
public static String PASSWORD;
//mysql的驱动类
public static String DRIVER; private static ResourceBundle rb = ResourceBundle.getBundle("com.util.db.db-config"); private DBUtils(){} //使用静态块加载驱动程序
static{
URL = rb.getString("jdbc.url");
USERNAME = rb.getString("jdbc.username");
PASSWORD = rb.getString("jdbc.password");
DRIVER = rb.getString("jdbc.driver");
try {
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//定义一个获取数据库连接的方法
public static Connection getConnection(){
Connection conn = null;
try {
conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
} catch (SQLException e) {
e.printStackTrace();
System.out.println("获取连接失败");
}
return conn;
} /**
* 关闭数据库连接
* @param rs
* @param stat
* @param conn
*/
public static void close(ResultSet rs,Statement stat,Connection conn){
try {
if(rs!=null)rs.close();
if(stat!=null)stat.close();
if(conn!=null)conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
} }
注意:26行中,注意获取属性文件的包名是否正确。稍后会定义这个属性文件。
28行:既然是工具类,一般不要实例化,此时可以采用单例设计模式,或者将构造方法私有化。
26行:很明显可以看到,我们是将连接数据库的URL、用户名,密码等信息编写在一个属性文件(jdbc.properties)中,稍后再来定义这个属性文件。
31行:为避免重复代码,使用静态代码块:只会在类加载的时候执行一次。
42行:定义一个获取数据库连接的方法
60行:关闭数据库连接
(2)接下来新建一个属性文件,new-->file,命名为:db-config.properties,代码如下:
jdbc.url=jdbc:mysql://localhost:3306/jdbcdb
jdbc.username=root
jdbc.password=smyh
jdbc.driver=com.mysql.jdbc.Driver
以后如果需要修改配置信息,只需要在这里改就行了。注意在上面的DBUtils类中是怎么来调用这个配置信息的。
紧接着新建文件,定义好Person类:(package com.vae.domain)
package com.vae.domain;
public class Person {
private int id;
private String name;
private int age;
private String description;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Person(int id, String name, int age, String description) {
super();
this.id = id;
this.name = name;
this.age = age;
this.description = description;
}
public Person(String name, int age, String description) {
super();
this.name = name;
this.age = age;
this.description = description;
}
public Person() {
super();
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age
+ ", description=" + description + "]";
}
}
这个Person类就是领域模型,表示是对它进行增删改查。
(3)定义PersonDao接口:专门对Person类进行操作(例如增删改查)的接口(package com.vae.dao)
package com.vae.dao; import java.sql.SQLException;
import java.util.List; import com.vae.domain.Person; public interface PersonDao {
//添加方法
public void add(Person p)throws SQLException; //更新方法
public void update(Person p)throws SQLException; //删除方法
public void delete(int id)throws SQLException; //查找方法
public Person findById(int id)throws SQLException; //查找所有
public List<Person> findAll()throws SQLException; }
(4)定义PeronDaoImpl实现类 ,实现上面的PeronDao接口(package com.vae.dao.impl)
package com.vae.dao.impl; import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List; import com.util.db.DBUtils;
import com.vae.dao.PersonDao;
import com.vae.domain.Person; /**
* PersonDao的具体实现类
* @author lamp
*
*/
public class PersonDaoImpl implements PersonDao{ /**
* 实现添加方法
*/
@Override
public void add(Person p) throws SQLException {
Connection conn = null;
PreparedStatement ps = null;
String sql = "insert into person(name,age,description)values(?,?,?)";
try{
conn = DBUtils.getConnection();
ps = conn.prepareStatement(sql);
ps.setString(1, p.getName());
ps.setInt(2, p.getAge());
ps.setString(3, p.getDescription());
ps.executeUpdate();
}catch(SQLException e){
e.printStackTrace();
throw new SQLException("添加数据失败");
}finally{
DBUtils.close(null, ps, conn);
}
} /**
* 更新方法
*/
@Override
public void update(Person p) throws SQLException {
Connection conn = null;
PreparedStatement ps = null;
String sql = "update person set name=?,age=?,description=? where id=?";
try{
conn = DBUtils.getConnection();
ps = conn.prepareStatement(sql);
ps.setString(1, p.getName());
ps.setInt(2, p.getAge());
ps.setString(3, p.getDescription());
ps.setInt(4, p.getId());
ps.executeUpdate();
}catch(SQLException e){
e.printStackTrace();
throw new SQLException("更新数据失败");
}finally{
DBUtils.close(null, ps, conn);
}
} /**
* 删除方法
*/
@Override
public void delete(int id) throws SQLException {
Connection conn = null;
PreparedStatement ps = null;
String sql = "delete from person where id=?";
try{
conn = DBUtils.getConnection();
ps = conn.prepareStatement(sql);
ps.setInt(1,id);
ps.executeUpdate();
}catch(SQLException e){
e.printStackTrace();
throw new SQLException(" 删除数据失败");
}finally{
DBUtils.close(null, ps, conn);
}
} /**
* 根据ID查询一个对象
*/
@Override
public Person findById(int id) throws SQLException {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
Person p = null;
String sql = "select name,age,description from person where id=?";
try{
conn = DBUtils.getConnection();
ps = conn.prepareStatement(sql);
ps.setInt(1, id);
rs = ps.executeQuery();
if(rs.next()){
p = new Person();
p.setId(id);
p.setName(rs.getString(1));
p.setAge(rs.getInt(2));
p.setDescription(rs.getString(3));
}
}catch(SQLException e){
e.printStackTrace();
throw new SQLException("根据ID查询数据失败");
}finally{
DBUtils.close(rs, ps, conn);
}
return p;
} /**
* 查询所有数据
*/
@Override
public List<Person> findAll() throws SQLException {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
Person p = null;
List<Person> persons = new ArrayList<Person>();
String sql = "select id,name,age,description from person";
try{
conn = DBUtils.getConnection();
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
while(rs.next()){
p = new Person();
p.setId(rs.getInt(1));
p.setName(rs.getString(2));
p.setAge(rs.getInt(3));
p.setDescription(rs.getString(4));
persons.add(p);
}
}catch(SQLException e){
e.printStackTrace();
throw new SQLException("查询所有数据失败");
}finally{
DBUtils.close(rs, ps, conn);
}
return persons;
} }
我们在各自的增删改查里都抛出了异常,如果出现异常,就会抛出相应的错误信息。
总结:这样的话,我们就封装好了JDBC的工具类。以后如果要用的话,可以直接在主方法里调用这个类就行了。
【工程文件】
链接:http://pan.baidu.com/s/1qW6tew8
密码:t98s
MySQL数据库学习笔记(十一)----DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)的更多相关文章
- DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)
DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类) 一.DAO模式简介 DAO即Data Access Object,数据访问接口.数据访问:故名思义就是与数据库打交道.夹在业务逻辑与数据 ...
- Mysql学习笔记(三)对表数据的增删改查。
正文内容. 这一部分是最简单的,也是最麻烦的.简单是因为其实只包括增删该插四个部分.大体上看,增加数据.删除数据.修改数据.查询数据都不麻烦啊,我们日常都是常用的.这个谁不会呢?以前在培训机构学mys ...
- 【EF6学习笔记】(二)操练 CRUD 增删改查
本篇原文链接: Implementing Basic CRUD Functionality 说明:学习笔记参考原文中的流程,为了增加实际操作性,并能够深入理解,部分地方根据实际情况做了一些调整:并且根 ...
- EF6 学习笔记(二):操练 CRUD 增删改查
EF6学习笔记总目录 ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 接上篇: EF6 学习笔记(一):Code First 方式生成数据库及初始化数据库实际操作 本篇原文链接: I ...
- mongodb的学习笔记一(集合和文档的增删改查)
1数据库的增删改查 一.增加一个数据库: use blog-----切换到指定的数据库,如果数据库不存在,则自动创建该数据库(新建的数据库,如果没有存储对应的集合,是不会显示出来的) 二.删除一个数据 ...
- oracle学习笔记系列------oracle 基本操作之表的增删改查
--创建一个表 CREATE TABLE employee_souvc( id ), name ), gender ), birth DATE, salary ,), job ), deptno ) ...
- Mysql学习笔记(二)对表结构的增删改查
有将近一个星期都没有更新mysql了.相反linux的东西倒是学习不少.可能我个人情感上对linux更感兴趣一点.但mysql我也不烦,只是一旦将精力投入到了一样事情上去,就很难将精力分散去搞其他的东 ...
- MySQL数据库学习笔记(十)----JDBC事务处理、封装JDBC工具类
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- 第二百七十六节,MySQL数据库,【显示、创建、选定、删除数据库】,【用户管理、对用户增删改查以及授权】
MySQL数据库,[显示.创建.选定.删除数据库],[用户管理.对用户增删改查以及授权] 1.显示数据库 SHOW DATABASES;显示数据库 SHOW DATABASES; mysql - 用户 ...
随机推荐
- Python参数组合
参数定义的顺序必须是:①必选参数.②默认参数.③可选参数.④命名关键字参数.⑤关键字参数 #a,b为必选参数:c为默认参数:args为可变参数:kw为关键字参数 def f1(a,b,c=0,*arg ...
- SharePoint DateTimeControl 使用
首先,需要引用: <%@ Register TagPrefix="SharePoint" Namespace="Microsoft.SharePoint.WebCo ...
- Win10安装framework3.5
.NET少不了framewrok,其版本也比较多,默认情况下win7及上版本没有安装framework3.5,但有些软件又需要它,比如arcgis软件在安装时会检测是否存在3.5,如果没有,将不会正常 ...
- CAS实现单点登入(sso)经典教程
本教程我已按照步骤实现,不过要深入了解单点登入还需要进一步的学习,掌握其中的精髓. 一.简介 1.cas是有耶鲁大学研发的单点登录服务器 2.本教材所用环境 Tomcat7.2 JDK6 CAS Se ...
- IOS开发之SVN的使用
关于SVN的一个使用细节
- apt-get报错could not get lock /var/lib/dpkg/lock -open等
用apt-get命令安装一些软件包时,总报错:E:could not get lock /var/lib/dpkg/lock -open等 出现这个问题的原因可能是有另外一个程序正在运行,导致资源被锁 ...
- Hadoop从伪分布式到真正的分布式
对这两天学习hadoop的一个总结,概念就不提了.直接说部署的事,关于如何部署hadoop网上的资料很多, 比较经典的还是Tim在IBM developworks上的系列文章 http://www.i ...
- 用java程序输出自己的姓名
代码部分: public class Hello { public static void main(String[] args) { System.out.println("$$$$$$$ ...
- Cocos2d-x分类
Cocos2d-x win7 + vs2010 配置图文详解(亲测) Cocos2d-x建工程时避免copy文件夹和库
- C#拖放实现餐饮系统转台操作
转台是餐饮系统中常用的操作,一般系统都是右键选择弹出目标台界面,然后选择目标台确定,现在我们把需要转的台通过拖动到目标台图标上面就可以实现前面的操作,简单快捷. 转台操作时: 转台成功后: /// & ...