Mapper
层和 DAO
(Data Access Object)层是在持久层中用于处理数据访问的两个概念。虽然这两者的目的都是用于访问数据库,但它们之间有一些区别。在Java开发中,这两个概念通常与MyBatis(或其他ORM框架)结合使用。
Mapper层:
- 定义:
Mapper
是 MyBatis 中的一个术语,指的是用于描述如何映射数据库中的数据到 Java 对象的接口。每一个Mapper
接口对应一个数据操作接口。
- 职责:
- 定义了数据访问的接口,提供了一组数据库操作的方法。
- 包含了与具体数据访问有关的 SQL 语句和映射规则。
- 注解:
- 通常使用 MyBatis 的注解或 XML 文件来描述 SQL 映射。
- 示例:
// MyBatis Mapper 接口 public interface UserMapper { @Select("SELECT * FROM users WHERE id = #{id}") User getUserById(int id); @Insert("INSERT INTO users (name, age) VALUES (#{name}, #{age})") void insertUser(User user); }
DAO层:
- 定义:
DAO
是一个更通用的设计模式,用于封装与数据存储交互的逻辑。在Java中,通常指的是数据访问对象。
- 职责:
- 提供了一个抽象接口,定义了数据访问的方法。
- 包含了数据访问的具体实现,可以是直接对数据库进行操作,也可以通过调用其他服务、API等方式进行数据访问。
- 注解:
- 通常不涉及注解,而是通过实现接口的方式来定义数据访问方法。
- 示例:
// DAO 接口 public interface UserDao { User getUserById(int id); void insertUser(User user); } // DAO 实现 public class UserDaoImpl implements UserDao { // 数据库操作的具体实现 }
- 对比
- 技术栈:
Mapper
通常与 MyBatis 等 ORM 框架结合使用。DAO
是一个更通用的概念,可以用于任何形式的数据访问,包括直接 JDBC 操作、使用 ORM 框架、调用 RESTful API 等。
- 灵活性:
Mapper
更侧重于数据映射和 SQL 操作,通常会与具体的 ORM 框架绑定。DAO
层相对更加抽象,可以在不同的数据访问技术之间切换,提供更大的灵活性。
- 命名规范:
Mapper
接口方法通常直接与 SQL 语句对应,方法名和 SQL 语句之间的映射关系更为直观。DAO
接口方法可以根据业务逻辑进行更灵活的命名,而不受 SQL 语句的限制。
在实际项目中,Mapper
层和 DAO
层有时会交替使用或者同时存在,具体的选择会根据项目的需求、技术栈和团队的开发习惯而定。在使用 MyBatis 等 ORM 框架时,常常使用 Mapper
来定义数据库操作接口。
其实用起来二者一样