MyBatis中的collection两种常用使用方法(非常详细)

MyBatis中的collection两种常用使用方法
码云MybatisDemo: 用来学习springboot整合mybatis (gitee.com)

collection主要是应对表关系是一对多的情况

查询的时候,用到联表去查询

接下来的小案例包括:市,学校,医院(随便写的),写一个最简单的demo

主要的功能就是查询出所有的市以及对应的市下面所有的学校和医院

实体类:医院

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Hospital {
private int id; //医院编号
private int urbanId; //市的编号
private String hospitalName; //医院名称
private Long people; //医院人数
}
1
2
3
4
5
6
7
8
9
实体类:学校

@Data
@AllArgsConstructor
@NoArgsConstructor
public class School {
private int id; //学校编号
private int urbanId; //市的编号
private String schoolName; //学校名字
private Long people; //学校人数
}
1
2
3
4
5
6
7
8
9
实体类:市

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Urban {
private int id; //市的编号
private String cityId; //省的编号(此博文没用到)
private String urbanName; //城市名字
private List<School> schools; //对应的所有的学校
private List<Hospital> hospitals; //对应的所有的医院
}
1
2
3
4
5
6
7
8
9
10
第一种方式,采用select
首先我们要在学校和医院接口对应的xml中写出按照市的编号来查询出所有数据的xml

xml:医院

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yh.mybatis.dao.mapper.HospitalMapper">
<select id="findAllByUId" resultType="com.yh.mybatis.dao.pojo.Hospital">
select * from hospital where urban_id = #{urbanId}
</select>
<!--实际工作不建议用 *,id就是mapper接口中对应的方法名,resultType就是查询出结果后返回的list的泛型
urban_id = #{urbanId} 按照urban_id去查找-->
</mapper>
1
2
3
4
5
6
7
8
9
xml:学校

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yh.mybatis.dao.mapper.SchoolMapper">
<select id="urbanSchool" resultType="com.yh.mybatis.dao.pojo.School">
select * from school where urban_id = #{urbanId}
</select>
</mapper>
1
2
3
4
5
6
7
接下来就是在市的xml中对学校和医院的xml进行一个调用(用collection中select)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yh.mybatis.dao.mapper.UrbanMapper">
<resultMap id="findAllUrbanSandH" type="com.yh.mybatis.dao.pojo.Urban">
<collection property="schools" javaType="java.util.List" ofType="com.yh.mybatis.dao.pojo.School"
select="com.yh.mybatis.dao.mapper.SchoolMapper.urbanSchool"
column="{urbanId=id}">
</collection>
<collection property="hospitals" javaType="java.util.List" ofType="com.yh.mybatis.dao.pojo.Hospital"
select="com.yh.mybatis.dao.mapper.HospitalMapper.findAllByUId"
column="{urbanId=id}">
</collection>
</resultMap>
<!--
resultMap中的 <id><result>都可以不写,直接写List<School>和List<Hospital>
type还是sql的返回类型
collection中 property 是Urban中对应的字段
javaType 是这个字段的类型
ofType 是这个字段的泛型 这一项和上一项其实都可以不写,写上了看着更清晰
select 是子表的按照市的编号查询所有数据的方法 这里要写下全路径
column 作为select语句的参数传入, 也就是把市的编号id 传给医院和学校xml的urbanId
-->
<select id="findAllUrbanSandH" resultMap="findAllUrbanSandH">
select * from urban
</select>
</mapper>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
第二种方式,执行一次sql
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yh.mybatis.dao.mapper.UrbanMapper">
<resultMap id="findAllUrbanSandH2" type="com.yh.mybatis.dao.pojo.Urban">
<id property="id" column="id"/>
<result property="cityId" column="city_id"/>
<result property="urbanName" column="urban_name"/>
<!--这上面这几个字段就是urban表中,自带的那几个字段-->
<collection property="schools" javaType="java.util.List" ofType="com.yh.mybatis.dao.pojo.School">
<id property="id" column="sid"/>
<result property="urbanId" column="surban_id"/>
<result property="schoolName" column="school_name"/>
<result property="people" column="speople"/>
</collection>
<!--这上面就是school表中的字段
javaType是urban类中定义的school的类型 可以不写
ofType就是泛型,这个还是很有必要的,接下来的id result 就是这个类中定义的各种字段,要写全
如果涉及到的任何表中,在数据库中有重复的字段名,那就必须要起别名。(例如各个表中的id)
起别名直接在下面的sql中就可以。
-->
<collection property="hospitals" javaType="java.util.List" ofType="com.yh.mybatis.dao.pojo.Hospital">
<id property="id" column="hid"/>
<result property="urbanId" column="hurban_id"/>
<result property="hospitalName" column="hospital_name"/>
<result property="people" column="hpeople"/>
</collection>
</resultMap>
<select id="findAllUrbanSandH2" resultMap="findAllUrbanSandH2">
select urban.city_id
,urban.id
,urban.urban_name
,school.id sid
,school.urban_id surban_id
,school.school_name
,school.people speople
,hospital.id hid
,hospital.urban_id hurban_id
,hospital.hospital_name
,hospital.people hpeople
from urban
inner join school on urban.id = school.urban_id
inner join hospital on urban.id = hospital.urban_id
</select>
</mapper>
————————————————
版权声明:本文为CSDN博主「Rabbityyhh」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_46645338/article/details/123987406

posted @ 2022-05-19 22:19  飞蚊  阅读(2129)  评论(0编辑  收藏  举报