DAO-数据访问对象(Data Access Object) 模式

本文详细介绍了DAO(Data Access Object)设计模式的应用场景、组件职责及其实现方式。通过具体示例展示了如何利用DAO模式分离业务逻辑与数据访问逻辑,提高系统的灵活性和可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

业务对象只应该关注业务逻辑,不应该关心数据存取的细节。数据访问对象必须实现特定的持久化策略(如,基于JDBC或Hibernate的持久化逻辑), 这样就抽出来了DAO层,作为数据源层,而之上的Domain Model层与之通讯而已,如果将那些实现了数据访问操作的所有细节都放入高层Domain model(领域模型)的话,系统的结构一定层次上来说就变得有些混乱。低级别的数据访问逻辑与高级别的业务逻辑分离,用一个DAO接口隐藏持久化操作的细节,这样使用的最终目的就是让业务对象无需知道底层的持久化技术知识,这是标准 j2ee 设计模式之一。
 
<!--[if !supportLists]-->1.       <!--[endif]-->DAO模式使用环境
具体类图如下。
参与者和职责
<!--[if !supportLists]-->1)      <!--[endif]-->BusinessObject(业务对象)
代表数据客户端。正是该对象需要访问数据源以获取和存储数据。
<!--[if !supportLists]-->2)      <!--[endif]-->DataAccessObject(数据访问对象)
是该模式的主要对象。DataAccessObject抽取该BusinessObject的低层数据访问实现,以保证对数据源的透明访问。BusinessObject也可以把数据加载和存储操作委托给DataAccessObject。
<!--[if !supportLists]-->3)      <!--[endif]-->DataSource(数据源)
代表数据源实现。数据源可以是各RDBMSR数据库,OODBMS,XML文件等等。
<!--[if !supportLists]-->4)      <!--[endif]-->ValueObject(值对象)
代表用做数据携带着的值对象。DataAccessObject可以使用值对象来把数据返回给客户端。
DataAccessObject也许会接受来自于客户端的数据,其中这些用于更新数据源的数据存放于值对象中来传递。
 
2. 数据访问对象的工厂策略
通过调整抽象工厂和工厂方法模式,DAO模式可以达到很高的灵活度。具体类图如下。
DAO层使应用程序更加容易地迁移到一个不同的数据库实现。业务对象不了解低层数据实现。因而,该迁移只涉及对DAO层的变化。更进一步说,如果使用工厂策略,则有可能为每一个低层存储实现提供一个具体工厂实现。在这种情况下,迁移到不同的迁移实现意味着给应用程序提供一个新的工厂实现。
同时,抽象DAO工厂可以指定需要创建的实例DAO,并交由不同的具体DAO工厂去创建。
 
3.DAO代码实例(工程代码见附件)
一个典型的DAO组成:DAO工厂类,DAO接口,实现DAO接口的具体类(每个 DAO 实例负责一个主要域对象或实体),VO(Value Object)。
VO为Student类,将所有关于持久化的操作归入StudentDAO类中。
Student.java
public class Student {
    private String id;
    private String name;
    private String cardId;
    private int age;
 
    getter/setter()。。。
}
StudentDAO.java
public interface StudentDAO {
    public boolean insertStudent(Student student);
    public boolean deleteStudent( int id);
    public Student findStudent( int id);
}
抽象DAO工厂DAOFactory指定了可能的具体DAO工厂,并指定需要创建的具体DAO。
DAOFactory.java
public abstract class DAOFactory {
    // List of DAO types supported by the factory
    public static final int SQLSERVER = 1;
    public static final int MYSQL = 2;
    // There will be a method for each DAO that can be
    // created. The concrete factories will have to
    // implement these methods.
    public abstract StudentDAO getStudentDAO();
 
    public static DAOFactory getDAOFactory( int whichFactory) {
       switch (whichFactory) {
       case SQLSERVER:
           return new SqlServerDAOFactory();
       case MYSQL:
           return new MySqlDAOFactory();
       default:
           return null;
       }
    }
}
这里提供两个具体DAO工厂,SqlServerDAOFactory和MySqlDAOFactory。提供它们来得到具体的DAO实现。
SqlServerDAOFactory.java
public class SqlServerDAOFactory extends DAOFactory{
    public static final String DRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
    public static final String DBURL = "jdbc:sqlserver://localhost:1025; DatabaseName=tmp";
    private static String userName = "sa";
    private static String userPwd = "root";
 
