全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📅 2026-05-20 6 分钟 ✍️ juanwangdev

Mapper 接口定义

Mapper 接口是 MyBatis 的核心组件,定义了数据库操作的抽象方法。正确定义接口方法是保证接口绑定的前提。

接口基本结构

Java
package com.example.mapper;

import com.example.entity.User;
import java.util.List;
import org.apache.ibatis.annotations.Param;

public interface UserMapper {

    // 查询操作
    User selectById(Long id);
    List<User> selectAll();
    List<User> selectByStatus(Integer status);

    // 插入操作
    int insert(User user);
    int batchInsert(List<User> users);

    // 更新操作
    int updateById(User user);

    // 删除操作
    int deleteById(Long id);
}

接口方法定义需遵循三个对齐原则:方法名对齐返回类型对齐参数对齐

方法名与 XML statement id 匹配

接口方法名必须与 XML 中对应 SQL 语句的 id 属性完全一致:

Java
// 接口定义
public interface UserMapper {
    User selectById(Long id);
}
XML
<!-- XML 映射 -->
<mapper namespace="com.example.mapper.UserMapper">
    <!-- id 必须与方法名一致 -->
    <select id="selectById" resultType="com.example.entity.User">
        SELECT * FROM user WHERE id = #{id}
    </select>
</mapper>
正确示例错误示例说明
selectByIdid="selectById"selectByIdid="findById"方法名与 id 不一致
deleteByIdid="deleteById"deleteByIdid="removeById"命名风格不统一
updateStatusid="updateStatus"updateStatusid="update"id 过于简化

返回类型匹配

返回类型决定了 MyBatis 如何将结果集映射为 Java 对象:

单个对象

Java
User selectById(Long id);

对应 XML 使用 resultTyperesultMap

XML
<select id="selectById" resultType="com.example.entity.User">
    SELECT * FROM user WHERE id = #{id}
</select>

列表结果

Java
List<User> selectAll();
XML
<select id="selectAll" resultType="com.example.entity.User">
    SELECT * FROM user
</select>

注意:XML 中仍然写 resultType 而非 resultType="List",MyBatis 会根据接口返回类型自动判断。

影响行数

Java
int insert(User user);
int updateById(User user);
int deleteById(Long id);
XML
<insert id="insert" parameterType="com.example.entity.User">
    INSERT INTO user (username, email) VALUES (#{username}, #{email})
</insert>

void 返回

Java
void updateStatus(@Param("id") Long id, @Param("status") Integer status);
XML
<update id="updateStatus">
    UPDATE user SET status = #{status} WHERE id = #{id}
</update>

常见返回类型对照表

接口返回类型XML 配置说明
UserresultType="User"单条记录,返回 null 表示未找到
List<User>resultType="User"多条记录,空列表表示无数据
int / long无需 resultType影响行数
void无需 resultType仅执行,不关心结果
Map<String, Object>resultType="map"单条记录的键值对形式
List<Map<String, Object>>resultType="map"多条记录的键值对列表

参数匹配

单参数

Java
User selectById(Long id);
XML
<select id="selectById" resultType="User">
    SELECT * FROM user WHERE id = #{id}
</select>

单参数时,XML 中 #{} 内的名称可任意写,推荐使用参数语义化名称。

多参数

Java
// 方式一:使用 @Param 注解(推荐)
List<User> selectByCondition(@Param("status") Integer status,
                              @Param("keyword") String keyword);
XML
<select id="selectByCondition" resultType="User">
    SELECT * FROM user
    <where>
        <if test="status != null">
            AND status = #{status}
        </if>
        <if test="keyword != null and keyword != ''">
            AND username LIKE CONCAT('%', #{keyword}, '%')
        </if>
    </where>
</select>
Java
// 方式二:使用 Map 参数
List<User> selectByMap(Map<String, Object> params);
XML
<select id="selectByMap" resultType="User">
    SELECT * FROM user
    <where>
        <if test="status != null">AND status = #{status}</if>
        <if test="keyword != null">AND username LIKE #{keyword}</if>
    </where>
</select>
Java
// 方式三:使用对象参数
List<User> selectByUser(User query);
XML
<select id="selectByUser" resultType="User">
    SELECT * FROM user
    <where>
        <if test="status != null">AND status = #{status}</if>
        <if test="username != null">AND username LIKE #{username}</if>
    </where>
</select>

参数错误示例

Java
// 错误:多参数未使用 @Param,XML 中无法正确引用
List<User> selectByCondition(Integer status, String keyword);
XML
<!-- XML 中 status 和 keyword 无法区分,MyBatis 会使用 arg0, arg1 或 param1, param2 -->
<select id="selectByCondition" resultType="User">
    SELECT * FROM user WHERE status = #{status}  <!-- 找不到 status 参数 -->
</select>
<!-- 抛出:BindingException 或 PropertyNotFoundException -->

解决:多参数必须使用 @Param 注解标注。

正确与错误定义对比

正确定义

Java
public interface UserMapper {
    User selectById(Long id);                         // 方法名匹配,返回类型正确
    List<User> selectByStatus(@Param("status") Integer s); // 多参数使用 @Param
    int insert(User user);                            // 影响行数用 int
}
XML
<mapper namespace="com.example.mapper.UserMapper">
    <select id="selectById" resultType="User">SELECT * FROM user WHERE id = #{id}</select>
    <select id="selectByStatus" resultType="User">SELECT * FROM user WHERE status = #{status}</select>
    <insert id="insert" parameterType="User">INSERT INTO user (username) VALUES (#{username})</insert>
</mapper>

错误定义

Java
public interface UserMapper {
    // 错误1:方法名与 XML id 不一致
    User findById(Long id);

    // 错误2:返回类型与 SQL 不匹配(SELECT 多条却返回单个对象)
    User selectAll();

    // 错误3:多参数未使用 @Param
    List<User> selectByNameAndStatus(String name, Integer status);
}

要点总结

  • 接口方法名必须与 XML 中 statement id 完全一致
  • 返回类型需与 SQL 结果匹配:单对象、List、int、void 等
  • 多条记录查询 XML 仍写 resultType,MyBatis 自动识别 List
  • 多参数必须使用 @Param 注解,否则 XML 中无法正确引用
  • 单参数时 XML 中 #{ } 名称可任意写,建议语义化
  • 接口需通过 @Mapper 或 @MapperScan 注册到 MyBatis 容器

📝 发现内容有误?点击此处直接编辑

← 上一篇 自动映射与驼峰转换
下一篇 → SqlSession 获取 Mapper
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库