概述
-
建立对应的数据库
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);
-
编写对应的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; //学生集合 }
-
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一对多查询处理所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复