MyBatis的collection和association的使用解讀
寫在前面
MyBatis涉及到多表關(guān)聯(lián)查詢的時(shí)候,有一個(gè)非常實(shí)用的工具,可以無縫封裝object、array,將結(jié)果返回指定格式的json數(shù)據(jù)。
在這里提供手把手教學(xué),一起看collection和association如何使用。
表結(jié)構(gòu)及數(shù)據(jù)準(zhǔn)備
CREATE TABLE `test_school` ( `id` varchar(20) NOT NULL, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `test_class` ( `id` varchar(20) NOT NULL, `name` varchar(255) DEFAULT NULL, `school_id` varchar(20) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `test_teacher` ( `id` varchar(20) NOT NULL, `name` varchar(255) DEFAULT NULL, `class_id` varchar(20) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
數(shù)據(jù)與關(guān)系
分別在三張表中簡(jiǎn)單的創(chuàng)建了幾條數(shù)據(jù),來簡(jiǎn)單的表示數(shù)據(jù)之間的關(guān)系。
我們可以看出,school與class的數(shù)據(jù)之間是一對(duì)多的關(guān)系;class與teacher之間的關(guān)系是一對(duì)一的關(guān)系。
如果只是單純的使用sql關(guān)聯(lián)查詢時(shí),會(huì)查出來三條數(shù)據(jù),其中school的數(shù)據(jù)是重復(fù)的,因?yàn)閘eft join嘛。
關(guān)鍵:MyBatis的xml
SchoolMapper.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.boot.security.server.dao.SchoolDao"> <resultMap id="SchoolMap" type="com.boot.security.server.model.TestSchool"> <id column="id" property="id" /> <result column="name" property="name" /> <collection property="testClasses" columnPrefix="tc_" resultMap="com.boot.security.server.dao.ClassDao.ClassMap"/> </resultMap> <select id="list" resultMap="SchoolMap"> select ts.id,ts.name, tc.id AS tc_id, tc.name AS tc_name, tc.school_id AS tc_school_id, tt.id AS tc_tt_id, tt.name AS tc_tt_name, tt.class_id AS tc_tt_class_id from test_school ts left join test_class tc on ts.id=tc.school_id left join test_teacher tt on tc.id=tt.class_id </select> </mapper>
ClassMapper.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.boot.security.server.dao.ClassDao"> <resultMap id="ClassMap" type="com.boot.security.server.model.TestClass"> <id column="id" property="id" /> <result column="name" property="name" /> <result column="school_id" property="schoolId" /> <association property="testTeacher" columnPrefix="tt_" resultMap="com.boot.security.server.dao.TeacherDao.TeacherMap"/> </resultMap> </mapper>
TeacherMapper.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.boot.security.server.dao.TeacherDao"> <resultMap id="TeacherMap" type="com.boot.security.server.model.TestTeacher"> <id column="id" property="id" /> <result column="name" property="name" /> <result column="class_id" property="classId" /> </resultMap> </mapper>
注意!SchoolMapper.xml中的collection與ClassMapper.xml中的association!
注意!注意查詢的sql起的別名,與collection和association中的columnPrefix屬性需要對(duì)應(yīng)
其中service、controller這里省略了,我們直接調(diào)用SchoolMapper.xml中的list方法,查看一下執(zhí)行結(jié)果!
執(zhí)行結(jié)果
我們可以看到,class被封裝成了一個(gè)數(shù)組(因?yàn)槲覀冊(cè)赟choolMapper.xml中用collection封裝);
teacher被封裝成一個(gè)對(duì)象(因?yàn)槲覀冊(cè)贑lassMapper.xml中用association封裝)。
總結(jié)
MyBatis提供了非常強(qiáng)大的對(duì)象、數(shù)組封裝方式,直接將查詢出來的結(jié)果封裝成對(duì)應(yīng)的格式。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- mybatis collection關(guān)聯(lián)查詢多個(gè)參數(shù)方式
- MyBatis使用嵌套查詢collection和association的實(shí)現(xiàn)
- mybatis?resultMap之collection聚集兩種實(shí)現(xiàn)方式
- mybatis中association和collection的使用與區(qū)別
- Mybatis中一對(duì)多(collection)和一對(duì)一(association)的組合查詢使用
- Mybatis使用Collection屬性的示例代碼
- Mybatis的collection三層嵌套查詢方式(驗(yàn)證通過)
- mybatis?collection和association的區(qū)別解析
- MyBatis中<collection>標(biāo)簽的多種用法
相關(guān)文章
java中對(duì)象轉(zhuǎn)json字符串的三種常用方式
本文主要介紹了java中對(duì)象轉(zhuǎn)json字符串的三種常用方式,包含Jackson庫,Gson庫和Hutool工具類這三種,具有一定的參考價(jià)值,感興趣的可以了解一下2024-06-06JAVA(MAVEN項(xiàng)目)添加JUnit依賴配置全過程
在Maven項(xiàng)目中進(jìn)行單元測(cè)試是確保代碼質(zhì)量的重要步驟,本教程提供SpringBoot和微服務(wù)平臺(tái)適用的單元測(cè)試方法,包括環(huán)境準(zhǔn)備、創(chuàng)建測(cè)試類、JUnit簡(jiǎn)介及注解使用,環(huán)境準(zhǔn)備涉及引入依賴和安裝JUnit插件,測(cè)試類創(chuàng)建可通過快捷鍵或手動(dòng)添加@Test注解來實(shí)現(xiàn)2024-10-10SpringBoot快速通關(guān)自動(dòng)配置應(yīng)用
在進(jìn)行項(xiàng)目編寫前,我們還需要知道一個(gè)東西,就是SpringBoot對(duì)我們的SpringMVC還做了哪些配置,包括如何擴(kuò)展,如何定制,只有把這些都搞清楚了,我們?cè)谥笫褂貌艜?huì)更加得心應(yīng)手2022-07-07java經(jīng)典問題:連個(gè)字符串互為回環(huán)變位
連個(gè)字符串互為回環(huán)變位經(jīng)常出現(xiàn)在java程序員面試中,這個(gè)是考驗(yàn)程序員的解題思路和方法的最經(jīng)典的一題,小編為大家詳細(xì)分析一下,一起來學(xué)習(xí)吧。2017-11-11深入理解Java并發(fā)編程之LinkedBlockingQueue隊(duì)列
本文主要介紹了Java并發(fā)編程之LinkedBlockingQueue隊(duì)列,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04基于jenkins構(gòu)建結(jié)果企業(yè)微信提醒
這篇文章主要介紹了基于jenkins構(gòu)建結(jié)果企業(yè)微信提醒,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08