Mybatis 返回值处理

在 MyBatis 中,返回值处理是非常重要的一部分。Mapper 接口方法的返回值可以是基本类型、对象类型、集合类型(如 ListSet),甚至是 Map 类型。MyBatis 会根据方法的返回值类型和 XML 文件中的配置,自动将查询结果映射到返回值中。

下面我们详细讲解 MyBatis 中返回值的处理方式。


1. 基本类型返回值

当方法的返回值是基本类型(如 intString 等)时,MyBatis 会将查询结果的第一行第一列映射为返回值。

Mapper 接口

public interface UserMapper {
    int selectUserCount();
}

Mapper XML 文件

<select id="selectUserCount" resultType="int">
    SELECT COUNT(*) FROM user
</select>
  • resultType="int":指定返回值为 int 类型。
  • 查询结果的第一行第一列(即 COUNT(*) 的值)会被映射为 int 类型。

2. 对象类型返回值

当方法的返回值是一个对象时,MyBatis 会将查询结果的列映射到对象的属性中。

实体类

public class User {
    private int id;
    private String name;
    private int age;
    // getters and setters
}

Mapper 接口

public interface UserMapper {
    User selectUserById(int id);
}

Mapper XML 文件

<select id="selectUserById" resultType="User">
    SELECT id, name, age FROM user WHERE id = #{id}
</select>
  • resultType="User":指定返回值为 User 类型。
  • 查询结果的列(idnameage)会自动映射到 User 对象的属性中。

3. 集合类型返回值

当方法的返回值是一个集合(如 ListSet)时,MyBatis 会将查询结果的多行映射为集合中的元素。

Mapper 接口

public interface UserMapper {
    List<User> selectAllUsers();
}

Mapper XML 文件

<select id="selectAllUsers" resultType="User">
    SELECT id, name, age FROM user
</select>
  • resultType="User":指定集合中的元素类型为 User
  • 查询结果的每一行都会映射为一个 User 对象,并添加到 List 中。

4. Map 类型返回值

当方法的返回值是一个 Map 时,MyBatis 会将查询结果的列映射为 Map 的键值对。

4.1 单行映射为 Map

将查询结果的一行映射为一个 Map,其中列名作为键,列值作为值。

Mapper 接口

public interface UserMapper {
    Map<String, Object> selectUserAsMapById(int id);
}

Mapper XML 文件

<select id="selectUserAsMapById" resultType="map">
    SELECT id, name, age FROM user WHERE id = #{id}
</select>
  • resultType="map":指定返回值为 Map 类型。

  • 查询结果的列(idnameage)会映射为 Map 的键值对,例如:

    { "id": 1, "name": "John", "age": 25 }
    

4.2 多行映射为 Map

将查询结果的多行映射为一个 Map,其中某一列作为键,另一列或整个对象作为值。

Mapper 接口

public interface UserMapper {
    @MapKey("id") // 指定使用 id 列作为 Map 的键
    Map<Integer, User> selectAllUsersAsMap();
}

Mapper XML 文件

<select id="selectAllUsersAsMap" resultType="User">
    SELECT id, name, age FROM user
</select>
  • @MapKey("id"):指定使用 id 列作为 Map 的键。

  • 查询结果的每一行会映射为一个 User 对象,并以 id 为键存入 Map 中,例如:

    {
        1: { "id": 1, "name": "John", "age": 25 },
        2: { "id": 2, "name": "Alice", "age": 30 }
    }
    

5. 复杂类型返回值

当查询结果需要映射到复杂的对象结构(如嵌套对象)或数据库字段与java 对象字段名不一致时,可以使用 resultMap

实体类

public class User {
    private int id;
    private String name;
    private int age;
    private Address address; // 嵌套对象
    // getters and setters
}

public class Address {
    private String city;
    private String street;
    // getters and setters
}

Mapper 接口

public interface UserMapper {
    User selectUserWithAddressById(int id);
}

Mapper XML 文件

<resultMap id="UserResultMap" type="User">
    <id property="id" column="id" />
    <result property="name" column="name" />
    <result property="age" column="age" />
    <association property="address" javaType="Address">
        <result property="city" column="city" />
        <result property="street" column="street" />
    </association>
</resultMap>

<select id="selectUserWithAddressById" resultMap="UserResultMap">
    SELECT u.id, u.name, u.age, a.city, a.street
    FROM user u
    LEFT JOIN address a ON u.id = a.user_id
    WHERE u.id = #{id}
</select>
  • resultMap:定义复杂对象的映射关系。
  • association:用于映射嵌套对象。

6. 返回值为 void

如果方法不需要返回值,可以将返回值类型设置为 void

Mapper 接口

public interface UserMapper {
    void updateUserName(@Param("id") int id, @Param("name") String name);
}

Mapper XML 文件

<update id="updateUserName">
    UPDATE user SET name = #{name} WHERE id = #{id}
</update>

总结

  • 基本类型:返回查询结果的第一行第一列。
  • 对象类型:将查询结果的列映射到对象的属性中。
  • 集合类型:将查询结果的多行映射为集合中的元素。
  • Map 类型:将查询结果的列映射为 Map 的键值对。
  • 复杂类型:使用 resultMap 定义复杂对象的映射关系。
  • void:不需要返回值。

通过合理使用这些返回值处理方式,可以灵活地将查询结果映射到 Java 对象中。

posted @   CyrusHuang  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示