Mybatis中的連線查詢與巢狀查詢

2021-09-25 11:24:21 字數 3573 閱讀 1153

首先在mysql中確立表:

#表一:位址國家表

create table address(aid int auto_increment primary key,aname varchar(20));

insert into address values(null,"魏國");

insert into address values(null,"蜀國");

insert into address values(null,"吳國");

#表二:出場人物表

create table person(

pid int auto_increment primary key,

pname varchar(20),

paid int,

constraint pafk foreign key person(paid) references address(aid) on update cascade on delete cascade

); insert into person values(1,"曹操",1);

insert into person values(2,"荀彧",1);

insert into person values(3,"張遼",1);

insert into person values(4,"劉備",2);

insert into person values(5,"關羽",2);

insert into person values(6,"張飛",2);

insert into person values(7,"諸葛亮",2);

insert into person values(8,"孫權",3);

insert into person values(9,"周瑜",3);

insert into person values(10,"陸遜",3);

insert into person values(11,"公孫瓚",null);

#表三:交通工具表

create table tool(tid int auto_increment primary key,tname varchar(20));

insert into tool values(1,"馬");

insert into tool values(2,"船");

#表四:位址國家——交通工具 多對多關係表

create table aandt(

a_aid int,

a_tid int,

primary key(a_aid,a_tid),#聯合主鍵,是指多個字段組成乙個組合,該組合在資料表中唯一

constraint foreign key aandt(a_aid) references address(aid) on update cascade on delete cascade,

constraint foreign key aandt(a_tid) references tool(tid) on update cascade on delete cascade

);insert into aandt values(1,1);

insert into aandt values(2,1);

insert into aandt values(2,2);

insert into aandt values(3,2);

查詢a表的所有資訊,如果a表的資訊有對應的b表的資訊,則查詢b表的資訊,如果沒有,則不查詢。

多對一,如:查詢所有人物資訊,如果人物有對應國家,則查詢國家資訊,如果沒有,則不查詢。多個人物屬於乙個國家。

一對多,如:查詢所有國家資訊,如果國家有對應人物,則查詢人物資訊,如果沒有,則不查詢。乙個國家擁有多個城市。

多對多,如:查詢所有國家資訊,如果國家擁有對應的交通工具,則查詢交通工具資訊,沒有則不查詢。與此同時,多種交通工具存在於於多個國家。

一、連線查詢:

連線查詢使用時,使用偏向於a表所在方向的外連線,可獲得a表所有資訊,和對應的b表資訊。該方式為餓漢式,記憶體占用較大,但對資料庫訪問次數較少而導致消耗時間少。

1、多對一:

/*resultmap:自己編寫的結果集,本查詢的返回值正是該結果集所對應的對映組構成的person*/

-- 查詢所有人及其對應的位址,以人為主,則對人側外連線

select * from person p left outer join address a on p.paid = a.aid

2、一對多:

select * from address a left outer join person p on a.aid = p.paid;

3、多對多:

select t.*,a.* from tool as t left outer join aandt as a_t on t.`tid` = a_t.`a_tid` left outer join address as a on a_t.`a_aid` = a.`aid`;

二、巢狀查詢:

巢狀查詢使用時,先查詢a表的資訊,然後依賴a和b表的外來鍵約束,利用in(),再次查詢b表對應到a表上的資訊。該方式可以改為餓漢式,記憶體使用較小,但需要多次訪問資料庫而導致消耗時間多。

1、多對一:

persondao介面內寫入:

//查詢所有人,以及其對應的位址

listfindpersonfromaddress();

對應對映配置中:

select * from person

繼續編寫指向addressdao介面中的findaddressbyid:

//按照id查詢address

listfindaddressbyid(integer id);

回到addressdao配置檔案:

select * from address where aid = #

2、一對多:

addressdao介面內寫入:

listfindaddresswithperson();
其對應對映配置中:

select * from address

針對指出的persondao介面的findpersonbyid:

listfindpersonbyid(integer id);
其對應的對映配置中:

select * from person where pid = #

對於巢狀查詢的延遲載入問題,需新增配置:

方法一:

association或collection中多加一條屬性:fetchtype=「lazy」

方法二:

mybatis中的查詢

第一種,根據建立時間查詢,搜尋框中開始時間和結束時間,在搜尋的時間段中包含建立時間的記錄被查詢出來 and a.insert date between and 第二種,模糊查詢,根據關鍵字模糊查詢 and a.car id like 第三種,統計,如果統計結果只有一條並且只有一列,那麼直接返回int...

自連線及其中嵌子查詢

自連線查詢角色資訊及其父角色 var result from r1 in edatacontext.role join r2 in edatacontext.role on r1.parentroleid equals r2.roleid where r1.isdeleted false selec...

Mybatis中的模糊查詢

1.當我們從資料庫中查詢資料時,大批量的資料會存在相同的資料。比如重名的人,當我們使用姓名查詢該姓名的所有資料時,我們需要在mybatis中使用到模糊查詢的概念。在介面中定義函式 模糊查詢 使用name查詢的資料為物件tb7,返回的不止乙個物件使用list public listquerybynam...