MyBatis中@One的实现示例

 更新时间:2025年11月28日 10:35:20   作者:Caven77  
@One注解在MyBatis中用于定义一对一关系映射,通过关联查询获取其他表的数据,并将其映射到另一个实体类上,下面就来具体介绍一下,感兴趣的可以了解一下

@One注解的作用:

在 MyBatis 中,@One@Result 注解的一部分,用于定义一对一(One-to-One)关系映射。它通常在 @Result 注解中使用,表示查询某个字段时,通过关联查询来获取其他表的数据,并将结果映射到另一个实体类上。

典型应用场景:

  • 一对一关联:比如,用户 (User) 和用户档案 (Profile) 之间的一对一关系。在 User 中有一个 Profile 类型的属性,@One 可以用来指定如何查询和填充这个属性。

基本语法:

@Result(property = "profile", column = "profile_id",
        one = @One(select = "com.example.mapper.ProfileMapper.selectProfileById"))
  • property:对应 Java 类中的属性。
  • column:对应数据库中的字段,通常是关联的外键。
  • one:指明了关联查询的一对一关系,select 属性是关联查询的 SQL 方法。

详细说明:

  • @Result:用来映射数据库结果到 Java 对象字段的注解。
  • @One:定义一对一映射关系,通过 select 指定需要执行的关联查询的方法,通常是一个查询关联实体的方法。

例子:

假设我们有两个实体类,UserProfile,并且这两个实体类之间有一对一关系。我们需要通过 User 查询出与之相关的 Profile,即通过 Userprofile_id 字段关联到 Profile 表。

1. 实体类

public class User {
    private Integer id;
    private String username;
    private Profile profile;  // 这里有一个一对一关系,User 拥有一个 Profile

    // getter 和 setter 略
}

public class Profile {
    private Integer id;
    private String address;

    // getter 和 setter 略
}

2. 数据库表结构:

users 表:

CREATE TABLE users (
    id INT PRIMARY KEY,
    username VARCHAR(255),
    profile_id INT
);

profiles 表:

CREATE TABLE profiles (
    id INT PRIMARY KEY,
    address VARCHAR(255)
);

3. Mapper 接口

public interface UserMapper {

    @Select("SELECT id, username, profile_id FROM users WHERE id = #{id}")
    @Results({
        @Result(property = "profile", column = "profile_id",
                one = @One(select = "com.example.mapper.ProfileMapper.selectProfileById"))
    })
    User selectUserById(Integer id);
}

4. ProfileMapper 接口

public interface ProfileMapper {

    @Select("SELECT * FROM profiles WHERE id = #{profileId}")
    Profile selectProfileById(Integer profileId);
}

工作原理:

  1. @Select 查询:selectUserById 方法从 users 表中查询 User 的基本信息。其中profile_id 字段存储的是 Profile 表的主键。
  2. @Results 注解:通过 @Result 注解,profile_id 字段被映射到 User 类的 profile 属性,但是一个是int,一个是Profile类,所以这里就要用到@One。
  3. @One 注解:@One 注解指定了如何加载 Profile 信息。具体来说,它使用 selectProfileById 方法根据 profile_id 字段来查询 Profile 表,从中找出对应的 Profile 实体,然后赋值给User 类的 profile 属性。

@One相关参数

  • select:指定用来执行关联查询的方法,通常是一个查询关联实体的 Mapper 方法。例如,在这个例子中,com.example.mapper.ProfileMapper.selectProfileById 用来查询 Profile 信息。
  • fetchType:控制是否立即加载或延迟加载关联数据。这是可选的。有效值为 lazy (懒加载)和 eager(急加载)。 指定属性后,将在映射中忽略全局配置参数 lazyLoadingEnabled,使用属性的值。

总结

  • @One 注解 用于指定 MyBatis 一对一关联查询的行为,在 @Result 中使用。
  • @Result 用来将查询的结果映射到 Java 对象的字段。
  • @One(select = "someMethod") 用来指定关联查询的方法,通常在有外键关联的字段上使用。
  • @One 可以用于懒加载关联对象,从而提高性能。

学完@One,@Many也差不多可以掌握了,二者语法是类似的。

到此这篇关于MyBatis中@One的实现示例的文章就介绍到这了,更多相关MyBatis @One内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入了解Java设计模式之UML类图

    深入了解Java设计模式之UML类图

    UML 即 Unified Modeling Language 统一建模语言,是用来设计软件的可视化建模语言。本文就带大家了解一下UML中类图的定义与使用,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-11-11
  • springboot中的pom文件 project报错问题

    springboot中的pom文件 project报错问题

    这篇文章主要介绍了springboot中的pom文件 project报错问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Spring Boot模板引擎在后端开发中的实战应用(附实例代码)

    Spring Boot模板引擎在后端开发中的实战应用(附实例代码)

    Spring Boot作为一款流行的开源框架,极大地简化了开发过程,提供了快速构建应用程序的能力,它不仅能够帮助开发人员轻松实现各种功能,还能提高开发效率和代码质量,这篇文章主要介绍了Spring Boot模板引擎在后端开发中实战应用的相关资料,需要的朋友可以参考下
    2026-03-03
  • 几种常见的Java运行时异常小结

    几种常见的Java运行时异常小结

    在Java编程语言中异常处理是一项关键的机制,它帮助开发者识别和修复程序运行时可能出现的问题,下面这篇文章主要给大家介绍了几种常见的Java运行时异常的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-08-08
  • Java实现跨服务器上传文件功能

    Java实现跨服务器上传文件功能

    这篇文章主要为大家详细介绍了Java实现跨服务器上传文件功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • 基于Java实现的简易规则引擎

    基于Java实现的简易规则引擎

    这篇文章主要介绍了基于Java实现的简易规则引擎,支持动态选择表和字段形成各种判定规则,并进行不同组合,通过数据模型设计、树形结构设计和递归处理机制,实现了规则的判断和组合,感兴趣的可以了解一下
    2026-02-02
  • SpringCloudGateway网关处拦截并修改请求的操作方法

    SpringCloudGateway网关处拦截并修改请求的操作方法

    这篇文章主要介绍了SpringCloudGateway网关处拦截并修改请求的操作方法,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-12-12
  • SpringBoot轻松整合MongoDB的全过程记录

    SpringBoot轻松整合MongoDB的全过程记录

    这篇文章主要给大家介绍了关于SpringBoot轻松整合MongoDB的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • springboot集成shiro自定义登陆过滤器方法

    springboot集成shiro自定义登陆过滤器方法

    这篇文章主要介绍了springboot集成shiro自定义登陆过滤器方法,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • java ThreadPoolExecutor线程池内部处理流程解析

    java ThreadPoolExecutor线程池内部处理流程解析

    这篇文章主要为大家介绍了java ThreadPoolExecutor线程池内部处理流程解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12

最新评论