在 Java 开发中,DAO(Data Access Object)层通常建议“接口与实现分离”,也就是先定义 XxxDao 接口,再提供 XxxDaoImpl 实现类。这样做主要有以下几方面原因:
接口定义“能做什么”,实现类决定“怎么做”。
UserDao 接口// Service 只依赖接口
private UserDao userDao;
如果哪天从 MyBatis 换成 JPA,只需换实现类,Service 代码一行都不用改。
同一个接口可以有多种实现:
UserDaoImplMyBatisUserDaoImplJpaUserDaoImplMock(测试用)通过 Spring 注入不同实现即可:
@Bean
public UserDao userDao() {
return new UserDaoImplJpa();
}
测试 Service 时,不需要连数据库:
UserDao userDao = mock(UserDao.class);
when(userDao.findById(1)).thenReturn(new User());
如果直接依赖实现类,Mock 会变得非常困难。
Java 设计原则强调:
依赖抽象,不依赖具体
DAO 接口就是抽象层,实现类是细节。
让代码结构更清晰,也方便多人协作。
Spring 通过接口 + 实现类进行:
实际上 MyBatis 的
Mapper接口本身就是“接口分离”的极端体现。
但中大型项目、企业级应用强烈建议分离。
DAO 接口分离,是为了解耦、可替换、可测试、可扩展,是 Java 分层架构的基本功。
如果你愿意,我也可以结合 MyBatis / JPA / Spring 给你一个具体对比示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。