Mybatis 返回值处理
在 MyBatis 中,返回值处理是非常重要的一部分。Mapper 接口方法的返回值可以是基本类型、对象类型、集合类型(如 List
、Set
),甚至是 Map
类型。MyBatis 会根据方法的返回值类型和 XML 文件中的配置,自动将查询结果映射到返回值中。
下面我们详细讲解 MyBatis 中返回值的处理方式。
1. 基本类型返回值
当方法的返回值是基本类型(如 int
、String
等)时,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
类型。- 查询结果的列(
id
、name
、age
)会自动映射到User
对象的属性中。
3. 集合类型返回值
当方法的返回值是一个集合(如 List
、Set
)时,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
类型。 -
查询结果的列(
id
、name
、age
)会映射为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 对象中。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具