一、什么是Dao设计模式

  Dao设计模式封装了操作具体数据库的细节,对业务层提供操作数据库的接口,因此降低了业务层代码与具体数据库之间的耦合,有利于人员分工,增加了程序的可移植性。

  Dao设计模式中主要包含这5个模块:

    1、VO类:VO(Value Object)即值对象,每一个值对象对应一张数据库表,便于我们传递数据。

    2、Dao接口:Dao接口定义了操作数据库的方法,业务层通过调用这些方法来操作数据库。

    3、Dao实现类:操作数据库的方法的具体实现,封装了操作数据库的细节。

    4、Dao工厂类:用于代替new操作,进一步降低业务层与数据层之间的耦合。

    5、数据库连接类:封装了连接数据库、关闭数据库等常用的操作,减少重复编码。

  下面我们应用Dao设计模式来实现一个简单的转账操作,加深对其的理解。

二、Dao设计模式实现

  首先,我们创建vo、dao、factory、util包来分别存放Dao设计模式5个模块的代码。因为我们使用的是JDBC连接MySQL数据库,所以还需要创建一个lib包存放并引用JDBC驱动。除此之外,我们还需要创建一个test包进行代码的测试。创建好后的目录结构如下:

  接着设计一张user表,表中包含了用户基本信息和余额,并插入一些数据。

  根据user表在vo包中创建VO类user.java。

 package vo;

 public class User {

     private int id;

     private String username;

     private int sum;

     public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public int getSum() {
return sum;
} public void setSum(int sum) {
this.sum = sum;
} @Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", sum=" + sum + "]";
} }

  在util包中创建数据库连接类JDBC.java。

 package util;

 import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; public class JDBC {
//获取数据库链接
public static Connection getConnection() {
Connection con = null;
try {
String url = "jdbc:mysql://localhost:3306/user?serverTimezone=Asia/Shanghai";
Class.forName("com.mysql.cj.jdbc.Driver");
con = DriverManager.getConnection(url, "root", "root");
} catch (Exception e) {
e.printStackTrace();
}
return con;
}
//关闭资源
public static void close(Connection con, Statement st, ResultSet rs) {
try {
if (rs != null) {
rs.close();
}
if (st != null) {
st.close();
}
if (con != null) {
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}

  经过分析,该转账系统需要两类数据库操作,分别是“查询用户信息”和“更新用户余额”。因此我们在dao包中创建IUserDao.java接口并定义这两种方法。

 package dao;

 import java.sql.Connection;
import java.sql.SQLException; import vo.User; public interface IUserDao {
//根据用户名查找用户信息
public User selectUserByName(Connection con, User user);
//根据用户名更新用户余额
public int updateSumByName(Connection con, User user) throws SQLException;
}

  接着在dao包中创建该接口的实现类UserDaoImpl.java,实现这两种方法。

 package dao;

 import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException; import util.JDBC;
import vo.User; public class UserDaoImpl implements IUserDao { @Override
public User selectUserByName(Connection con, User user) {
String sql = "select * from user where username = ?";
PreparedStatement pStatement = null;
ResultSet rs = null;
try {
pStatement = con.prepareStatement(sql);
pStatement.setString(1, user.getUsername());
rs = pStatement.executeQuery();
if (rs.next()) {
user.setId(rs.getInt("id"));
user.setUsername(rs.getString("username"));
user.setSum(rs.getInt("sum"));
return user;
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBC.close(null, pStatement, rs);
}
return null;
} @Override
public int updateSumByName(Connection con, User user) throws SQLException {
String sql = "update user set sum = ? where username = ?";
PreparedStatement pStatement = null;
try {
pStatement = con.prepareStatement(sql);
pStatement.setInt(1, user.getSum());
pStatement.setString(2, user.getUsername());
return pStatement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
//抛出异常,便于进行事务处理
throw e;
}finally {
JDBC.close(null, pStatement, null);
}
}
}

  最后,我们还需要在factory包中创建Dao工厂类DaoFactory.java。

 package factory;

 import dao.IUserDao;
import dao.UserDaoImpl; public class DaoFactory {
public static IUserDao getUserDao() {
return new UserDaoImpl();
}
}

  到这里,转账系统的Dao层就设计好了。我们在test包中创建Main.java进行测试。

 package test;

 import java.sql.Connection;
import java.sql.SQLException; import dao.IUserDao;
import factory.DaoFactory;
import util.JDBC;
import vo.User; public class Main { public static void main(String[] args) {
Connection con = JDBC.getConnection();
IUserDao userDao = DaoFactory.getUserDao();
//被转账的用户
User user_in = new User();
user_in.setUsername("ysy");
user_in = userDao.selectUserByName(con, user_in);
System.out.println(user_in);
//转账的用户
User user_out = new User();
user_out.setUsername("管理员");
user_out = userDao.selectUserByName(con, user_out);
System.out.println(user_out);
//转账30元
user_in.setSum(user_in.getSum() + 30);
user_out.setSum(user_out.getSum() - 30);
//事务处理
try {
con.setAutoCommit(false);
userDao.updateSumByName(con, user_in);
userDao.updateSumByName(con, user_out);
con.commit();
} catch (Exception e) {
e.printStackTrace();
try {
con.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
}
//查询转账结果
user_in = userDao.selectUserByName(con, user_in);
System.out.println(user_in);
user_out = userDao.selectUserByName(con, user_out);
System.out.println(user_out);
JDBC.close(con, null, null);
}
}

  执行结果如下:

  最终的目录结构如下:

Dao设计模式简单实现的更多相关文章

  1. 简单的Dao设计模式

    简单的DAO设计模式 这两天学习到了DAO(Data Access Object 数据存取对象)设计模式.想谈谈自己的感受,刚开始接触是感觉有点难,觉得自己逻辑理不清,主要是以前学的知识比较零散没有很 ...

  2. Java Dao设计模式

    一.信息系统的开发架构   客户层-------显示层-------业务层---------数据层---------数据库 1.客户层:客户层就是客户端,简单的来说就是浏览器. 2.显示层:JSP/S ...

  3. JavaBean中DAO设计模式介绍(转)

    一.信息系统的开发架构 客户层-------显示层-------业务层---------数据层---------数据库 1.客户层:客户层就是客户端,简单的来说就是浏览器. 2.显示层:JSP/Ser ...

  4. JavaBean在DAO设计模式简介

    一.信息系统开发框架 客户层-------显示层-------业务层---------数据层---------数据库 1.客户层:客户层是client,简单的来说就是浏览器. 2.显示层:JSP/Se ...

  5. JavaBean中DAO设计模式介绍

    一.信息系统的开发架构 客户层-------显示层-------业务层---------数据层---------数据库 1.客户层:客户层就是client,简单的来说就是浏览器. 2.显示层:JSP/ ...

  6. DAO设计模式(转)

    J2EE开发人员使用数据访问对象(DAO)设计模式把底层的数据访问逻辑和高层的商务逻辑分开.实现DAO模式能够更加专注于编写数据访问代码. 我们先来回顾一下DAO设计模式和数据访问对象. DAO基础  ...

  7. JavaBean中DAO设计模式简介

    一.信息系统的开发架构 客户层-------显示层-------业务层---------数据层---------数据库 1.客户层:客户层就是客户端,简单的来说就是浏览器. 2.显示层:JSP/Ser ...

  8. DAO设计模式

    DAO设计模式 DAO设计模式简介: DAO设计模式可以减少代码量,增强程序的可移植性,提高代码的可读性. DAO(数据库操作对象)设计模式是 JavaEE 数据层的操作.主要由五部分组成: 1.数据 ...

  9. JavaWeb技术(二):DAO设计模式

    1. DAO全称:Data Access Object , 数据访问对象.使用DAO设计模式来封装数据持久化层的所有操作(CRUD),使得数据访问逻辑和业务逻辑分离,实现解耦的目的. 2. 典型的DA ...

随机推荐

  1. 实战 Prometheus 搭建监控系统

    实战 Prometheus 搭建监控系统 Prometheus 是一款基于时序数据库的开源监控告警系统,说起 Prometheus 则不得不提 SoundCloud,这是一个在线音乐分享的平台,类似于 ...

  2. trie树的应用;

    链接:https://ac.nowcoder.com/acm/contest/920/B来源:牛客网 定义一张图的生成链是原图的一棵生成树,且这棵树退化成一条链.我们称一条生成链是原图的最小生成链,当 ...

  3. python 文件,文件夹,路径操作

    判断路径或文件os.path.isabs(...) # 判断是否绝对路径os.path.exists(...) # 判断是否真实存在os.path.isdir(...) # 判断是否是个目录os.pa ...

  4. spring事务配置异常

    spring事务配置不回滚spring事务管理配置,一般来说都是可以回滚的,最近在开发的过程中遇到了一个异常不回滚的问题,最终找到了原因,贴出来一下 1.首先这里定义一个接口 在接口中定义几个方法 2 ...

  5. CentOS6.8上Docker配置阿里云镜像加速器

    1.打开网站https://dev.aliyun.com,点击管理中心,登录阿里云账号(没有的可以注册,也可以用淘宝等第三方账号登录). 2.点击镜像加速器,复制加速器地址 3.配置本机Docker运 ...

  6. java设计模式简述

    1.代理模式:有一个接口或者顶层类(可以是抽象的)A,一个实现类B,一个代理类C,代理类C之所以能够是代理类,是因为1.C也实现了A.2.C持有A的依赖,用来注入真实的实现B.3.C的实现方法中实际调 ...

  7. 启动maven项目时报错Failed to start component [StandardEngine[Tomcat]]: A child container failed during start

    详细错误信息:Failed to execute goal org.apache.tomcat.maven:tomcat7-maven-plugin:2.2:run (default-cli) on ...

  8. xpath 轴定位表达方式

    xpath的使用基本语法: 1.// 从根节点开始,查找对象是全文. 2./ 从当前标签的路径开始查找 3.text()获取当前路径下的文本 4.@+类名或者id名 查找类名或者id的名字 5. .一 ...

  9. P2047 [NOI2007]社交网络(洛谷)

    题目描述 在社交网络 ( Social Network ) 的研究中,我们常常使用图论概念去解释一些社会现象.不妨看这样的一个问题:在一个社交圈子里有 nn 个人,人与人之间有不同程度的关系.我们将这 ...

  10. 关于Python正则表达式findall函数问题详解

    关于Python正则表达式 findall函数问题详解 在写正则表达式的时候总会遇到不少的问题, 特别是在表达式有多个元组的时候.下面看下re模块下的findall()函数和多个表达式元组相遇的时候会 ...