我是靠谱客的博主 爱撒娇哈密瓜,最近开发中收集的这篇文章主要介绍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的查询比较简单,易懂!

最后

以上就是爱撒娇哈密瓜为你收集整理的mybatis一对多查询处理的全部内容,希望文章能够帮你解决mybatis一对多查询处理所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部