MyBatis注解Results

本文详细介绍了MyBatis框架中@Results注解的使用方法,包括基本用法和连表查询的应用。通过实例展示了如何解决数据库字段名与实体类属性名不一致的问题,以及如何在连表查询中正确映射多个表的数据。

MyBatis中使用@Results注解来映射查询结果集到实体类属性。

(1)@Results的基本用法。当数据库字段名与实体类对应的属性名不一致时,可以使用@Results映射来将其对应起来。column为数据库字段名,porperty为实体类属性名,jdbcType为数据库字段数据类型,id为是否为主键。

(2)连表查询时使用Results注解可以查询连接的表的数据

@Select("select menu.id, menu.parent_id,menu.name,menu.url,menu.icon,menu.sort,menu.description,\n" +
        "menu_vs_role.role_id,role.name,user_vs_role.user_id \n" +
        "from menu \n" +
        "left join menu_vs_role on menu.id=menu_vs_role.menu_id \n" +
        "left join role on menu_vs_role.role_id=role.id \n" +
        "left join user_vs_role on role.id=user_vs_role.role_id where user_vs_role.user_id=#{user_id}")
@Results({
        @Result(column = "id",property = "id", jdbcType= JdbcType.INTEGER, id=true),
        @Result(column = "parent_id",property = "parent_id"),
        @Result(column = "name",property = "name"),
        @Result(column = "url",property = "url"),
        @Result(column = "sort",property = "sort"),
        @Result(column = "description",property = "description"),
        @Result(column = "role_id",property = "menu_vs_role.role_id"), // 可以实现连表查询menu_vs_role的数据
        @Result(column = "name",property = "role.name"),
        @Result(column = "user_id",property = "user_vs_role.user_id")
})
List<Menu> findMenuListByUserId(int user_id);
MyBatis 是一个优秀的持久层框架,它允许开发者通过注解或 XML 配置文件来定义 SQL 查询和结果映射。其中,`@Results` 注解用于手动指定数据库字段与 Java 对象属性之间的映射关系,尤其在字段名与属性名不一致时非常有用。 ### 基本用法 `@Results` 注解可以用于接口方法上,以定义查询结果的映射规则。它支持单个字段的映射、一对一关联查询(`@One`)以及一对多关联查询(`@Many`)。 #### 单个字段映射 当数据库字段名与 Java 类属性名不一致时,可以使用 `@Result` 注解来指定映射关系。例如: ```java @Select("SELECT id, user_name FROM users") @Results({ @Result(property = "id", column = "id", id = true), @Result(property = "name", column = "user_name") }) List<User> getAllUsers(); ``` 在这个例子中,`user_name` 数据库字段被映射到 `User` 类的 `name` 属性上 [^1]。 #### 一对一关联查询 当需要进行一对一关联查询时,可以使用 `@One` 注解,并指定一个子查询来获取关联对象。例如: ```java @Select("SELECT id, name, class_id FROM my_student") @Results({ @Result(property = "id", column = "id", id = true), @Result(property = "myClass", column = "class_id", javaType = MyClass.class, one = @One(select = "com.example.demo.mapper.MyClassMapper.selectById")) }) List<Student> selectAllAndClassMsg(); ``` 在这个例子中,`class_id` 字段被映射到 `Student` 类的 `myClass` 属性上,且通过 `MyClassMapper.selectById` 方法进行关联查询 [^2]。 #### 一对多关联查询 对于一对多的关系,可以使用 `@Many` 注解来定义。例如: ```java @Select("SELECT id, group_name FROM groups") @Results({ @Result(property = "id", column = "id", id = true), @Result(property = "groupName", column = "group_name"), @Result(property = "users", column = "id", javaType = List.class, many = @Many(select = "com.example.demo.mapper.UserMapper.findByGroupId")) }) List<Group> getAllGroups(); ``` 在这个例子中,`users` 属性是一个 `List` 类型,表示一个组包含多个用户,且通过 `UserMapper.findByGroupId` 方法进行关联查询 [^3]。 ### 高级用法 除了基本的字段映射外,`@Results` 还支持更复杂的映射场景,如嵌套结果集、延迟加载等。 #### 延迟加载 可以通过设置 `fetchType` 属性来控制是否启用延迟加载。例如: ```java @Select("SELECT id, group_name FROM groups") @Results({ @Result(property = "id", column = "id", id = true), @Result(property = "groupName", column = "group_name"), @Result(property = "users", column = "id", javaType = List.class, many = @Many(select = "com.example.demo.mapper.UserMapper.findByGroupId", fetchType = FetchType.LAZY)) }) List<Group> getAllGroups(); ``` 在这个例子中,`users` 属性的加载被设置为延迟加载,只有在访问该属性时才会执行关联查询 [^3]。 #### 嵌套结果集 对于复杂的嵌套结果集,可以在 `@Results` 中定义多个 `@Result` 来处理嵌套结构。例如: ```java @Select("SELECT g.id, g.group_name, u.id AS user_id, u.name AS user_name FROM groups g LEFT JOIN users u ON g.id = u.group_id") @Results({ @Result(property = "id", column = "id", id = true), @Result(property = "groupName", column = "group_name"), @Result(property = "users", column = "id", javaType = List.class, many = @Many(select = "com.example.demo.mapper.UserMapper.findByGroupId")) }) List<Group> getAllGroupsAndUsers(); ``` 在这个例子中,`getAllGroupsAndUsers` 方法返回的 `List<Group>` 包含了每个组及其所有用户的列表 [^4]。 ### 示例代码 以下是一个完整的示例,展示了如何使用 `@Results` 注解进行结果映射: ```java public interface StudentMapper { @Select("SELECT id, name, class_id FROM my_student") @Results({ @Result(property = "id", column = "id", id = true), @Result(property = "name", column = "name"), @Result(property = "myClass", column = "class_id", javaType = MyClass.class, one = @One(select = "com.example.demo.mapper.MyClassMapper.selectById")) }) List<Student> selectAllAndClassMsg(); } public interface MyClassMapper { @Select("SELECT id, class_name FROM my_class WHERE id = #{id}") MyClass selectById(int id); } ``` 在这个例子中,`StudentMapper.selectAllAndClassMsg` 方法会返回包含班级信息的学生列表,其中班级信息是通过 `MyClassMapper.selectById` 方法获取的 [^2]。 ### 总结 `@Results` 注解MyBatis 中非常强大的功能之一,它可以灵活地处理各种复杂的结果映射场景。无论是简单的字段映射,还是一对一、一对多的关联查询,都可以通过 `@Results` 和其子注解(如 `@Result`、`@One`、`@Many`)来实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值