dao 设计模式

4次阅读

共计 9041 个字符,预计需要花费 23 分钟才能阅读完成。

介绍
DAO 功能是数据操作. 客户发送数据到显示层, 显示层发送数据到业务层, 业务发送数据到数据层, 数据层进行持久化. 即. 保存进入 databases
一些简称 BO 业务对象的简称 DAO 一个数据访问对象, 增删查改 PO 数据库一条记录, 映射成 javaBean 对象, 拥有 getter/setter 方法
为什么使用
把 jdbc 的操作进行分离, 即数据库的操作和业务进行分离,javabean 是把视图和业务进行分离,dao 是把数据库的操作和业务逻辑进行分离.
DAO 组成
VO
属性,get set 方法组成.VO 是数据库中记录的映射.
DAO
定义操作的接口用于定义数据库的原子化操作, 增删查改
Impl
对接口的实现
Proxy
代理实现类, 通过代理类, 用来调用真实的对象的操作
Factory
工厂类, 通过工厂, 产生 DAO 实例化对象
DAO 栗子
一个雇员表如下

NO
列名称
描述

1
empno
雇员编号 数字表示 长度 4 位

2
ename
雇员姓名 字符串表示 长度 10 位字符串

3
job
雇员工作

4
hiredate
雇佣日期

5
sal
基本工资 小数表示 小数 2 位 整数 5 位

VO
数据库关系映射如下
package com.ming.vo;

import java.util.Date;
// 对数据库记录的映射
public class Emp {
// 雇员编号
private int empno;
// 姓名
private String ename;
// 职位
private String job;
// 日期
private Date hiredate;
// 基本工资
private float sal;

public int getEmpno() {
return empno;
}

public String getEname() {
return ename;
}

public String getJob() {
return job;
}

public Date getHiredate() {
return hiredate;
}

public float getSal() {
return sal;
}

public void setEmpno(int empno) {
this.empno = empno;
}

public void setEname(String ename) {
this.ename = ename;
}

public void setJob(String job) {
this.job = job;
}

public void setHiredate(Date hiredate) {
this.hiredate = hiredate;
}

public void setSal(float sal) {
this.sal = sal;
}
}

数据库连接
定义接口
package com.ming.dbc;

import java.sql.Connection;
// 数据库连接
public interface DataBaseConnection {
public Connection getConnection();
public void close() throws Exception;
}

实现该接口
package com.ming.dbc;

import java.sql.*;

// mysql 数据库连接实栗
public class MysqlDatabaseConnection implements DataBaseConnection{
private static final String DBDRIVER = “com.mysql.cj.jdbc.Driver”;
private static final String DBURL = “jdbc:mysql://47.94.95.84:32786/test”;
private static final String DBUSER = “test”;
private static final String DBPASSWORD = “ABCcba20170607”;
private Connection connection = null;
public MysqlDatabaseConnection() throws Exception {
try{
Class.forName(DBDRIVER);
this.connection = DriverManager.getConnection(DBURL, DBUSER, DBPASSWORD);
}catch (Exception e){
throw e;
}
}
// 获得连接
@Override
public Connection getConnection(){
return this.connection;
}
// 关闭连接
@Override
public void close() throws Exception{
if(this.connection != null){
try{
this.connection.close();
}catch (Exception e){
throw e;
}
}
}
}

设置工厂
package com.ming.dbc;

// 数据库连接工厂
public class DatabaseConnectionFactory {
// 获得实栗
public static DataBaseConnection getDataBaseConnection() throws Exception{
return new MysqlDatabaseConnection();
}
}

dao
定义 dao 接口
package com.ming.dao;

import com.ming.vo.Emp;

import java.util.List;

// 定义 dao 接口
public interface IEmpDAO {
/**
* 数据库增加操作 以 doXXX 方式命名
* @param emp 增加数据的对象
* @return 成功标记
* @throws Exception 异常继续向上抛出
**/
public boolean doCreate(Emp emp) throws Exception;

/**
*
* 查询全部数据 一般以 findXXXX 命名
* @param keyWord 查询关键字
* @return 返回查询结果 一个 Emp 对象表示一行记录
* @throws Exception 异常继续抛出
*/
public List<Emp> findAll(String keyWorld) throws Exception;

/**
* 根据雇员编号查询雇员信息
* @param empno 雇员编号
* @return 雇员 vo 对象
* @throws Exception 异常向上抛出
*/
public Emp findByid(int empno) throws Exception;
}

实现接口
package com.ming.dao;

import com.ming.vo.Emp;
import com.mysql.cj.protocol.Resultset;

