温馨提示×

温馨提示×

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

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

Java DAO 数据访问对象怎么分层

发布时间:2026-07-24 22:17:41 来源:亿速云 阅读:102 作者:小樊 栏目:编程语言

在 Java 项目中,DAO(Data Access Object,数据访问对象)通常用于把“业务逻辑”和“数据库访问”解耦。一个清晰、可维护的 DAO 分层方式,一般如下(从下到上):


一、经典 DAO 分层结构(推荐)

├── entity / model        (实体层)
├── dao                  (DAO 接口层)
├── dao.impl             (DAO 实现层)
├── service              (业务层接口)
├── service.impl         (业务层实现)
├── controller / web     (控制层)

二、各层职责说明

1️⃣ Entity / Model(实体层)

作用:

  • 与数据库表一一对应
  • 只包含属性和 getter/setter(或 Lombok)

示例:

public class User {
    private Long id;
    private String username;
    private String password;
}

✅ 只负责“数据载体”,不包含任何逻辑


2️⃣ DAO 层(数据访问层)

✅ DAO 接口(定义“做什么”)

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

特点:

  • 面向接口编程
  • 不关心数据库实现(MySQL / Oracle)

✅ DAO 实现类(定义“怎么做”)

@Repository
public class UserDaoImpl implements UserDao {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Override
    public User findById(Long id) {
        String sql = "select * from user where id = ?";
        return jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(User.class), id);
    }
}

常见实现方式:

  • JdbcTemplate
  • MyBatis Mapper
  • JPA Repository

3️⃣ Service 层(业务逻辑层)

❗ DAO 不能直接给 Controller 用

✅ Service 接口

public interface UserService {
    User getUserById(Long id);
}

✅ Service 实现

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    @Override
    public User getUserById(Long id) {
        return userDao.findById(id);
    }
}

Service 层特点:

  • 处理业务逻辑
  • 事务控制(@Transactional)
  • 可调用多个 DAO

4️⃣ Controller 层(表现层)

@RestController
@RequestMapping("/users")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/{id}")
    public User getUser(@PathVariable Long id) {
        return userService.getUserById(id);
    }
}

三、DAO 分层的常见变体

✅ 使用 MyBatis 时的 DAO 分层

mapper(DAO 接口)
 └── UserMapper.java
resources/mapper
 └── UserMapper.xml
@Mapper
public interface UserMapper {
    User selectById(Long id);
}

✅ 此时 Mapper = DAO


✅ 使用 JPA 时的 DAO 分层

public interface UserRepository extends JpaRepository<User, Long> {
}

✅ Repository 就是 DAO


四、DAO 分层的好处

✅ 解耦数据库和业务逻辑
✅ 方便切换数据库实现
✅ 易于单元测试(Mock DAO)
✅ 符合单一职责原则


五、常见错误 ❌

❌ Controller 直接调用 DAO
❌ DAO 里写业务逻辑
❌ Service 里写 SQL
❌ Entity 里写数据库操作


六、一句话总结

DAO 只负责“怎么存取数据”,Service 负责“怎么用数据”,Controller 负责“怎么接收请求”。

如果你愿意,我可以:

  • 给你一个 完整 Spring Boot + MyBatis 示例
  • 或帮你 设计一个真实项目的 DAO 分层结构
向AI问一下细节

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

AI
助
手