一、概念区别

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