MyBatis中的collection两种使用方法及效率比较

网友投稿 381 2022-07-24


目录第一种方式,采用select第二种方式,执行一次sql比较

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

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

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

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

实体类:医院

@Data

@AllArgsConstructor

@NoArgsConstructor

public class Hospital {

private int id; //医院编号

private int urbanId; //市的编号

private String hospitalName; //医院名称

private Long people; //医院人数

}

实体类:学校

@Data

@AllArgsConstructor

@NoArgsConstructor

public class School {

private int id; //学校编号

private int urbanId; //市的编号

private String schoolName; //学校名字

private Long people; //学校人数

}

实体类:市

@Data

@AllArgsConstructor

@NoArgsConstructor

public class Urban {

private int id; //市的编号

private String cityId; //省的编号(此博文没用到)

private String urbanName; //城市名字

private List schools; //对应的所有的学校

private List

}

第一种方式,采用select

首先我们要在学校和医院接口对应的xml中写出按照市的编号来查询出所有数据的xml

xml:医院

select * from hospital where urban_id = #{urbanId}

xml:学校

select * from school where urban_id = #{urbanId}

接下来就是在市的xml中对学校和医院的xml进行一个调用(用collection中select)

select="com.yh.mybatis.dao.mapper.SchoolMapper.urbanSchool"

column="{urbanId=id}">

select="com.yh.mybatis.dao.mapper.HospitalMapper.findAllByUId"

column="{urbanId=id}">

select * from urban

第二种方式,执行一次sql

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

接下来就可以写两个接口来测试这两个xml配置是否正确,具体的代码在最上面的码云地址里,大家可以配合swagger进行测试。

比较

方案一:需要执行至少三次sql语句,开启三次事务才能完成本次请求。方案二:需要执行一次sql语句,开启一次事务就能完成本次请求

方案二比方案一的效率要高,但是在使用的时候,方案一的代码可重用性要高

如果想要追求代码重用性可以选择方案一如果比较在乎运行的性能可以选择方案二

}

第一种方式,采用select

首先我们要在学校和医院接口对应的xml中写出按照市的编号来查询出所有数据的xml

xml:医院

select * from hospital where urban_id = #{urbanId}

xml:学校

select * from school where urban_id = #{urbanId}

接下来就是在市的xml中对学校和医院的xml进行一个调用(用collection中select)

select="com.yh.mybatis.dao.mapper.SchoolMapper.urbanSchool"

column="{urbanId=id}">

select="com.yh.mybatis.dao.mapper.SchoolMapper.urbanSchool"

column="{urbanId=id}">

select="com.yh.mybatis.dao.mapper.HospitalMapper.findAllByUId"

column="{urbanId=id}">

select="com.yh.mybatis.dao.mapper.HospitalMapper.findAllByUId"

column="{urbanId=id}">

select * from urban

第二种方式,执行一次sql

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

接下来就可以写两个接口来测试这两个xml配置是否正确,具体的代码在最上面的码云地址里,大家可以配合swagger进行测试。

比较

方案一:需要执行至少三次sql语句,开启三次事务才能完成本次请求。方案二:需要执行一次sql语句,开启一次事务就能完成本次请求

方案二比方案一的效率要高,但是在使用的时候,方案一的代码可重用性要高

如果想要追求代码重用性可以选择方案一如果比较在乎运行的性能可以选择方案二


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java实现窗体程序显示日历表
下一篇:Java实现窗体程序显示日历
相关文章

 发表评论

暂时没有评论,来抢沙发吧~