首页 > 其他分享 >Mybatis高级查询-一对多查询

Mybatis高级查询-一对多查询

时间:2024-10-13 17:17:47浏览次数:7  
标签:高级 id order 订单 user Mybatis 查询 tb public

表介绍和表关系说明
新建以下4张表
tb_user:用户表
tb_order:订单表
tb_item:商品表
tb_orderdetail:订单详情表

【表关系】

1.tb_user和 tb_order表关系
    tb_user  《==》  tb_order:一对多, 一个人可以下多个订单
    tb_order 《==》 tb_user:一对一,一个订单只能属于一个人
    结论:tb_user和tb_order属于一对多的关系,需要将一方tb_user的主键作为多方tb_order的外键维护关系
2.tb_order 和 tb_item 表关系
    tb_order 《==》 tb_item :一个订单可以有多个商品
    tb_item 《==》 tb_order:一个商品可以在多个订单上
    结论:tb_order和tb_item属于多对多的关系,需要创建中间表tb_orderdetail维护两个表的关系,并且将两张表    的主键作为中间表的外键

一对多查询

【目标】查询id为1的用户及其订单信息

【分析】

一个用户可以有多个订单。

一个订单只能属于一个用户。

用户(1)-----订单(n)

【步骤】

第一步:查询SQL分析;
第二步:添加关联关系;
第三步:编写接口方法;
第四步:编写映射文件;
第五步:测试

【实现】

第一步:需求分析

编写SQL实现查询id为1的用户及其订单信息

查询语句及查询结果:

#查询id为1的用户及其订单信息
select * from tb_user where id=1;
select * from tb_order where user_id=1;

#一对多 内连接查询
select * from tb_user tbu inner join tb_order tbo on tbu.id = tbo.user_id where tbu.id=1;
# 封装数据:关联对象,一个用户关联多个订单  User(List<Order> orderList)

说明:一个用户关联多个订单 User(List orderList) ,在User类中定义一个List集合存储多个订单Order对象。

第二步:添加映射关系

因为一个用户可以拥有多个订单,所以用户订单一对多的关系;需要在User类中添加一个List<Order> 属性;

package com.itheima.sh.pojo;

import java.io.Serializable;
import java.util.List;

public class User implements Serializable {

    private Long id;

    // 用户名
    private String userName;

    // 密码
    private String password;

    // 姓名
    private String name;

    // 年龄
    private Integer age;
    //0 女性 1 男性
    private Integer sex;

    //订单
    List<Order> orders;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Integer getSex() {
        return sex;
    }

    public void setSex(Integer sex) {
        this.sex = sex;
    }

    public List<Order> getOrders() {
        return orders;
    }

    public void setOrders(List<Order> orders) {
        this.orders = orders;
    }

    @Override
    public String toString() {
        return "User{" +
        "id=" + id +
        ", userName='" + userName + '\'' +
        ", password='" + password + '\'' +
        ", name='" + name + '\'' +
        ", age=" + age +
        ", sex=" + sex +
        ", orders=" + orders +
        '}';
    }
}
第三步:编写接口方法

UserMapper接口中,添加关联查询;

/**
     * 根据用户id查询用户及其订单信息
     * @param id
     * @return
     */
User oneToManyQuery(@Param("id") Long id);
第四步:编写SQL

UserMapper.xml文件中编写SQL语句完成一对多的关联查询;

说明:

1.一对多使用collection子标签进行关联多方Order
  <collection property="类中引用多方的成员变量名" javaType="存放多方容器的类型" ofType="多方类型" autoMapping="true">
  </collection>

2.属性:
    1)property="orders" 这里的orders表示User类的成员变量orders
    2)javaType="List" 表示User类的成员变量orders存储的Order对象使用的类型,这里是List 一般不书写
    3) ofType="Order" 表示List集合中存储数据的类型 Order
3.一定要记住这里给user表的id起别名是uid,order表的id起别名是oid.在resultMap标签的id子标签中的column属性值书写对应的uid和oid.

    <!--自定义结果集-->
    <resultMap id="oneToManyResult" type="User" autoMapping="true">
        <!--User的主键-->
        <id column="uid" property="id"/>
        <!--Order关联映射-->
        <!--
            1.一对多使用collection子标签进行关联多方Order
            2.属性:
                1)property="orders" 这里的orders表示User类的成员变量orders
                2)javaType="List" 表示User类的成员变量orders存储的Order对象使用的类型,这里是List,可以不配置
                3) ofType="Order" 表示List集合中存储数据的类型 Order
        -->

        <collection property="orders" javaType="List" ofType="Order" autoMapping="true">
            <!--Order的主键-->
            <id column="oid" property="id" />
        </collection>

    </resultMap>


    <!--根据用户ID查询用户及其订单数据-->
    <select id="oneToManyQuery" resultMap="oneToManyResult">
        SELECT
            tbo.id as oid,
            tbo.order_number,
            tbu.id as uid,
            tbu.user_name,
            tbu.password,
            tbu.name,
            tbu.age,
            tbu.sex
        FROM
            tb_user tbu
            INNER JOIN tb_order tbo ON tbu.id = tbo.user_id
        WHERE
            tbu.id = #{id}
    </select>
