MyBatis中的collection兩種使用方法及效率比較
collection主要是應(yīng)對表關(guān)系是一對多的情況
查詢的時候,用到聯(lián)表去查詢
接下來的小案例包括:市,學(xué)校,醫(yī)院(隨便寫的),寫一個最簡單的demo
主要的功能就是查詢出所有的市以及對應(yīng)的市下面所有的學(xué)校和醫(yī)院
實體類:醫(yī)院
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Hospital {
private int id; //醫(yī)院編號
private int urbanId; //市的編號
private String hospitalName; //醫(yī)院名稱
private Long people; //醫(yī)院人數(shù)
}實體類:學(xué)校
@Data
@AllArgsConstructor
@NoArgsConstructor
public class School {
private int id; //學(xué)校編號
private int urbanId; //市的編號
private String schoolName; //學(xué)校名字
private Long people; //學(xué)校人數(shù)
}實體類:市
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Urban {
private int id; //市的編號
private String cityId; //省的編號(此博文沒用到)
private String urbanName; //城市名字
private List<School> schools; //對應(yīng)的所有的學(xué)校
private List<Hospital> hospitals; //對應(yīng)的所有的醫(yī)院
}第一種方式,采用select
首先我們要在學(xué)校和醫(yī)院接口對應(yīng)的xml中寫出按照市的編號來查詢出所有數(shù)據(jù)的xml
xml:醫(yī)院
<?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接口中對應(yīng)的方法名,resultType就是查詢出結(jié)果后返回的list的泛型
urban_id = #{urbanId} 按照urban_id去查找-->
</mapper>xml:學(xué)校
<?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>接下來就是在市的xml中對學(xué)校和醫(yī)院的xml進行一個調(diào)用(用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中對應(yīng)的字段
javaType 是這個字段的類型
ofType 是這個字段的泛型 這一項和上一項其實都可以不寫,寫上了看著更清晰
select 是子表的按照市的編號查詢所有數(shù)據(jù)的方法 這里要寫下全路徑
column 作為select語句的參數(shù)傳入, 也就是把市的編號id 傳給醫(yī)院和學(xué)校xml的urbanId
-->
<select id="findAllUrbanSandH" resultMap="findAllUrbanSandH">
select * from urban
</select>
</mapper>第二種方式,執(zhí)行一次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 就是這個類中定義的各種字段,要寫全
如果涉及到的任何表中,在數(shù)據(jù)庫中有重復(fù)的字段名,那就必須要起別名。(例如各個表中的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>
接下來就可以寫兩個接口來測試這兩個xml配置是否正確,具體的代碼在最上面的碼云地址里,大家可以配合swagger進行測試。
比較
方案一:需要執(zhí)行至少三次sql語句,開啟三次事務(wù)才能完成本次請求。
方案二:需要執(zhí)行一次sql語句,開啟一次事務(wù)就能完成本次請求
方案二比方案一的效率要高,但是在使用的時候,方案一的代碼可重用性要高
如果想要追求代碼重用性可以選擇方案一
如果比較在乎運行的性能可以選擇方案二
到此這篇關(guān)于MyBatis中的collection兩種使用方法及效率比較的文章就介紹到這了,更多相關(guān)MyBatis collection使用方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- mybatis?實現(xiàn)多層級collection嵌套
- 解決mybatis 中collection嵌套collection引發(fā)的bug
- Mybatis中Collection集合標(biāo)簽的使用詳解
- 詳解mybatis中association和collection的column傳入多個參數(shù)問題
- mybatis利用association或collection傳遞多參數(shù)子查詢
- Mybatis中collection和association的使用區(qū)別詳解
- Mybatis使用collection標(biāo)簽進行樹形結(jié)構(gòu)數(shù)據(jù)查詢時攜帶外部參數(shù)查詢
相關(guān)文章
mybatis plus動態(tài)數(shù)據(jù)源切換及查詢過程淺析
這篇文章主要介紹了mybatis plus動態(tài)數(shù)據(jù)源切換及查詢過程淺析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
Spring的BeanFactoryPostProcessor接口示例代碼詳解
這篇文章主要介紹了Spring的BeanFactoryPostProcessor接口,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02
SpringMVC中@ModelAttribute與@RequestBody的區(qū)別及說明
這篇文章主要介紹了SpringMVC中@ModelAttribute與@RequestBody的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11

