Mybatis中连接查询和嵌套查询实例代码
首先在mysql中确立表:
#表一:地址国家表 CREATETABLEaddress(aidINTAUTO_INCREMENTPRIMARYKEY,anameVARCHAR(20)); INSERTINTOaddressVALUES(NULL,"魏国"); INSERTINTOaddressVALUES(NULL,"蜀国"); INSERTINTOaddressVALUES(NULL,"吴国"); #表二:出场人物表 CREATETABLEperson( pidINTAUTO_INCREMENTPRIMARYKEY, pnameVARCHAR(20), paidINT, CONSTRAINTpafkFOREIGNKEYperson(paid)REFERENCESaddress(aid)ONUPDATECASCADEONDELETECASCADE ); INSERTINTOpersonVALUES(1,"曹操",1); INSERTINTOpersonVALUES(2,"荀彧",1); INSERTINTOpersonVALUES(3,"张辽",1); INSERTINTOpersonVALUES(4,"刘备",2); INSERTINTOpersonVALUES(5,"关羽",2); INSERTINTOpersonVALUES(6,"张飞",2); INSERTINTOpersonVALUES(7,"诸葛亮",2); INSERTINTOpersonVALUES(8,"孙权",3); INSERTINTOpersonVALUES(9,"周瑜",3); INSERTINTOpersonVALUES(10,"陆逊",3); INSERTINTOpersonVALUES(11,"公孙瓒",NULL); #表三:交通工具表 CREATETABLEtool(tidINTAUTO_INCREMENTPRIMARYKEY,tnameVARCHAR(20)); INSERTINTOtoolVALUES(1,"马"); INSERTINTOtoolVALUES(2,"船"); #表四:地址国家——交通工具多对多关系表 CREATETABLEaandt( a_aidINT, a_tidINT, PRIMARYKEY(a_aid,a_tid),#联合主键,是指多个字段组成一个组合,该组合在数据表中唯一 CONSTRAINTFOREIGNKEYaandt(a_aid)REFERENCESaddress(aid)ONUPDATECASCADEONDELETECASCADE, CONSTRAINTFOREIGNKEYaandt(a_tid)REFERENCEStool(tid)ONUPDATECASCADEONDELETECASCADE ); INSERTINTOaandtVALUES(1,1); INSERTINTOaandtVALUES(2,1); INSERTINTOaandtVALUES(2,2); INSERTINTOaandtVALUES(3,2);
查询a表的所有信息,如果a表的信息有对应的b表的信息,则查询b表的信息,如果没有,则不查询。
多对一,如:查询所有人物信息,如果人物有对应国家,则查询国家信息,如果没有,则不查询。多个人物属于一个国家。
一对多,如:查询所有国家信息,如果国家有对应人物,则查询人物信息,如果没有,则不查询。一个国家拥有多个城市。
多对多,如:查询所有国家信息,如果国家拥有对应的交通工具,则查询交通工具信息,没有则不查询。与此同时,多种交通工具存在于于多个国家。
一、连接查询:
连接查询使用时,使用偏向于a表所在方向的外连接,可获得a表所有信息,和对应的b表信息。该方式为饿汉式,内存占用较大,但对数据库访问次数较少而导致消耗时间少。
1、多对一:
/*resultMap:自己编写的结果集,本查询的返回值正是该结果集所对应的映射组构成的Person*/ --查询所有人及其对应的地址,以人为主,则对人侧外连接 SELECT*FROMpersonpLEFTOUTERJOINaddressaONp.paid=a.aid
2、一对多:
SELECT*FROMaddressaLEFTOUTERJOINpersonpONa.aid=p.paid;
3、多对多:
SELECTt.*,a.*FROMtoolAStLEFTOUTERJOINaandtASa_tONt.`tid`=a_t.`a_tid`LEFTOUTERJOINaddressASaONa_t.`a_aid`=a.`aid`;
二、嵌套查询:
嵌套查询使用时,先查询a表的信息,然后依赖a和b表的外键约束,利用in(),再次查询b表对应到a表上的信息。该方式可以改为饿汉式,内存使用较小,但需要多次访问数据库而导致消耗时间多。
1、多对一:
PersonDao接口内写入:
//查询所有人,以及其对应的地址 ListfindPersonFromAddress();
对应映射配置中:
select*fromperson
继续编写指向AddressDao接口中的findAddressById:
//按照id查询Address ListfindAddressById(Integerid);
回到AddressDao配置文件:
SELECT*FROMaddressWHEREaid=#{aid}
2、一对多:
AddressDao接口内写入:
ListfindAddressWithPerson();
其对应映射配置中:
select*fromaddress
针对指出的PersonDao接口的findPersonById:
ListfindPersonById(Integerid);
其对应的映射配置中:
select*frompersonwherepid=#{pid}
对于嵌套查询的延迟加载问题,需添加配置:
方法一:
association或collection中多加一条属性:fetchType=“lazy”
方法二:
到此这篇关于Mybatis中连接查询和嵌套查询的文章就介绍到这了,更多相关Mybatis连接查询和嵌套查询内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!