[Mybatis的一对一和一对多]

本文介绍了如何使用Mybatis的XML映射文件实现一对一和一对多的关联查询。在一对一关联查询中,展示了用户表和用户详情表的关联,而在一对多关联查询中,解释了订单表和订单详情表的关联。文中提供了相应的SQL查询、结果集定义以及实体类设计,帮助理解数据查询的结果格式。
摘要由CSDN通过智能技术生成

目录

 🎂前言:

 🎂一对一关联查询:

 🎂一对多关联查询:

 🎂 下面是上面代码中所涉及到的实体类结构设计:

 🎂一对一关联查询:

 🎂用户实体类(User):

 🎂用户详情实体类(UserDetail):

 🎂一对多关联查询:

 🎂订单实体类(Order):

 🎂订单详情实体类(OrderDetail):

 🎂下面是上面代码中所涉及到的表结构设计:

 🎂一对一关联查询:

 🎂用户表(user):

 🎂用户详情表(user_detail):

 🎂一对多关联查询:

 🎂订单表(order):

 🎂订单详情表(order_detail):

 🎂数据格式:

 🎂在一对多关联查询中,查询结果的格式通常是一个主表记录对应多个从表记录,即一个主表记录对应一个包含多个从表记录的集合。以订单表(order)和订单详情表(order_detail)为例,查询结果的格式如下:

 🎂在一对一关联查询中,查询结果的格式通常是一个主表记录对应一个从表记录,即一个主表记录对应一个从表记录对象。以用户表(user)和用户详情表(user_detail)为例,查询结果的格式如下:


🎂前言:

🎂 感觉要写一些通俗易懂的,

🎂上一篇直接使用mybatis注解来实现 , 这篇使用框架提供的标签映射来实现, 主打就是一个全面

🎂下面是映射版本地址:

[Mybatis注解版的 一对一和一对多实现过程 ]_是汤圆丫的博客-CSDN博客

 🎂一对一关联查询:

假设有两个表,一个是用户表(user),另一个是用户详情表(user_detail),它们之间是一对一的关系,即一个用户对应一个用户详情。下面是一对一关联查询的Mapper.xml配置文件:

<!-- 查询用户及其详情信息 -->
<select id="getUserWithDetail" resultMap="userWithDetail">
  SELECT u.*, d.*
  FROM user u
  LEFT JOIN user_detail d ON u.id = d.user_id
  WHERE u.id = #{id}
</select>

<!-- 定义结果集 -->
<resultMap id="userWithDetail" type="User">
  <id property="id" column="id"/>
  <result property="username" column="username"/>
  <result property="password" column="password"/>
  <result property="email" column="email"/>
  <result property="detail" column="id" resultMap="userDetail"/>
</resultMap>

<resultMap id="userDetail" type="UserDetail">
  <id property="id" column="id"/>
  <result property="userId" column="user_id"/>
  <result property="realName" column="real_name"/>
  <result property="age" column="age"/>
  <result property="address" column="address"/>
</resultMap>

在上面的配置文件中,我们定义了一个查询用户及其详情信息的SQL语句,并且定义了两个结果集,一个是userWithDetail,另一个是userDetail。其中,userWithDetail结果集中包含了user表和user_detail表的所有字段,同时还包含了一个detail属性,该属性的值是一个UserDetail对象,它通过resultMap属性引用了userDetail结果集。

 🎂一对多关联查询:

假设有两个表,一个是订单表(order),另一个是订单详情表(order_detail),它们之间是一对多的关系,即一个订单对应多个订单详情。下面是一对多关联查询的Mapper.xml配置文件:

<!-- 查询订单及其详情信息 -->
<select id="getOrderWithDetails" resultMap="orderWithDetails">
  SELECT o.*, d.*
  FROM order o
  LEFT JOIN order_detail d ON o.id = d.order_id
  WHERE o.id = #{id}
</select>

<!-- 定义结果集 -->
<resultMap id="orderWithDetails" type="Order">
  <id property="id" column="id"/>
  <result property="orderNo" column="order_no"/>
  <result property="createTime" column="create_time"/>
  <result property="details" column="id" resultMap="orderDetail"/>
</resultMap>

<resultMap id="orderDetail" type="OrderDetail">
  <id property="id" column="id"/>
  <result property="orderId" column="order_id"/>
  <result property="productName" column="product_name"/>
  <result property="price" column="price"/>
  <result property="quantity" column="quantity"/>
</resultMap>

在上面的配置文件中,我们定义了一个查询订单及其详情信息的SQL语句,并且定义了两个结果集,一个是orderWithDetails,另一个是orderDetail。其中,orderWithDetails结果集中包含了order表的所有字段,同时还包含了一个details属性,该属性的值是一个List对象,它通过resultMap属性引用了orderDetail结果集。

 🎂 下面是上面代码中所涉及到的实体类结构设计:

 🎂一对一关联查询:

 🎂用户实体类(User):
public class User {
    private int id;
    private String username;
    private String password;
    private String email;
    private UserDetail detail; // 一对一关联

    // getter和setter方法
}
 🎂用户详情实体类(UserDetail):
public class UserDetail {
    private int id;
    private int userId;
    private String realName;
    private int age;
    private String address;

    // getter和setter方法
}

 🎂一对多关联查询:

 🎂订单实体类(Order):
public class Order {
    private int id;
    private String orderNo;
    private Date createTime;
    private List<OrderDetail> details; // 一对多关联

    // getter和setter方法
}
 🎂订单详情实体类(OrderDetail):
public class OrderDetail {
    private int id;
    private int orderId;
    private String productName;
    private double price;
    private int quantity;

    // getter和setter方法
}

在实体类中,我们通过定义属性来表示表中的字段,同时还定义了一对一和一对多的关联关系。在一对一关联中,用户实体类中的detail属性表示用户详情,它的类型是UserDetail类;在一对多关联中,订单实体类中的details属性表示订单详情列表,它的类型是List类。

 🎂下面是上面代码中所涉及到的表结构设计:

 🎂一对一关联查询:

 🎂用户表(user):
字段名类型描述
idint用户ID
usernamevarchar用户名
passwordvarchar密码
emailvarchar邮箱地址
 🎂用户详情表(user_detail):
字段名类型描述
idint用户详情ID
user_idint用户ID
real_namevarchar真实姓名
ageint年龄
addressvarchar地址

 🎂一对多关联查询:

 🎂订单表(order):
字段名类型描述
idint订单ID
order_novarchar订单号
create_timedate创建时间
 🎂订单详情表(order_detail):
字段名类型描述
idint订单详情ID
order_idint订单ID
product_namevarchar商品名称
pricedouble商品价格
quantityint商品数量

 🎂数据格式:

 🎂在一对多关联查询中,查询结果的格式通常是一个主表记录对应多个从表记录,即一个主表记录对应一个包含多个从表记录的集合。以订单表(order)和订单详情表(order_detail)为例,查询结果的格式如下:

{
  "id": 1,
  "orderNo": "202201010001",
  "createTime": "2022-01-01",
  "details": [
    {
      "id": 1,
      "orderId": 1,
      "productName": "商品1",
      "price": 100.0,
      "quantity": 2
    },
    {
      "id": 2,
      "orderId": 1,
      "productName": "商品2",
      "price": 200.0,
      "quantity": 1
    }
  ]
}

在上面的JSON格式中,我们可以看到一个订单记录对应了两个订单详情记录,它们被封装在一个List集合中。在Java代码中

 🎂在一对一关联查询中,查询结果的格式通常是一个主表记录对应一个从表记录,即一个主表记录对应一个从表记录对象。以用户表(user)和用户详情表(user_detail)为例,查询结果的格式如下:

{
  "id": 1,
  "username": "test",
  "password": "123456",
  "email": "test@example.com",
  "detail": {
    "id": 1,
    "userId": 1,
    "realName": "张三",
    "age": 20,
    "address": "北京市"
  }
}

在上面的JSON格式中,我们可以看到一个用户记录对应了一个用户详情记录,它们被封装在一个UserDetail对象中,然后作为User对象的detail属性的值。在Java代码中,我们可以通过User类的detail属性来获取这个UserDetail对象,然后获取用户详情记录的信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是汤圆丫

怎么 给1分?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值