在 MyBatis 中,使用注解进行集合映射的方式与 XML 配置方式类似,需要通过 @Results
和 @Result
注解来定义映射关系。下面是一个具体的示例(想直接看重点的 直跳第二点)。
对于这两个注解的说明:地址 - >MyBatis中常用注解详解 (Results、Result、ResultMap、ResultType、MapKey)_mybatis的result_偏爱星雾缠绕15的博客-CSDN博客
假设有如下查询语句:
SELECT g.id, g.name, u.id user_id, u.name user_name, u.age user_age
FROM group g
LEFT JOIN user u ON u.group_id = g.id
我们需要将这个查询结果映射成一个 Group 对象列表,其中每个 Group 对象包含一个 User 对象列表,表示该组下所有的用户信息。
1、定义实体类
首先需要定义 Group 和 User 实体类,并在 Group 类中添加一个 List<User> 类型的属性,表示该组下的所有用户信息。
例如:
@Data
public class Group {
private Long id;
private String name;
private List<User> users;
}
@Data
public class User {
private Long id;
private String name;
private Integer age;
}
2、定义 Mapper 接口
接着需要定义一个 Mapper 接口,并在其中定义一个 selectGroups() 方法来执行上述查询操作。同时,还需要使用 @Results
和 @Result
注解来定义映射关系。
其中,@Results
注解用于定义多个映射关系,@Result
注解用于定义单个映射关系。
例如:
@Mapper
public interface GroupMapper {
@Select("SELECT g.id, g.name, u.id user_id, u.name user_name, u.age user_age " +
"FROM group g LEFT JOIN user u ON u.group_id = g.id")
@Results({
@Result(property = "id", column = "id", id = true),
@Result(property = "name", column = "name"),
@Result(property = "users", column = "id",
many = @Many(select = "com.example.demo.mapper.UserMapper.selectByGroupId"))
})
List<Group> selectGroups();
}
在上面的示例中,我们定义了一个名为 selectGroups()
的方法,并使用 @Select
注解来指定 SQL 查询语句。同时,在该方法中使用了 @Results
注解来定义多个映射关系,其中包括 Group 对象的 id 和 name 属性的映射关系,以及 users 列表属性的映射关系。
需要注意的是,在使用注解映射集合类型时,需要在 @Results
注解中给出结果集映射的唯一标识符 id
,并在 @Result
注解中设置 id = true
,以便 MyBatis 可以正确地处理结果集映射。其表示对应的是<id>标签。
对于 users 列表属性的映射关系,我们使用了
@Result
注解来定义单个映射关系,其中property
属性指定了列表属性的名称,column
属性指定了该属性与查询结果集中哪一列建立映射关系,many
属性则表示该属性与另一张表建立一对多的关联关系,并通过select
属性指定了查询用户信息的 SQL 语句所在的 Mapper 接口和方法。
需要注意的是,这里的 select
属性值为 com.example.demo.mapper.UserMapper.selectByGroupId
,表示调用 UserMapper 接口中名为 selectByGroupId()
的方法来获取用户信息。
因此,还需要在 UserMapper 接口中定义一个名为 selectByGroupId()
的方法,用于查询该组下所有用户信息。
3、定义 UserMapper 接口
接着需要定义 UserMapper 接口,并在其中定义一个 selectByGroupId() 方法来查询属于指定组的所有用户信息。例如:
@Mapper
public interface UserMapper {
@Select("SELECT * FROM user WHERE group_id = #{groupId}")
List<User> selectByGroupId(@Param("groupId") Long groupId);
}
在上面的示例中,我们定义了一个名为 selectByGroupId()
的方法,并使用 @Select
注解来指定 SQL 查询语句。同时,在参数列表中使用了 @Param
注解来指定方法参数名称和对应的查询条件。
到这里,一个基于注解的 MyBatis 集合映射开发流程就完成了,觉得有用的话,记得点赞+收藏哦,下次不迷路~