Mybatisでの接続クエリーとネストクエリー


まず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テーブルの情報をクエリーし、なければクエリーしません.
複数対1、たとえば:すべての人物情報をクエリーし、人物が対応する国がある場合は国情報をクエリーし、ない場合はクエリーしません.複数の人物が一つの国に属している.一対多、例えば:すべての国の情報をクエリーし、国に対応する人物がいる場合は人物情報をクエリーし、ない場合はクエリーしません.一つの国には複数の都市がある.多対多、例えば:すべての国の情報を検索し、国が対応する交通機関を持っている場合は、交通機関の情報を検索し、ない場合は検索しません.同時に、多くの交通手段が複数の国に存在する.
一、接続クエリー:接続クエリーの使用時に、a表のある方向に偏った外部接続を使用して、a表のすべての情報と対応するb表情報を得ることができる.この方式は餓漢式で、メモリの消費量は大きいが、データベースへのアクセス回数が少なく、消費時間が少ない.1、多対一:

 
 	
    
        
        
        
        
            
            
        
    
    


2、一対多:

 
    
        
        
        
            
            
            
        
    
    


3、多対多:

    
        
        
        
            
            
        
    
    

二、ネストクエリー:ネストクエリーが使用される場合、まずaテーブルの情報をクエリーし、それからaとbテーブルの外部キー制約に依存し、in()を利用して、再びbテーブルがaテーブルに対応する情報をクエリーする.この方式は餓漢式に変更でき、メモリの使用は小さいが、データベースに複数回アクセスする必要があり、消費時間が多い.1、多対一:PersonDaoインタフェース内書き込み:
//     ,        
    List findPersonFromAddress();

対応マッピング構成:

 
    
    
        
        
        
        
        
    
    
    


AddressDaoインタフェースへのfindAddressByIdの作成を続行します.
//  id  Address
List
findAddressById(Integer id);

AddressDaoプロファイルに戻ります.
 
    
    

2、一対多:AddressDaoインタフェース内書き込み:
List
findAddressWithPerson();

対応するマッピング構成:

        
        
        
    
    

指定されたPersonDaoインタフェースに対するfindPersonById:
 List findPersonById(Integer id);

対応するマッピング構成:


ネストされたクエリーの遅延ロードの問題について、構成を追加する必要があります.方法1:associationまたはcollectionに属性を追加します.fetchType=「lazy」メソッド2: