mybatis注解开发resultMap
时间: 2025-01-08 21:01:37 浏览: 4
### MyBatis 注解开发中 resultMap 的使用
在MyBatis注解开发模式下,`@Results` 和 `@Result` 组合用于定义内联的结果映射规则。这种方式允许开发者直接在接口方法上声明映射逻辑而不需要额外的XML配置文件[^1]。
对于较为复杂的映射需求,可以利用这些注解来创建类似于XML风格下的`<resultMap>`标签的功能。下面是一个具体的例子展示如何实现这一点:
#### 定义实体类
假设存在两个实体类:`UserDO`表示用户基本信息;另一个是用户的兴趣爱好列表`HobbyDO`。这两个类之间存在着一对多的关系。
```java
// UserDO.java
public class UserDO {
private Integer id;
private String name;
// getters and setters...
}
// HobbyDO.java
public class HobbyDO {
private Integer userId;
private String hobbyName;
// getters and setters...
}
```
#### 创建 Mapper 接口并应用注解
接下来是在Mapper接口里边定义相应的查询方法以及其对应的`resultMap`:
```java
package my.springboot.mybatis.dao;
import java.util.List;
import org.apache.ibatis.annotations.*;
import my.springboot.mybatis.entity.HobbyDO;
import my.springboot.mybatis.entity.UserDO;
@Mapper
public interface UserInfoMapper {
@Select("SELECT * FROM users WHERE id = #{id}")
@Results(id="userResult", value={
@Result(property="id", column="id"),
@Result(property="name", column="username")
})
UserDO getUserById(@Param("id") int id);
@Select("<script>" +
"SELECT h.* FROM hobbies h" +
"<where>" +
"<if test='userId != null'>" +
"AND h.user_id = #{userId}" +
"</if>" +
"</where>" +
"</script>")
@Results(id="hobbiesResult", value={
@Result(property="userId", column="user_id"),
@Result(property="hobbyName", column="hobby_name")
})
List<HobbyDO> findHobbiesByUserId(@Param("userId") Integer userId);
// 更加复杂的一对多关联映射
@Select("SELECT u.*, GROUP_CONCAT(h.hobby_name SEPARATOR ',') AS hobbies " +
"FROM users u LEFT JOIN hobbies h ON u.id=h.user_id " +
"WHERE u.id=#{id} GROUP BY u.id")
@Results({
@Result(id=true, property="id", column="id"),
@Result(property="name", column="username"),
@Result(property="hobbies", column="hobbies",
many=@Many(select="findHobbiesByUserId"))
})
UserWithHobbiesDTO getUserWithHobbies(int id);
}
```
在这个例子中,首先为每一个单独的对象(`UserDO`, `HobbyDO`)指定了基本字段之间的映射关系。之后,在最后一个方法`getUserWithHobbies()`展示了更高级别的用法——它不仅获取了一个用户的信息还连带取回了该用户的全部兴趣爱好记录,并通过`many`属性指定子查询的方式完成了一对多关系的加载[^4]。
阅读全文