温馨提示×

温馨提示×

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

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

java DAO 层该如何分层

发布时间:2026-10-26 04:35:50 来源:亿速云 阅读:89 作者:小樊 栏目:编程语言

在 Java 企业级开发中,DAO(Data Access Object)层通常用于隔离业务逻辑与数据库访问。随着项目规模扩大,DAO 层一般会进一步分层,以提高可维护性、可测试性和扩展性。

下面从常见分层结构、各层职责、典型代码示例、以及最佳实践几个方面来说明。


一、DAO 层常见分层结构

一个比较成熟的 Java 项目,DAO 层通常可以这样分层:

Controller
    ↓
Service(业务逻辑层)
    ↓
Repository / DAO(数据访问层)
    ↓
Entity / Model(数据库映射对象)
    ↓
DataSource / ORM Framework(MyBatis / JPA / JDBC)

在 DAO 内部,常见进一步划分:

1️⃣ Entity / DO(Data Object)

  • 与数据库表一一对应
  • 只承载数据,不包含业务逻辑
@Table("user")
public class UserDO {
    private Long id;
    private String username;
    private Integer age;
}

2️⃣ DAO / Mapper 接口层(最底层)

  • 只负责“如何访问数据库”
  • 不写业务判断
  • MyBatis 中通常是 UserMapper
@Mapper
public interface UserMapper {
    UserDO selectById(Long id);
    void insert(UserDO user);
}

或传统 DAO:

public interface UserDao {
    UserDO getById(Long id);
}

3️⃣ DAO 实现层(可选)

  • 如果使用 MyBatis,通常省略
  • 如果是 JDBC / Spring JDBC,会有实现类
@Repository
public class UserDaoImpl implements UserDao {
    // JDBC 操作
}

4️⃣ Repository 层(推荐,尤其 Spring 项目)

  • DAO 的“业务化封装”
  • 对 Service 暴露更友好的接口
  • 可包含简单查询组合,但不含核心业务
@Repository
public class UserRepository {

    @Autowired
    private UserMapper userMapper;

    public UserDO findById(Long id) {
        return userMapper.selectById(id);
    }
}

5️⃣ Service 层(不在 DAO 内,但紧密相关)

  • 调用 Repository / DAO
  • 处理事务、业务规则
@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    @Transactional
    public UserDO getUser(Long id) {
        return userRepository.findById(id);
    }
}

二、不同技术栈下的 DAO 分层方式

✅ MyBatis 项目

Mapper 接口
   ↓
Repository(可选)
   ↓
Service

✅ JPA / Hibernate 项目

Entity
   ↓
JpaRepository<T, ID>
   ↓
Service
public interface UserRepository extends JpaRepository<User, Long> {
}

✅ 传统 JDBC

DAO 接口
   ↓
DAO 实现
   ↓
Service

三、DAO 分层的最佳实践

✅ 1. DAO 层不做业务判断

❌ 错误:

if (user.getAge() > 18) {
    mapper.insert(user);
}

✅ 正确:

  • 判断放在 Service

✅ 2. DAO 层不依赖 Controller

  • Controller 不能直接调用 Mapper
  • 必须经 Service

✅ 3. 统一返回类型

  • 推荐返回 DO 或 Optional<DO>
  • 不建议返回 Map 或 JSONObject

✅ 4. 大数据量查询走专门方法

List<UserDO> queryByCondition(UserQuery query);

✅ 5. 分页统一封装

Page<UserDO> pageQuery(PageRequest request);

四、总结一句话

DAO 层应“只管数据怎么取”,Service 层“管业务怎么走”,Repository 是它们之间的桥梁。

如果你愿意,我可以:

  • 给你一个 MyBatis + Spring Boot 的完整分层示例
  • 或对比 DAO vs Repository 的区别
  • 或帮你设计 你当前项目的 DAO 分层方案

你可以告诉我你用的是 Spring Boot / MyBatis / JPA / 传统 SSM 哪种。

向AI问一下细节

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

AI
助
手