import javax.xml.transform.Result;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

// DAO 实栗
public class EmpDAOImpl implements IEmpDAO {
// 数据库连接对象
private Connection connection = null;
// 数据库操作方法
private PreparedStatement preparedStatement = null;

// 构造方法注入数据库连接
public EmpDAOImpl(Connection _connection){
this.connection = _connection;
}

/**
* 数据库增加操作 以 doXXX 方式命名
* 实现数据库增加操作
* @param emp 增加数据的对象
* @return 成功标记
* @throws Exception 异常继续向上抛出
**/
@Override
public boolean doCreate(Emp emp) throws Exception {
// 定义标志位
boolean flag = false;
// sql
String sql = “INSERT INTO emp(empno, ename, job, hiredate, sal) VALUES (?, ?, ?, ?, ?);”;
// 实例化操作对象
this.preparedStatement = this.connection.prepareStatement(sql);
// 赋值操作
this.preparedStatement.setInt(1, emp.getEmpno());
this.preparedStatement.setString(2, emp.getEname());
this.preparedStatement.setString(3, emp.getJob());
this.preparedStatement.setDate(4, new Date(emp.getHiredate().getTime()));
this.preparedStatement.setFloat(5, emp.getSal());
// 更新行数大于 0
if(this.preparedStatement.executeUpdate() > 0){
flag = true;
}
this.preparedStatement.close();
return flag;
}

/**
* 查询全部数据 一般以 findXXXX 命名
*
* @param keyWorld@return 返回查询结果 一个 Emp 对象表示一行记录
* @throws Exception 异常继续抛出
*/
@Override
public List<Emp> findAll(String keyWorld) throws Exception {
List<Emp> all = new ArrayList<Emp>();
String sql = “SELECT empno, ename, job, hiredate, sal FROM emp WHERE ename like ? OR job like ?”;
this.preparedStatement = this.connection.prepareStatement(sql);
this.preparedStatement.setString(1, “%” + keyWorld + “%”);
this.preparedStatement.setString(2, “%” + keyWorld + “%”);
ResultSet resultSet = this.preparedStatement.executeQuery();
Emp emp = null;
while(resultSet.next()){
emp = new Emp();
emp.setEmpno(resultSet.getInt(1));
emp.setEname(resultSet.getString(2));
emp.setJob(resultSet.getString(3));
emp.setHiredate(resultSet.getDate(4));
emp.setSal(resultSet.getFloat(5));
all.add(emp);
}
this.preparedStatement.close();
return all;
}

/**
* 根据雇员编号查询雇员信息
*
* @param empno 雇员编号
* @return 雇员 vo 对象
* @throws Exception 异常向上抛出
*/
@Override
public Emp findByid(int empno) throws Exception {
// 声明 Emp 对象
Emp emp = null;
String sql = “SELECT empno, ename, job, hiredate, sal FROM emp WHERE empno = ?”;
this.preparedStatement = this.connection.prepareStatement(sql);
this.preparedStatement.setInt(1, empno);
ResultSet resultset = this.preparedStatement.executeQuery();
if(resultset.next()){
emp = new Emp();
emp.setEmpno(resultset.getInt(1));
emp.setEname(resultset.getString(2));
emp.setJob(resultset.getString(3));
emp.setHiredate(resultset.getDate(4));
emp.setSal(resultset.getFloat(5));
}
this.preparedStatement.close();
return emp;
}
}

定义代理类
package com.ming.dao;

import com.ming.dbc.DataBaseConnection;
import com.ming.dbc.DatabaseConnectionFactory;
import com.ming.vo.Emp;

import java.util.List;

