ToB企服应用市场:ToB评测及商务社交产业平台

标题: Mybatis高级查询-一对多查询 [打印本页]

作者: 温锦文欧普厨电及净水器总代理    时间: 2024-10-18 23:27
标题: Mybatis高级查询-一对多查询
表先容和表关系说明

新建以下4张表

  1. tb_user:用户表
  2. tb_order:订单表
  3. tb_item:商品表
  4. tb_orderdetail:订单详情表
复制代码


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

一对多查询

【目的】查询id为1的用户及其订单信息
【分析】
一个用户可以有多个订单。
一个订单只能属于一个用户。
用户(1)-----订单(n)
【步骤】
  1. 第一步:查询SQL分析;
  2. 第二步:添加关联关系;
  3. 第三步:编写接口方法;
  4. 第四步:编写映射文件;
  5. 第五步:测试
复制代码
【实现】
第一步:需求分析

编写SQL实现查询id为1的用户及其订单信息
查询语句及查询结果:


  1. #查询id为1的用户及其订单信息
  2. select * from tb_user where id=1;
  3. select * from tb_order where user_id=1;
  4. #一对多 内连接查询
  5. select * from tb_user tbu inner join tb_order tbo on tbu.id = tbo.user_id where tbu.id=1;
  6. # 封装数据:关联对象,一个用户关联多个订单  User(List<Order> orderList)
复制代码
说明:一个用户关联多个订单 User(List orderList) ,在User类中界说一个List聚集存储多个订单Order对象。
第二步:添加映射关系

因为一个用户可以拥有多个订单,所以用户订单一对多的关系;需要在User类中添加一个List<Order> 属性;
  1. package com.itheima.sh.pojo;
  2. import java.io.Serializable;
  3. import java.util.List;
  4. public class User implements Serializable {
  5.     private Long id;
  6.     // 用户名
  7.     private String userName;
  8.     // 密码
  9.     private String password;
  10.     // 姓名
  11.     private String name;
  12.     // 年龄
  13.     private Integer age;
  14.     //0 女性 1 男性
  15.     private Integer sex;
  16.     //订单
  17.     List<Order> orders;
  18.     public Long getId() {
  19.         return id;
  20.     }
  21.     public void setId(Long id) {
  22.         this.id = id;
  23.     }
  24.     public String getUserName() {
  25.         return userName;
  26.     }
  27.     public void setUserName(String userName) {
  28.         this.userName = userName;
  29.     }
  30.     public String getPassword() {
  31.         return password;
  32.     }
  33.     public void setPassword(String password) {
  34.         this.password = password;
  35.     }
  36.     public String getName() {
  37.         return name;
  38.     }
  39.     public void setName(String name) {
  40.         this.name = name;
  41.     }
  42.     public Integer getAge() {
  43.         return age;
  44.     }
  45.     public void setAge(Integer age) {
  46.         this.age = age;
  47.     }
  48.     public Integer getSex() {
  49.         return sex;
  50.     }
  51.     public void setSex(Integer sex) {
  52.         this.sex = sex;
  53.     }
  54.     public List<Order> getOrders() {
  55.         return orders;
  56.     }
  57.     public void setOrders(List<Order> orders) {
  58.         this.orders = orders;
  59.     }
  60.     @Override
  61.     public String toString() {
  62.         return "User{" +
  63.         "id=" + id +
  64.         ", userName='" + userName + '\'' +
  65.         ", password='" + password + '\'' +
  66.         ", name='" + name + '\'' +
  67.         ", age=" + age +
  68.         ", sex=" + sex +
  69.         ", orders=" + orders +
  70.         '}';
  71.     }
  72. }
复制代码
第三步:编写接口方法

UserMapper接口中,添加关联查询;
  1. /**
  2.      * 根据用户id查询用户及其订单信息
  3.      * @param id
  4.      * @return
  5.      */
  6. User oneToManyQuery(@Param("id") Long id);
复制代码
第四步:编写SQL

UserMapper.xml文件中编写SQL语句完成一对多的关联查询;
说明:
  1. 1.一对多使用collection子标签进行关联多方Order
  2.   <collection property="类中引用多方的成员变量名" javaType="存放多方容器的类型" ofType="多方类型" autoMapping="true">
  3.   </collection>
  4. 2.属性:
  5.     1)property="orders" 这里的orders表示User类的成员变量orders
  6.     2)javaType="List" 表示User类的成员变量orders存储的Order对象使用的类型,这里是List 一般不书写
  7.     3) ofType="Order" 表示List集合中存储数据的类型 Order
  8. 3.一定要记住这里给user表的id起别名是uid,order表的id起别名是oid.在resultMap标签的id子标签中的column属性值书写对应的uid和oid.
  9.     <!--自定义结果集-->
  10.     <resultMap id="oneToManyResult" type="User" autoMapping="true">
  11.         <!--User的主键-->
  12.         <id column="uid" property="id"/>
  13.         <!--Order关联映射-->
  14.         <!--
  15.             1.一对多使用collection子标签进行关联多方Order
  16.             2.属性:
  17.                 1)property="orders" 这里的orders表示User类的成员变量orders
  18.                 2)javaType="List" 表示User类的成员变量orders存储的Order对象使用的类型,这里是List,可以不配置
  19.                 3) ofType="Order" 表示List集合中存储数据的类型 Order
  20.         -->
  21.         <collection property="orders" javaType="List" ofType="Order" autoMapping="true">
  22.             <!--Order的主键-->
  23.             <id column="oid" property="id" />
  24.         </collection>
  25.     </resultMap>
  26.     <!--根据用户ID查询用户及其订单数据-->
  27.     <select id="oneToManyQuery" resultMap="oneToManyResult">
  28.         SELECT
  29.             tbo.id as oid,
  30.             tbo.order_number,
  31.             tbu.id as uid,
  32.             tbu.user_name,
  33.             tbu.password,
  34.             tbu.name,
  35.             tbu.age,
  36.             tbu.sex
  37.         FROM
  38.             tb_user tbu
  39.             INNER JOIN tb_order tbo ON tbu.id = tbo.user_id
  40.         WHERE
  41.             tbu.id = #{id}
  42.     </select>
复制代码
第五步:测试

在用户的测试类中
  1. public class MybatisTest01 {
  2.     private static UserMapper mapper = null;
  3.     @BeforeClass
  4.     public static void beforeClass() throws Exception {
  5.         //1.构建SessionFactory
  6.         String resouce = "mybatis-config.xml";
  7.         InputStream is = Resources.getResourceAsStream(resouce);
  8.         SqlSessionFactory build = new SqlSessionFactoryBuilder().build(is);
  9.         //2.获取session
  10.         SqlSession sqlSession = build.openSession(true);
  11.         //3.获取接口对象
  12.         mapper = sqlSession.getMapper(UserMapper.class);
  13.     }  
  14.     //根据用户ID查询用户及其订单数据
  15.     @Test
  16.     public void oneToManyQuery() {
  17.         User user = mapper.oneToManyQuery(1L);
  18.         System.out.println("user = " + user);
  19.     }
  20. }
复制代码


【小结】

  1. 一对多关系配置:
  2. 1、在对象中添加映射关系;
  3. 2、编写接口方法,编写SQL;
  4. 3、编写resultMap处理数据库字段和实体类之间数据的封装;
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4