MyBatis多表配置一对多和多对一

  • 需求:查询用户的详情,同时查询关联的订单。

3.2.0 JavaBean

  • 修改User对象,添加对应的订单属性

    在这里插入图片描述

    @Data
    public class User {
        private String uid;
        private String username;
    
        // 一对多:一个用户拥有【多个订单】
        private List<Order> orderList;
    }
    

3.2.1 方式1:硬编码

  • 依次查询两个mapper,获得需要的数据,然后手动拼凑。

  • 修改测试类

    在这里插入图片描述

    @Test
    public void testSelectAll() {
        // 获得会话
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        // 获得处理类
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);
        // 执行
        List<User> userList = userMapper.selectAll();
        for(User user: userList) {
            // 每一个用户依次查询,并封装
            List<Order> orderList = orderMapper.selectAllByUid(user.getUid());
            user.setOrderList(orderList);
        }
        // 打印【用户中含有订单】
        userList.forEach(System.out::println);
        // 释放
        MybatisUtils.close(sqlSession);

    }

3.2.2 方式2:注解关联

  • 修改 UserMapper,添加 @Results 完成关联查询的配置

在这里插入图片描述

public interface UserMapper {
/*
@Results:用于配置一个JavaBean与一个表的对应关系
@Result:JavaBean的一个属性 和 表的一个列的对应关系
property:JavaBean的属性名
column:表中列的名
many:用于配置一对多关系的
@Many(select=“另一个mapper对应的方法”)
mapper对应的方法要求:包名.类名.方法名
此时column设置就是方法的实际参数
注意:
1. property和column的值相同时,@Result可以省略
2. 每一个column只能使用一次,如果出现多次,就需要配置多个@Result
*/

/**
 * 查询所有
 * @return
 */
@Select("select * from user")
@Results({
        @Result(property = "uid", column = "uid" ),
        @Result(property = "username", column = "username"),
        @Result(property = "orderList", many = @Many(select = "com.czxy.mapper.OrderMapper.selectAllByUid"), column = "uid")
})
public List<User> selectAll();

##  多对一

* 需求:查询订单的同时,查询订单所属用户。

### 3.3.0 JavaBean

~~~java
package com.czxy.domain;

import lombok.Data;

/**
 * @author 桐叔
 * @email liangtong@itcast.cn
 * @description
 */
@Data
public class Order {
    private String oid;
    private Double price;
    private String userId;
    
    //多对一:多个订单属于【一个用户】
    private User user;
}

/*
create table `order`(
    oid varchar(20) primary key,
    price double,
    user_id varchar(20)
);
 */

3.3.1 方式1:硬编码

  • 驼峰映射:JavaBean的userId与数据库表的列user_id自动的映射

    在这里插入图片描述

    <!-- 驼峰映射 -->
    <setting name="mapUnderscoreToCamelCase" value="true"/>
    
  • 修改测试类

    在这里插入图片描述

    public class TestOrderMapper {
        @Test
        public void testSelectAllByUid() {
            // 获得会话
            SqlSession sqlSession = MybatisUtils.getSqlSession();
            // 获得处理类
            OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            // 执行
            List<Order> orderList = orderMapper.selectAllByUid("u001");
            for(Order order: orderList) {
                User user = userMapper.selectById(order.getUserId());
                order.setUser(user);
            }
            // 打印
            orderList.forEach(System.out::println);
            // 释放
            MybatisUtils.close(sqlSession);
    
        }
    }
    

3.3.2 方式2:注解关联

  • 修改 OrderMapper.java 添加@Results注解 配置多对一

在这里插入图片描述

在这里插入图片描述

public interface OrderMapper {

    /**
     * 通过id查询详情
     * @param oid
     * @return
     */
    @Select("select * from `order` where oid = #{oid}")
    @Results({
            @Result(property = "oid", column = "oid"),
            @Result(property = "price", column = "price"),
            @Result(property = "userId", column = "user_id"),
            @Result(property = "user", one = @One(select = "com.czxy.mapper.UserMapper.selectById"), column = "user_id" )
    })
    public Order selectById(@Param("oid") String oid);
}

3.3.3 方式3:XML关联

在这里插入图片描述
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.czxy.mapper.OrderMapper">

  <resultMap id="orderResultMap" type="com.czxy.domain.Order">
    <id property="oid" column="oid"></id>
    <result property="price" column="price"></result>
    <result property="userId" column="user_id"></result>
    <!-- 多对一配置
        <association> 关联标签, 与 <collection>集合标签,配置内容类似
    -->
    <association property="user" select="com.czxy.mapper.UserMapper.selectById" column="user_id"></association>
  </resultMap>

  <!-- 通过id查询详情 -->
  <select id="selectById" resultMap="orderResultMap">
    select * from `order` where oid = #{oid}
  </select>

  <!-- 通过用户id查询用户的所有订单 -->
  <select id="selectAllByUid" resultType="com.czxy.domain.Order">
    select * from `order` where user_id=#{uid}
  </select>
</mapper>
  • 23
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

秋野酱

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值