    public static Connection createConnection() {
       Connection dbConn = null;
       try {
           Class. forName( DRIVER);
           dbConn = DriverManager. getConnection( DBURL, userName, userPwd);
       } catch (ClassNotFoundException e) {
           e.printStackTrace();
       } catch (SQLException e) {
           e.printStackTrace();
       }
       return dbConn;
    }
 
    public StudentDAO getStudentDAO() {
       return new SqlServerStudentDAO( createConnection());
    }
 
    。。。。。。
}
MySqlDAOFactory.java略
这里提供一个缺省的StudentDAO实现StudentDAODefaultImpl,它依据特定的Connection,来实现数据库相关操作。
StudentDAODefaultImpl.java
public abstract class StudentDAODefaultImpl implements StudentDAO {
    private Connection dbConn;
 
    public StudentDAODefaultImpl(Connection dbConn) {
       this.dbConn = dbConn;
    }
 
    public boolean deleteStudent( int id) {
       Statement stmt;
       try {
           stmt = dbConn.createStatement();
           String sql = "DELETE FROM student_table WHERE id = '" + id + "'";
           int delete = stmt.executeUpdate(sql);
           if (delete == 1)
              return true;
       } catch (SQLException e) {
           e.printStackTrace();
       }
       return false;
    }
 
    public Student findStudent( int id) {。。。}
    public boolean insertStudent(Student stu) {。。。}
}
两个特定的DAO类分别从两个具体DAO工厂,SqlServerDAOFactory和MySqlDAOFactory中得到连接对象。
SqlServerStudentDAO.java
public class SqlServerStudentDAO extends StudentDAODefaultImpl {
    private Connection dbConn = SqlServerDAOFactory. createConnection();
   
    public SqlServerStudentDAO(Connection dbConn) {
       super(dbConn);
    }
 
    public Connection getDbConn() {
       return dbConn;
    }
}
MySqlStudentDAO.java略
测试类 Test.java
public class Test {
    public static void main(String[] args) {
       Student student = new Student("1", "zj", "0901", 27);
       DAOFactory mysqlDAOFactory = DAOFactory. getDAOFactory(DAOFactory. MYSQL);
       StudentDAO studentDAO = mysqlDAOFactory.getStudentDAO();
       studentDAO.insertStudent(student);
    }
}
4.参考
[2]所使用的数据库表见 Java连接SqlServer2005与MySQL5

本文出自 “子 孑” 博客,请务必保留此出处http://zhangjunhd.blog.51cto.com/113473/127856

数据访问对象模式Data Access Object Pattern,简称DAO模式)是一种设计模式,用于将数据访问逻辑与业务逻辑分离。DAO模式通过提供一个抽象接口来访问数据源,从而使得应用程序可以独立于数据存储的具体实现。DAO模式的主要目的是提供一种清晰的方式来操作数据,而无需关心数据的具体存储方式和实现细节。 DAO模式通常包含以下几个部分: 1. **数据访问对象接口(DAO接口)**:定义了一组数据操作方法,如增删改查等。 2. **数据访问对象实现类(DAO实现类)**:实现了DAO接口,包含了具体的数据库操作逻辑。 3. **数据实体类(Model类)**:表示数据库中的数据表或记录,通常是一些简单的Java对象(POJO)。 以下是DAO模式的一个简单示例: ```java // 数据实体类 public class User { private int id; private String name; private String email; // 构造方法、getter和setter方法 } // 数据访问对象接口 public interface UserDAO { void addUser(User user); void updateUser(User user); void deleteUser(int id); User getUserById(int id); List<User> getAllUsers(); } // 数据访问对象实现类 public class UserDAOImpl implements UserDAO { // 假设使用JDBC进行数据库操作 private Connection getConnection() throws SQLException { // 获取数据库连接 } @Override public void addUser(User user) { // 实现添加用户逻辑 } @Override public void updateUser(User user) { // 实现更新用户逻辑 } @Override public void deleteUser(int id) { // 实现删除用户逻辑 } @Override public User getUserById(int id) { // 实现根据ID获取用户逻辑 } @Override public List<User> getAllUsers() { // 实现获取所有用户逻辑 } } ``` 在上述示例中,`User`类表示用户数据,`UserDAO`接口定义了用户数据操作的方法,`UserDAOImpl`类实现了这些方法,并包含了具体的数据库操作逻辑。通过这种方式,应用程序的其余部分可以独立于数据存储的具体实现,只需通过`UserDAO`接口进行数据操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值