温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何设计java DAO数据访问对象

发布时间:2026-10-05 13:13:07 来源:亿速云 阅读:97 作者:小樊 栏目:编程语言

下面从概念 → 设计原则 → 常见结构 → 示例代码 → 现代演进几个层面,系统讲一下 Java DAO(Data Access Object) 的设计方法。


一、DAO 是什么?

DAO(Data Access Object) 是一种设计模式,用于:

将业务逻辑与数据访问逻辑解耦
屏蔽底层数据库(JDBC / MyBatis / JPA)的差异

核心思想:

Service → DAO → 数据库

二、DAO 设计的核心原则

1️⃣ 单一职责

  • DAO 只负责数据的增删改查
  • 不包含业务规则

2️⃣ 面向接口编程

  • 定义 XxxDao 接口
  • 提供 XxxDaoImpl 实现

3️⃣ 与具体技术解耦

  • 上层不关心是 JDBC / MyBatis / Hibernate

4️⃣ 异常封装

  • 不向外抛 SQLException
  • 使用自定义异常或运行时异常

三、经典 DAO 分层结构

com.example.demo
├── entity
│   └── User.java
├── dao
│   ├── UserDao.java        (接口)
│   └── UserDaoImpl.java    (实现)
├── service
│   └── UserService.java
└── exception
    └── DaoException.java

四、基础示例(JDBC 版 DAO)

1️⃣ 实体类(Entity)

public class User {
    private Integer id;
    private String username;
    private String password;

    // getter / setter
}

2️⃣ DAO 接口

public interface UserDao {
    User findById(Integer id);
    List<User> findAll();
    void insert(User user);
    void update(User user);
    void delete(Integer id);
}

3️⃣ DAO 实现类

public class UserDaoImpl implements UserDao {

    private DataSource dataSource;

    public UserDaoImpl(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    @Override
    public User findById(Integer id) {
        String sql = "SELECT id, username, password FROM user WHERE id = ?";
        try (Connection conn = dataSource.getConnection();
             PreparedStatement ps = conn.prepareStatement(sql)) {

            ps.setInt(1, id);
            ResultSet rs = ps.executeQuery();
            if (rs.next()) {
                User user = new User();
                user.setId(rs.getInt("id"));
                user.setUsername(rs.getString("username"));
                user.setPassword(rs.getString("password"));
                return user;
            }
        } catch (SQLException e) {
            throw new DaoException("查询用户失败", e);
        }
        return null;
    }

    // 其他方法类似...
}

4️⃣ 自定义异常

public class DaoException extends RuntimeException {
    public DaoException(String message, Throwable cause) {
        super(message, cause);
    }
}

五、Service 层如何使用 DAO

public class UserService {
    private UserDao userDao;

    public UserService(UserDao userDao) {
        this.userDao = userDao;
    }

    public User login(String username, String password) {
        User user = userDao.findByUsername(username);
        if (user == null || !user.getPassword().equals(password)) {
            throw new BusinessException("用户名或密码错误");
        }
        return user;
    }
}

✅ 业务层完全不关心数据库实现


六、DAO 设计的演进方式

✅ 1. 使用 MyBatis(推荐)

@Mapper
public interface UserDao {
    User selectById(@Param("id") Integer id);
    void insert(User user);
}
  • 不需要写 JDBC
  • SQL 与 Java 解耦(XML / 注解)

✅ 2. 使用 Spring Data JPA

public interface UserRepository extends JpaRepository<User, Integer> {
}
  • DAO 几乎零代码
  • 适合标准 CRUD

✅ 3. DAO vs Repository

对比项 DAO Repository
关注点 表 / SQL 聚合 / 领域
使用场景 传统项目 DDD
技术 JDBC / MyBatis JPA

七、DAO 设计常见错误 ❌

❌ 在 DAO 里写业务逻辑
❌ Service 直接写 SQL
❌ DAO 返回 ResultSet
❌ 每个方法 new 一个 DAO
❌ 不使用接口


八、总结一句话

DAO 的本质是:用接口隔离数据访问,用实现隐藏数据库细节。

如果你愿意,我可以:

  • ✅ 给你一个 完整 Spring Boot + MyBatis DAO 示例
  • ✅ 帮你设计 多表 DAO 结构
  • ✅ 讲解 DAO 在 DDD 中的演变

你现在是传统 Java 项目还是 Spring Boot?

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手