热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JavaDAO模式详解与代码示例

DAO(DataAccessObject)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。

DAO(Data Access Object)模式是一种设计模式,用于抽象和封装所有对数据库或其他持久化机制访问的方法。它通过提供一个统一的接口来隐藏底层数据访问的复杂性,使得应用程序的其他部分无需关心数据访问的具体实现。

在实际开发中,DAO模式通常包含以下几个核心组件:

  • VO(Value Object):用于封装从数据库中读取的数据,例如用户信息。
  • DatabaseConnection:用于管理数据库连接的打开和关闭。
  • DAO接口:定义了对数据库操作的方法。
  • DAO实现类:实现了DAO接口中的方法,具体执行数据库操作。
  • DAO代理类:通过代理模式来管理数据库连接的打开和关闭。
  • DAO工厂类:用于创建DAO实例。

一、信息系统开发架构

一个典型的信息系统开发架构可以分为以下几个层次:

  • 客户端层:用户界面,通常是浏览器。
  • 显示层:用于展示数据,通常是JSP或Servlet。
  • 业务层:处理业务逻辑,调用数据层的方法。
  • 数据层:执行具体的数据库操作,如增删改查。
  • 数据库层:存储数据的实际数据库。

二、DAO模式的结构

DAO模式主要由以下几个部分组成:

  • VO(Value Object):用于封装从数据库中读取的数据,例如用户信息。
  • DatabaseConnection:用于管理数据库连接的打开和关闭。
  • DAO接口:定义了对数据库操作的方法。
  • DAO实现类:实现了DAO接口中的方法,具体执行数据库操作。
  • DAO代理类:通过代理模式来管理数据库连接的打开和关闭。
  • DAO工厂类:用于创建DAO实例。

三、DAO模式的好处

DAO模式的主要好处包括:

  • 分离关注点:将数据访问逻辑与业务逻辑分离,提高了代码的可维护性和可测试性。
  • 提高灵活性:可以通过修改DAO实现类来改变数据访问的方式,而无需修改业务逻辑。
  • 降低耦合度:通过接口定义数据访问方法,降低了业务逻辑与数据访问之间的耦合度。

四、DAO包命名规范

为了保持代码的清晰和可维护性,DAO相关的包和类命名应遵循一定的规范:

  • VO类:通常放在`org.vo`包下,例如`Emp.java`。
  • DatabaseConnection类:通常放在`org.dbc`包下,例如`DatabaseConnection.java`。
  • DAO接口和实现类:通常放在`org.dao`和`org.dao.impl`包下,例如`IEmpDAO.java`和`EmpDAOImpl.java`。
  • DAO代理类和工厂类:通常放在`org.dao.impl`和`org.dao.factory`包下,例如`EmpDAOProxy.java`和`DAOFactory.java`。

以下是具体的代码示例:

1. VO类 - `Emp.java`

package org.vo;

import java.util.Date;

public class Emp {
    private int empno;
    private String ename;
    private String job;
    private Date hireDate;
    private float sal;

    public Emp() {}

    // Getters and Setters
    public int getEmpno() { return empno; }
    public void setEmpno(int empno) { this.empno = empno; }
    public String getEname() { return ename; }
    public void setEname(String ename) { this.ename = ename; }
    public String getJob() { return job; }
    public void setJob(String job) { this.job = job; }
    public Date getHireDate() { return hireDate; }
    public void setHireDate(Date hireDate) { this.hireDate = hireDate; }
    public float getSal() { return sal; }
    public void setSal(float sal) { this.sal = sal; }
}

2. 数据库连接管理类 - `DatabaseConnection.java`

package org.dbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DatabaseConnection {
    private Connection con = null;
    private static final String DRIVER = "com.mysql.jdbc.Driver";
    private static final String USER = "root";
    private static final String URL = "jdbc:mysql://localhost:3306/mldn";
    private static final String PASS = "12345";

    public DatabaseConnection() throws SQLException, ClassNotFoundException {
        Class.forName(DRIVER);
        con = DriverManager.getConnection(URL, USER, PASS);
    }

    public Connection getConnection() throws SQLException {
        return con;
    }

    public void close() throws SQLException {
        if (con != null) {
            con.close();
        }
    }
}

3. DAO接口 - `IEmpDAO.java`

package org.dao;

import java.util.List;
import org.vo.Emp;

public interface IEmpDAO {
    boolean doCreate(Emp emp) throws Exception;
    List findAll() throws Exception;
    Emp findById(int empno) throws Exception;
}

4. DAO实现类 - `EmpDAOImpl.java`

package org.dao.impl;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.dao.IEmpDAO;
import org.vo.Emp;

public class EmpDAOImpl implements IEmpDAO {
    private Connection con;
    private PreparedStatement stat = null;

    public EmpDAOImpl(Connection con) {
        this.con = con;
    }

