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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • javac、java打jar包命令实例

    javac、java打jar包命令实例

    这篇文章主要演示Java中使用命令打jar包的实例过程,很实用,希望能给大家做一个参考。
    2016-06-06
  • JavaWeb 实现多个文件压缩下载功能

    JavaWeb 实现多个文件压缩下载功能

    文件下载时,我们可能需要一次下载多个文件,批量下载文件时,需要将多个文件打包为zip,然后再下载。本文给大家分享实现思路及具体实现代码,对javaweb实现文件压缩下载功能感兴趣的朋友一起学习吧
    2017-07-07
  • Java使用snmp协议实现采集服务器信息

    Java使用snmp协议实现采集服务器信息

    SNMP是一种用于管理网络设备的协议,它是一种标准化的协议,被用于监控和管理网络设备,这篇文章主要介绍了Java如何使用snmp协议采集服务器信息,需要的可以参考下
    2024-12-12
  • SpringBoot使用过滤器、拦截器和监听器的案例代码(Springboot搭建java项目)

    SpringBoot使用过滤器、拦截器和监听器的案例代码(Springboot搭建java项目)

    这篇文章主要介绍了SpringBoot使用过滤器、拦截器和监听器(Springboot搭建java项目),本文是基于Springboot搭建java项目,结合案例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-02-02
  • 解读@RequestBody的正确使用方法

    解读@RequestBody的正确使用方法

    这篇文章主要介绍了解读@RequestBody的正确使用方法,具有一定借鉴价值
    2018-01-01
  • 关于SpringBoot拦截器拦截静态资源的问题

    关于SpringBoot拦截器拦截静态资源的问题

    这篇文章主要介绍了关于SpringBoot拦截器拦截静态资源的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Java元素排序Comparable与Comparator的区别

    Java元素排序Comparable与Comparator的区别

    这篇文章主要介绍了Java元素排序Comparable与Comparator的区别,二者都是顶级的接口,但拥有的方法和用法是不同的,下面我们分别来看看具体是怎样的区别吧
    2022-05-05
  • JAVA中while循环的使用与注意事项

    JAVA中while循环的使用与注意事项

    这篇文章主要介绍了while循环在编程中的应用,包括其基本结构、语句示例、适用场景以及注意事项,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-01-01
  • java返回的List进行add操作报错

    java返回的List进行add操作报错

    本文主要介绍了java返回的List进行add操作报错,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • 详解Spring Boot微服务如何集成fescar解决分布式事务问题

    详解Spring Boot微服务如何集成fescar解决分布式事务问题

    这篇文章主要介绍了详解Spring Boot微服务如何集成fescar解决分布式事务问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01

最新评论