第五步:测试

在用户的测试类中

public class MybatisTest01 {
    private static UserMapper mapper = null;

    @BeforeClass
    public static void beforeClass() throws Exception {
        //1.构建SessionFactory
        String resouce = "mybatis-config.xml";
        InputStream is = Resources.getResourceAsStream(resouce);
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(is);
        //2.获取session
        SqlSession sqlSession = build.openSession(true);
        //3.获取接口对象
        mapper = sqlSession.getMapper(UserMapper.class);
    }  
    //根据用户ID查询用户及其订单数据
    @Test
    public void oneToManyQuery() {
        User user = mapper.oneToManyQuery(1L);
        System.out.println("user = " + user);
    }
}

【小结】
一对多关系配置:
1、在对象中添加映射关系;
2、编写接口方法,编写SQL;
3、编写resultMap处理数据库字段和实体类之间数据的封装;

标签:高级,id,order,订单,user,Mybatis,查询,tb,public
From: https://blog.csdn.net/2301_80237574/article/details/142831753

相关文章

  • 关于使用plsql操作oracle的一点小技巧和几个常用的查询语句BU
    plsql是什么:就是这个,专门操作oracle的一个工具,好用还免费。创建一个测试表:createtableStudent(Idnumbernotnull,Namevarchar(20),Agenumber,Gradenumber,Gendervarchar(2))里面的varchar2()是oracle自己专门的字符类型,用就行了。光标移到表上,右键选择Descr......
  • NOI提高级 图论算法:单源次短路
    DIJ(单源次短路)-TwoPaths-HDU6181DIJ(单源次短路)-TwoPaths-HDU6181-CSDN博客单源次短路(P2829大逃离)单源次短路(P2829大逃离)-CSDN博客单源次短路算法学习笔记单源次短路算法学习笔记-Wiueh_Plus-博客园次短路及次短路计数次短路及次短路......
  • 通过LambdaQueryWrapper配置实现查询指定的字段值
    如果是自己写sql语句,可以很自由的实现查询哪些字段值,但是在使用MybatisPlus提供的CRUD方法的时候我们该如何实现这一效果呢?可以通过LambdaQueryWrapper和QueryWrapper的select方法来做到这一点publicIPage<Customer>page(intcurrent,intsize){log.in......
  • go gorm StructField动态生成结构体查询单条表记录
    funcTest014_TakeTableFields(t*testing.T){vardbRequest=Default().SetPageSize(2)dbRequest.TableName="sys_dept"dbRequest.FieldsName="dept_id,dept_name"varresult=dbRequest.GeneralTakeTable()golog.Info......
  • go gorm StructField动态生成结构体查询多条表记录
    water/gowebfuncTest013_GeneralScanTable(t*testing.T){vardbRequest=Default().SetPageSize(3)dbRequest.TableName="sys_dept"dbRequest.FieldsName="dept_id,dept_name"//dbRequest.SetQueryAll(true)varresult=......
  • 高级java每日一道面试题-2024年10月13日-数据库篇[Redis篇]-怎么保证缓存和数据库数据
    如果有遗漏,评论区告诉我进行补充面试官:怎么保证缓存和数据库数据的一致性?我回答:在分布式系统中,保证缓存和数据库数据的一致性是一个常见的挑战。由于缓存的引入主要是为了提高系统的性能和响应速度,但这也带来了数据一致性的问题。以下是一些常用的方法来保证缓存和......
  • 高级java每日一道面试题-2024年10月11日-数据库篇[Redis篇]-Redis都有哪些使用场景?
    如果有遗漏,评论区告诉我进行补充面试官:Redis都有哪些使用场景?我回答:Redis是一个开源的、基于键值对的数据结构存储系统,,它支持多种数据类型,包括字符串、散列、列表、集合和有序集合。它可以用作数据库、缓存和消息中间件。由于其高性能、丰富的数据结构支持以及多种......
  • Web前端高级工程师培训:异步处理专题
    异步处理专题课前准备工具编辑器VSCode浏览器Chorme前置知识ES6基础语法课堂主题同步及异步概念方块运动的实现promise的用法then的返还值Async函数和await课堂目标理解并学会使用promise使用方式以及async、await的使用同步异步概念js是单线程单......
  • 基于django+vue+Vue基于+Mybatis的医生在线诊所平台【开题报告+程序+论文】-计算机毕
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,医疗行业也迎来了数字化转型的浪潮。传统的就医模式面临着诸多挑战,如医疗资源分配不均、患者就医体验不佳、医生......
  • 基于django+vue+Vue公交线路查询系统【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着城市化进程的加速,公共交通在城市居民日常出行中扮演着至关重要的角色。公交线路作为公共交通系统的重要组成部分,其便捷性、高效性和可......