    @Override
    public boolean doCreate(Emp emp) throws SQLException {
        String sql = "INSERT INTO emp(empno, ename, job, hiredate, sal) VALUES(?, ?, ?, ?, ?)";
        stat = con.prepareStatement(sql);
        stat.setInt(1, emp.getEmpno());
        stat.setString(2, emp.getEname());
        stat.setString(3, emp.getJob());
        stat.setDate(4, new java.sql.Date(emp.getHireDate().getTime()));
        stat.setFloat(5, emp.getSal());
        int update = stat.executeUpdate();
        return update > 0;
    }

    @Override
    public List findAll() throws SQLException {
        String sql = "SELECT * FROM emp";
        stat = con.prepareStatement(sql);
        ResultSet rs = stat.executeQuery();
        List list = new ArrayList<>();
        while (rs.next()) {
            Emp emp = new Emp();
            emp.setEmpno(rs.getInt("empno"));
            emp.setEname(rs.getString("ename"));
            emp.setJob(rs.getString("job"));
            emp.setHireDate(rs.getDate("hiredate"));
            emp.setSal(rs.getFloat("sal"));
            list.add(emp);
        }
        return list;
    }

    @Override
    public Emp findById(int empno) throws SQLException {
        String sql = "SELECT * FROM emp WHERE empno=?";
        stat = con.prepareStatement(sql);
        stat.setInt(1, empno);
        ResultSet rs = stat.executeQuery();
        if (rs.next()) {
            Emp emp = new Emp();
            emp.setEmpno(rs.getInt("empno"));
            emp.setEname(rs.getString("ename"));
            emp.setJob(rs.getString("job"));
            emp.setHireDate(rs.getDate("hiredate"));
            emp.setSal(rs.getFloat("sal"));
            return emp;
        }
        return null;
    }
}

5. DAO代理类 - `EmpDAOProxy.java`

package org.dao.impl;

import java.sql.SQLException;

import org.dao.IEmpDAO;
import org.dbc.DatabaseConnection;
import org.vo.Emp;

public class EmpDAOProxy implements IEmpDAO {
    private DatabaseConnection dbc;
    private IEmpDAO dao = null;

    public EmpDAOProxy() throws SQLException, ClassNotFoundException {
        dbc = new DatabaseConnection();
        dao = new EmpDAOImpl(dbc.getConnection());
    }

    @Override
    public boolean doCreate(Emp emp) throws SQLException {
        boolean flag = false;
        if (dao.findById(emp.getEmpno()) == null) {
            flag = dao.doCreate(emp);
        }
        dbc.close();
        return flag;
    }

    @Override
    public List findAll() throws SQLException {
        List list = dao.findAll();
        dbc.close();
        return list;
    }

    @Override
    public Emp findById(int empno) throws SQLException {
        Emp emp = dao.findById(empno);
        dbc.close();
        return emp;
    }
}

6. DAO工厂类 - `DAOFactory.java`

package org.dao.factory;

import org.dao.IEmpDAO;
import org.dao.impl.EmpDAOProxy;

public class DAOFactory {
    public static IEmpDAO getInstance() {
        IEmpDAO dao = null;
        try {
            dao = new EmpDAOProxy();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return dao;
    }
}

7. 测试类 - `TestDAO.java`

package org.dao.test;

import java.sql.SQLException;
import org.dao.IEmpDAO;
import org.dao.factory.DAOFactory;
import org.vo.Emp;

public class TestDAO {
    public static void main(String[] args) throws SQLException, ClassNotFoundException {
        for (int i = 0; i <5; i++) {
            Emp emp = new Emp();
            emp.setEmpno(i);
            emp.setEname("xiazdong-" + i);
            emp.setJob("stu-" + i);
            emp.setHireDate(new java.util.Date());
            emp.setSal(500 * i);
            DAOFactory.getInstance().doCreate(emp);
        }
    }
}

通过使用DAO设计模式,可以在JSP中屏蔽数据库连接的操作,使JSP仅负责显示数据,从而提高代码的可维护性和可扩展性。


推荐阅读
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Windows服务与数据库交互问题解析
    本文探讨了在Windows 10(64位)环境下开发的Windows服务,旨在定期向本地MS SQL Server (v.11)插入记录。尽管服务已成功安装并运行,但记录并未正确插入。我们将详细分析可能的原因及解决方案。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 本文详细介绍了如何通过多种编程语言(如PHP、JSP)实现网站与MySQL数据库的连接,包括创建数据库、表的基本操作,以及数据的读取和写入方法。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • 本文详细分析了JSP(JavaServer Pages)技术的主要优点和缺点,帮助开发者更好地理解其适用场景及潜在挑战。JSP作为一种服务器端技术,广泛应用于Web开发中。 ... [详细]
  • Java 中的 BigDecimal pow()方法,示例 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文介绍如何通过Windows批处理脚本定期检查并重启Java应用程序,确保其持续稳定运行。脚本每30分钟检查一次,并在需要时重启Java程序。同时,它会将任务结果发送到Redis。 ... [详细]
author-avatar
郁雯佩菱2
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有