您好,登錄后才能下訂單哦!
今天小編給大家分享一下MyBatis中的collection如何使用的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
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<School> schools; //對應的所有的學校 private List<Hospital> hospitals; //對應的所有的醫院 }
首先我們要在學校和醫院接口對應的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>
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>
接下來就是在市的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>
<?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>
接下來就可以寫兩個接口來測試這兩個xml配置是否正確,具體的代碼在最上面的碼云地址里,大家可以配合swagger進行測試。
方案一:需要執行至少三次sql語句,開啟三次事務才能完成本次請求。
方案二:需要執行一次sql語句,開啟一次事務就能完成本次請求
方案二比方案一的效率要高,但是在使用的時候,方案一的代碼可重用性要高
如果想要追求代碼重用性可以選擇方案一
如果比較在乎運行的性能可以選擇方案二
以上就是“MyBatis中的collection如何使用”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。