在 Java 开发中,DAO(Data Access Object)层之所以要“解耦业务”,核心目的可以概括为一句话:
让“数据怎么存”和“业务怎么做”互不影响,系统更易维护、扩展和测试。
下面从几个关键角度说明原因。
DAO 的核心职责只有一件事:
✅ 封装对数据源(数据库、文件、缓存等)的访问细节
它不应该关心:
业务层(Service)才应该关心:
public void createOrder(Order order) {
Connection conn = ...
String sql = "INSERT INTO orders ...";
// 业务 + SQL 混在一起
}
问题:
public void saveUser(User user) {
if (user.getAge() < 18) {
throw new RuntimeException("未成年不能注册");
}
// 插入数据库
}
问题:
| 层 | 职责 |
|---|---|
| DAO | 增删改查 |
| Service | 业务流程 + 规则 |
| Controller | 接收请求 |
每一层只做一件事。
UserDao userDao = new MysqlUserDao();
// 以后可以换成
UserDao userDao = new RedisUserDao();
业务层完全不用改。
@Test
public void testOrderService() {
UserDao mockDao = mock(UserDao.class);
OrderService service = new OrderService(mockDao);
// 不连数据库也能测业务
}
@Transactional
public void placeOrder() {
userDao.lockUser();
orderDao.save();
inventoryDao.reduce();
}
事务在 业务层 控制,而不是 DAO。
Controller
↓
Service(业务)
↓
DAO(数据访问)
↓
DB
依赖方向:
上层依赖下层接口,不依赖实现
DAO 解耦业务,是为了让“数据访问”成为可替换、可测试、可复用的基础设施,而不是业务的附属品。
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。