19. MyBatis中的`Mapper`接口如何工作?它如何映射到SQL语句?
大约 4 分钟
在 MyBatis 中,Mapper
接口用于定义数据库操作的接口方法,这些方法会与对应的 SQL 语句绑定。Mapper
接口本质上是一个面向对象的编程方式,通过接口方法调用来执行 SQL 操作,而不需要直接编写 SQL 代码,或者通过 XML 配置或注解将接口方法与 SQL 语句映射起来。
1. Mapper
接口的基本工作原理
- 定义
Mapper
接口:Mapper
接口通常用于定义数据库操作的接口方法,方法名称和参数可以与 SQL 语句进行对应。这些接口没有具体的实现类,MyBatis 会在运行时为这些接口生成动态代理对象。 - 映射 SQL 语句: 每个
Mapper
接口方法都会映射到一个具体的 SQL 语句。这些 SQL 语句可以在 XML 映射文件中定义,也可以通过注解直接写在接口方法上。 - 动态代理: 在应用程序运行时,MyBatis 会为每个
Mapper
接口生成一个动态代理对象,当你调用接口方法时,代理对象会执行与该方法对应的 SQL 语句。
2. Mapper
接口的使用方式
MyBatis 提供了两种主要方式来映射 Mapper
接口与 SQL 语句:
- XML 映射文件: 通过 XML 文件定义 SQL 语句,并将它们与
Mapper
接口的方法进行绑定。 - 注解: 直接在
Mapper
接口的方法上使用注解来编写 SQL 语句。
3. 通过 XML 映射文件的 Mapper
在 XML 映射文件中,每个 Mapper
接口对应一个 XML 文件,这个 XML 文件定义了接口方法与 SQL 语句的映射关系。
示例:
假设有一个数据库表 user
,结构如下:
CREATE TABLE user (
id INT PRIMARY KEY,
name VARCHAR(50),
email VARCHAR(50)
);
Step 1: 定义 Mapper
接口
public interface UserMapper {
User selectUserById(int id);
List<User> selectAllUsers();
}
Step 2: 创建 XML 映射文件
创建一个与 UserMapper
对应的 XML 映射文件(如 UserMapper.xml
),并在其中定义 SQL 语句:
<mapper namespace="com.example.mapper.UserMapper">
<!-- 定义 SQL 查询,通过 id 获取用户 -->
<select id="selectUserById" resultType="com.example.User">
SELECT id, name, email FROM user WHERE id = #{id}
</select>
<!-- 查询所有用户 -->
<select id="selectAllUsers" resultType="com.example.User">
SELECT id, name, email FROM user
</select>
</mapper>
<select>
标签:用于定义SELECT
查询的 SQL 语句。id
属性对应Mapper
接口中的方法名,resultType
指定查询结果要映射到的 Java 对象类型。
Step 3: 使用 SqlSession
获取 Mapper
并调用方法
在代码中,你可以通过 SqlSession
获取 Mapper
接口的实现,并调用方法执行 SQL 查询:
try (SqlSession session = sqlSessionFactory.openSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.selectUserById(1);
List<User> users = mapper.selectAllUsers();
}
4. 通过注解的 Mapper
MyBatis 还支持直接在 Mapper
接口中使用注解来定义 SQL 语句,这种方式更为简洁,不需要额外的 XML 文件。
示例:
Step 1: 定义带注解的 Mapper
接口
import org.apache.ibatis.annotations.Select;
public interface UserMapper {
@Select("SELECT id, name, email FROM user WHERE id = #{id}")
User selectUserById(int id);
@Select("SELECT id, name, email FROM user")
List<User> selectAllUsers();
}
@Select
注解:直接在方法上使用@Select
注解来定义 SQL 查询语句。#{id}
是 MyBatis 的占位符,用于在运行时替换为方法参数。
Step 2: 使用 SqlSession
获取 Mapper
并调用方法
try (SqlSession session = sqlSessionFactory.openSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.selectUserById(1);
List<User> users = mapper.selectAllUsers();
}
5. Mapper
接口如何映射到 SQL 语句
当你调用 Mapper
接口的方法时,MyBatis 会执行以下步骤:
- 获取 SQL 语句:MyBatis 会根据
Mapper
接口的名称和方法的id
找到对应的 SQL 语句。 - 处理参数:MyBatis 会解析方法的参数,并将它们替换到 SQL 语句中的占位符(如
#{id}
)中。 - 执行 SQL:MyBatis 通过 JDBC 执行生成的 SQL 语句,并获取数据库返回的结果集。
- 结果映射:MyBatis 会将结果集映射到指定的 Java 对象中,并返回给调用者。
6. 总结
Mapper
接口的作用:MyBatis 的Mapper
接口用于定义数据库操作的方法,通过 XML 或注解将方法与具体的 SQL 语句进行映射。- 映射方式:可以通过 XML 映射文件或注解将
Mapper
接口的方法映射到 SQL 语句,前者适合更复杂的 SQL 配置,后者更简洁直接。 - 动态代理:MyBatis 在运行时会为
Mapper
接口生成动态代理对象,当你调用接口方法时,代理对象会执行对应的 SQL 语句,并将结果映射为 Java 对象。
通过 Mapper
接口,MyBatis 提供了一种面向对象的方式来管理数据库操作,简化了开发工作,使代码更清晰、更易维护。