一、概念区别
Dao层(Data Access Object)
- 传统意义上的数据访问层,定义操作数据库的接口。
- 通常包含接口(
XxxDao
)和实现类(XxxDaoImpl
),实现类中直接编写SQL或调用ORM框架(如Hibernate)。 - 示例:
public interface UserDao {
User findById(Long id);
}
@Repository
public class UserDaoImpl implements UserDao {
@Override
public User findById(Long id) {
// 使用JdbcTemplate或Hibernate等实现
}
}
Mapper层(MyBatis语境)
- 特指MyBatis中通过XML或注解定义的数据库操作接口,无需实现类。
- 接口方法直接映射到SQL语句(由MyBatis动态代理实现)。
- 示例(注解形式):
@Mapper
public interface UserMapper {
@Select("SELECT * FROM user WHERE id = #{id}")
User findById(Long id);
}
二、技术区别
对比项 | Dao层 | Mapper层(MyBatis) |
---|---|---|
实现方式 | 需接口+实现类 | 仅需接口(MyBatis动态代理) |
SQL管理 | 写在实现类或注解中 | XML文件或注解 |
框架依赖 | 通用(JPA、JDBC等) | 绑定MyBatis |
事务控制 | 需手动声明(@Transactional ) | 通常由MyBatis-Spring集成处理 |
三、实际应用中的选择
- 使用Dao层:
- 项目采用JPA、Hibernate或纯JDBC时。
- 需要复杂业务逻辑(如多数据源组合操作)。
- 使用Mapper层:
- 基于MyBatis的项目,追求SQL灵活性和性能优化。
- 偏好“约定优于配置”(无需写实现类)。

四、常见误区
- 名称混用:
在MyBatis项目中,UserDao
和UserMapper
可能指同一接口,只是命名习惯不同。 - Spring整合:
无论Dao还是Mapper,最终都会被Spring容器管理(通过@Repository
或@Mapper
注解)。
五、误区
- 本质相同:都是数据访问层的抽象。
- 差异来源:技术实现(MyBatis vs JPA)和代码风格。
- 现代趋势:MyBatis项目中普遍直接使用
Mapper
命名,而传统Java EE项目可能保留Dao
。