// 数据库连接代理类
public class EmpDAOProxy implements IEmpDAO{
private DataBaseConnection dataBaseConnection = null;
private IEmpDAO dao = null;
// 实例化连接
public EmpDAOProxy() throws Exception{
// 获得连接对象
dataBaseConnection = DatabaseConnectionFactory.getDataBaseConnection();
// 实例化主题类
this.dao = new EmpDAOImpl(dataBaseConnection.getConnection());
}
/**
* 数据库增加操作 以 doXXX 方式命名
*
* @param emp 增加数据的对象
* @return 成功标记
* @throws Exception 异常继续向上抛出
**/
@Override
public boolean doCreate(Emp emp) throws Exception {
boolean flag = false;
try{
// 插入雇员编号不存在
if(this.dao.findByid(emp.getEmpno()) == null){
// 调用主题直接创建
flag = this.dao.doCreate(emp);
}
}catch (Exception e){
throw e;
}finally {
this.dataBaseConnection.close();
}
return flag;
}

/**
* 查询全部数据 一般以 findXXXX 命名
*
* @param keyWorld@return 返回查询结果 一个 Emp 对象表示一行记录
* @throws Exception 异常继续抛出
*/
@Override
public List<Emp> findAll(String keyWorld) throws Exception {
List<Emp> all = null;
try{
all = this.dao.findAll(keyWorld);
}catch (Exception e){
throw e;
}finally {
this.dataBaseConnection.close();
}
return all;
}

/**
* 根据雇员编号查询雇员信息
*
* @param empno 雇员编号
* @return 雇员 vo 对象
* @throws Exception 异常向上抛出
*/
@Override
public Emp findByid(int empno) throws Exception {
Emp emp = null;
try{
emp = this.dao.findByid(empno);
}catch (Exception e){
throw e;
}finally {
this.dataBaseConnection.close();
}
return emp;
}
}

编写测试类
package com.ming.dao;

import com.ming.vo.Emp;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import javax.swing.text.html.HTMLDocument;
import javax.xml.crypto.Data;

import java.util.Date;
import java.util.Iterator;
import java.util.List;

import static org.junit.Assert.*;

public class EmpDAOProxyTest {
EmpDAOProxy empDAOProxy = null;
Emp emp = null;
String keyWords = null;
@Before
public void setUp() throws Exception {
empDAOProxy = new EmpDAOProxy();
emp = new Emp();
emp.setEname(“ae3365eaa”);
emp.setEmpno(2223453);
emp.setSal(23.2325624f);
emp.setHiredate(new Date());
emp.setJob(“ming4654”);
keyWords = new String(“ming4654”);
}

@After
public void tearDown() throws Exception {
}

@Test
public void doCreate() throws Exception {
if(empDAOProxy.doCreate(emp)){
System.out.println(“ 增加一条记录成功 ”);
}else{
System.out.println(“ 增加一条记录失败 ”);
}
}

@Test
public void findAll() throws Exception {
List<Emp> result = empDAOProxy.findAll(this.keyWords);
// 迭代器遍历对象
Iterator iterator = result.iterator();
// 循环迭代
while(iterator.hasNext()){
Emp tmp = (Emp)iterator.next();
System.out.println(emp.getEname() + emp.getJob() + emp.getEmpno() + emp.getHiredate() + emp.getSal());
}
}

@Test
public void findByid() throws Exception{
int emp = 2223453;
Emp tmp = empDAOProxy.findByid(emp);
System.out.println(tmp.getEname());
}
}
设置工厂
package com.ming.dao;

public class DAOFactory {
public static IEmpDAO getIEmpDAOInstance() throws Exception{
return new EmpDAOProxy();
}
}

设置插入界面 jsp
<%–
Created by IntelliJ IDEA.
User: ming
Date: 19-3-16
Time: 上午 3:10
To change this template use File | Settings | File Templates.
–%>
<%@ page contentType=”text/html;charset=UTF-8″ language=”java” %>
<html>
<head>
<title> 增加雇员 </title>
</head>
<body>
<form action=”./emp_insert_do.jsp” method=”post”>
雇员编号 <input type=”text” name=”empno”/>
雇员姓名 <input type=”text” name=”ename”/>
职位 <input type=”text” name=”job”/>
日期 <input type=”text” name=”hiredate”/>
工资 <input type=”text” name=”sal”/>
<input type=”submit” value=” 注册 ”/>
<input type=”reset” value=” 恢复 ”/>
</form>
</body>
</html>

设置插入成功 jsp
<%@ page import=”com.ming.vo.Emp” %>
<%@ page import=”com.ming.dao.DAOFactory” %>
<%@ page import=”java.util.Date” %>
<%–
Created by IntelliJ IDEA.
User: ming
Date: 19-3-16
Time: 上午 3:12
To change this template use File | Settings | File Templates.
–%>
<%@ page contentType=”text/html;charset=UTF-8″ language=”java” %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
Emp emp = new Emp();
emp.setJob(request.getParameter(“job”));
emp.setEmpno(Integer.parseInt(request.getParameter(“empno”)));
emp.setHiredate(new Date());
emp.setEname(“eee”);
emp.setSal(34.45f);
try{
if(DAOFactory.getIEmpDAOInstance().doCreate(emp)){
%>
<h3> 添加成功 </h3>
<%
%>
<%
}
}catch (Exception e){
e.printStackTrace();
}
%>
</body>
</html>

正文完
 0