mybatis一对多查询处理

在这里插入图片描述

  1. 建立对应的数据库

    create table `major` (
      `id` int(10) not null comment '专业代码',
      `name` varchar(30) default null comment '专业名',
      primary key (`id`)
    ) engine=innodb default charset=utf8
    
    insert  into `major`(`id`,`name`) values (18001,'软件工程'),(18002,'通信工程');
    
    
    create table `student` (
      `id` int(10) not null comment '学号',
      `name` varchar(30) default null comment '姓名',
      `mid` int(10) default null comment '专业代码',
      primary key (`id`),
      key `fk_mid` (`mid`),
      constraint `fk_mid` foreign key (`mid`) references `major` (`id`)
    ) engine=innodb default charset=utf8
    
    insert  into `student`(`id`,`name`,`mid`) values 
    (1,'小明',18001),
    (2,'小红',18001),
    (3,'小黄',18001),
    (4,'小王',18002),
    (5,'小雪',18002);
    
  2. 编写对应的POJO实体类,为了方便使用lombok注解略去一些get/set方法等等

    Student实体类

    package com.pojo;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Student {
        private int id;             //学号
        private String name;        //姓名
        private int mid;            //专业代码
    }
    

    Major实体类

    package com.pojo;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    import lombok.ToString;
    
    import java.util.List;
    
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Major {
        private int id;             //专业代码
        private String name;        //专业名
        List<Student> students;     //学生集合
    }
    
  3. MajorMapper接口

    package com.dao;
    
    import com.pojo.Major;
    import org.apache.ibatis.annotations.Select;
    
    import java.util.List;
    
    public interface MajorMapper {
        
        List<Major> getMajorList1();				
    
        List<Major> getMajorList2();
    }
    

1. 按照查询结果处理

先进行链表查询出所需要的所有字段,然后进行统一处理将每一个字段一一映射。关键点在于Major实体类下的List< Student > students属性,这个属性是返回值是一个集合,泛型是一个Student类。

<select id="getMajorList1" resultMap="Major_Student">
    select s.id scode, s.name sname, m.id mcode, m.name mname
    from student s, major m where s.mid = m.id;
</select>

<resultMap id="Major_Student" type="Major">
    <id column="mcode" property="id"/>
    <id column="mname" property="name"/>

	
    <collection property="students" javaType="ArrayList" ofType="Student">
        <id column="scode" property="id" />
        <id column="sname" property="name"/>
        <id column="mcode" property="mid"/>
    </collection>
</resultMap>

在这里插入图片描述
< collection >标签用于处理复杂类型的集合

property = “students” 对应Major实体类中的students变量。

javaType = “ArrayList” 对应返回值类型,方法的返回值是一个ArrayList集合。

ofType = “Student” 对应集合容器的泛型。


2. 按照要求嵌套查询

由于整个Major实体类的属性可以分为两大类,一种为简单的基本属性类型,另一种是一个List< Student > students 集合类型。那么可以线进行主查询,查询出所有的基本属性类型。对于无法直接得到结果的集合类型 嵌套一个查询进行处理。

<!-- 主查询: 负责处理所有的基本数据类型属性 -->
<select id="getMajorList2" resultMap="major_map">
    select *from major;
</select>

<!--  对基本数据类型进行处理,声明复杂数据类型如何进行处理  -->
<resultMap id="major_map" type="Major">
	<id column="id" property="id"/>
    <id column="name" property="name"/>
    <collection property="students" javaType="ArrayList" ofType="Student" select="select_student" column="id"/>
</resultMap>

<!-- 子查询: 负责处理复杂数据类型ArrayList<Students> students   -->
<select id="select_student" resultType="Student">
    select *from student where mid = #{id}
</select>

在这里插入图片描述

无论是一对多查询 还是 对多一 查询最后都是利用resultMap强大的两个子标签:

  • < association > 处理单个复杂数据类型。

  • < collection > 处理集合类型的复杂数据类型。

个人认为按照结果进行处理的方式解决 1 :n的查询比较简单,易懂!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值