天天看點

mybatis(四).MyBatis的關聯映射                                      MyBatis的關聯映射執行個體一:關聯屬性是集合執行個體二:關聯屬性是對象執行個體三:MyBatis傳回自動主鍵

                                      MyBatis的關聯映射

目錄

執行個體一:關聯屬性是集合

1.單獨發送一個sql抓取資料給關聯屬性

(1).添加關聯屬性

(2).編寫sql

(3).接口中添加對應方法

(4).測試

2.主對象資料和關聯屬性一起抓取。

(1).編寫sql

(2).測試

執行個體二:關聯屬性是對象

1.添加關聯屬性

2.編寫接口

3.編寫接口

4.測試

執行個體三:MyBatis傳回自動主鍵

1.編寫sql

2.編寫接口

3.測試

附加:

原始的jdbc在查詢資料時,要查詢多個表的資料,一種做法是:一個表的寫一個sql,用該表的實體類去裝載資料,最後查出來用java組裝起來,另一種做法:寫一個綜合實體類(把要查的字段對應的屬性都加進去),寫一個sql,一次性查出來。那麼我們的MyBatis持久化架構對待這種問題時如何處理的,有沒有簡單的方法。我們今天就來學習MyBatis的關聯映射

關聯映射的優點:便于查詢相關表資訊。

對象之間建立聯系,需要用到關聯屬性,關聯屬性一般有兩種類型:集合對象類型,單個對象類型。

接下來我們看看到底是怎麼做的?

今天我們要做的是在前面的文章說的搭好MyBaits項目的基礎上,可以看MyBatis的映射器規則、MyBatis的動态sql這兩篇文章中任何一篇文章中搭建的MyBatis項目的基礎上做今天的練習都可以。

之前的項目名稱是:mybatis_demo1、資料庫類型:mysql、資料庫名稱:jsd15077db、用的表有user, record表。

兩張表的資訊如下:

          user(id,username、pwd、name、gender),各字段分别是使用者id(主鍵)、登入名稱、密碼、昵稱、性别。

          record(record_id、user_id、remark、status),各字段分别是記錄id(主鍵)、使用者id(外鍵)、備注、狀态。

執行個體一:關聯屬性是集合

場景,根據使用者id我們查詢使用者資訊時同時也要查出這個使用者的所有記錄,一個使用者有多條記錄。

1.單獨發送一個sql抓取資料給關聯屬性

(1).添加關聯屬性

給使用者實體類添加關聯屬性records,并且同時添加get、set方法,如下圖:

mybatis(四).MyBatis的關聯映射                                      MyBatis的關聯映射執行個體一:關聯屬性是集合執行個體二:關聯屬性是對象執行個體三:MyBatis傳回自動主鍵

(2).編寫sql

在UserMapper.xml檔案中添加這個用于關聯查詢的sql,id為linkQuery,代碼如下:

mybatis(四).MyBatis的關聯映射                                      MyBatis的關聯映射執行個體一:關聯屬性是集合執行個體二:關聯屬性是對象執行個體三:MyBatis傳回自動主鍵

注:

     sql中,resultType屬性是按照屬性名稱比對的,比對不上就為空。而resultMap是開發者自己定義的比對規則,在<resultMap>标簽中:

           要自定義的關聯屬性如果是集合就用<collection>标簽,如果不是就用<association>标簽; 

           ofType指的是該集合元素的類型;

            select指的是另一個查詢;

           column指的是該集合的元素的某個屬性作為另一個查詢的參數。

(3).接口中添加對應方法

在UserDao接口中添加方法linkQuery,代碼如下圖:

mybatis(四).MyBatis的關聯映射                                      MyBatis的關聯映射執行個體一:關聯屬性是集合執行個體二:關聯屬性是對象執行個體三:MyBatis傳回自動主鍵

(4).測試

在com.cdd.test包下建立類TestAssicoation用于測試,代碼如下:

package com.cdd.test;

import org.apache.ibatis.session.SqlSession;

import com.cdd.dao.UserDao;
import com.cdd.entity.Record;
import com.cdd.entity.User;
import com.cdd.util.MyBatisUtil;

public class TestAssication {
 
	public static void main(String[] args) throws Exception{
		SqlSession session = MyBatisUtil.getSqlSession();
		UserDao dao = session.getMapper(UserDao.class);
		User user = dao.linkQuery(3);
		System.out.println(user.getUsername()+"的記錄有:");
		for(Record r : user.getRecords()){
			System.out.println(r);
		}
		
		session.close();
	}
}
           

檢視控制台輸出:

mybatis(四).MyBatis的關聯映射                                      MyBatis的關聯映射執行個體一:關聯屬性是集合執行個體二:關聯屬性是對象執行個體三:MyBatis傳回自動主鍵

2.主對象資料和關聯屬性一起抓取。

将關聯資料與主對象資料一起抓取(基于表關聯查詢join..on...).适用于關聯多個表。

(1).編寫sql

在UserMapper.xml檔案中,添加查詢sql,id為linkSerach,代碼如下:

mybatis(四).MyBatis的關聯映射                                      MyBatis的關聯映射執行個體一:關聯屬性是集合執行個體二:關聯屬性是對象執行個體三:MyBatis傳回自動主鍵

(2).測試

在TestAssication類中編寫測試,把上一個的測試部分先注釋,代碼如下:

mybatis(四).MyBatis的關聯映射                                      MyBatis的關聯映射執行個體一:關聯屬性是集合執行個體二:關聯屬性是對象執行個體三:MyBatis傳回自動主鍵

檢視控制台:

mybatis(四).MyBatis的關聯映射                                      MyBatis的關聯映射執行個體一:關聯屬性是集合執行個體二:關聯屬性是對象執行個體三:MyBatis傳回自動主鍵

注:在<resultMap>标簽中,屬性與對應時,如果是表主鍵就用<id>标簽,不是的話就用<result>标簽

執行個體二:關聯屬性是對象

查詢所有的記錄資訊,把對應的使用者資訊裝載到記錄實體類中。

1.添加關聯屬性

在記錄實體類Record類中添加關聯屬性user,并且添加get、set方法,情況如下:

mybatis(四).MyBatis的關聯映射                                      MyBatis的關聯映射執行個體一:關聯屬性是集合執行個體二:關聯屬性是對象執行個體三:MyBatis傳回自動主鍵

2.編寫接口

在RecordMapper.xml檔案中編寫查詢sql,id為linkFind,代碼如下:

mybatis(四).MyBatis的關聯映射                                      MyBatis的關聯映射執行個體一:關聯屬性是集合執行個體二:關聯屬性是對象執行個體三:MyBatis傳回自動主鍵

3.編寫接口

在RecordDao接口中,添加方法linkSerach方法,代碼如下:

mybatis(四).MyBatis的關聯映射                                      MyBatis的關聯映射執行個體一:關聯屬性是集合執行個體二:關聯屬性是對象執行個體三:MyBatis傳回自動主鍵

4.測試

在TestAssication中先注釋之前的測試部分,再編寫現在的測試,情況如下:

package com.cdd.test;

import java.util.List;

import org.apache.ibatis.session.SqlSession;

import com.cdd.dao.RecordDao;
import com.cdd.dao.UserDao;
import com.cdd.entity.Record;
import com.cdd.entity.User;
import com.cdd.util.MyBatisUtil;

public class TestAssication {
 
	public static void main(String[] args) throws Exception{
		SqlSession session = MyBatisUtil.getSqlSession();
		
		UserDao dao = session.getMapper(UserDao.class);
//		User user = dao.linkQuery(3);
//		System.out.println(user.getUsername()+"的記錄有:");
//		for(Record r : user.getRecords()){
//			System.out.println(r);
//		}
		
//		User user1 = dao.linkSerach(4);
//		System.out.println(user1.getUsername()+"的記錄有:");
//		for(Record r : user1.getRecords()){
//			System.out.println(r);
//		}
		
		RecordDao dao1 = session.getMapper(RecordDao.class);
		List<Record> recordList = dao1.linkFind();
		for(Record r : recordList){
			System.out.println(r);
		}
		session.close();
	}
}
           

檢視控制台輸出:

mybatis(四).MyBatis的關聯映射                                      MyBatis的關聯映射執行個體一:關聯屬性是集合執行個體二:關聯屬性是對象執行個體三:MyBatis傳回自動主鍵

執行個體三:MyBatis傳回自動主鍵

在實際情況中,我們往往儲存一個新對象,而這個對象對應的資料表的主鍵是自增長,mybatis在儲存一條記錄時是如何擷取到這條記錄自動産生的主鍵的。我們現在來看看。

場景,現在要儲存一個使用者到User表中,User表的主鍵id,是自增長的,可以先看看這個表的結構:

mybatis(四).MyBatis的關聯映射                                      MyBatis的關聯映射執行個體一:關聯屬性是集合執行個體二:關聯屬性是對象執行個體三:MyBatis傳回自動主鍵

1.編寫sql

在UserMapper.xml檔案中編寫儲存使用者的sql,id為save,代碼如下:

mybatis(四).MyBatis的關聯映射                                      MyBatis的關聯映射執行個體一:關聯屬性是集合執行個體二:關聯屬性是對象執行個體三:MyBatis傳回自動主鍵

注:

         useGenerateKeys="true",不用寫查詢語句,能夠降低資料庫壓力,可以得到剛才儲存的那條記錄的主鍵id,使用于mysql           資料庫。

        keyProperty="id" ,id為User表的主鍵。

2.編寫接口

在UserDao中添加對應方法save,代碼如下:

mybatis(四).MyBatis的關聯映射                                      MyBatis的關聯映射執行個體一:關聯屬性是集合執行個體二:關聯屬性是對象執行個體三:MyBatis傳回自動主鍵

3.測試

在TestAssication類中先注釋掉之前的測試部分,添加對儲存使用者的測試,代碼如下:

mybatis(四).MyBatis的關聯映射                                      MyBatis的關聯映射執行個體一:關聯屬性是集合執行個體二:關聯屬性是對象執行個體三:MyBatis傳回自動主鍵

執行,檢視控制台:

mybatis(四).MyBatis的關聯映射                                      MyBatis的關聯映射執行個體一:關聯屬性是集合執行個體二:關聯屬性是對象執行個體三:MyBatis傳回自動主鍵

再看資料庫:

mybatis(四).MyBatis的關聯映射                                      MyBatis的關聯映射執行個體一:關聯屬性是集合執行個體二:關聯屬性是對象執行個體三:MyBatis傳回自動主鍵

附加:

如果我們的資料庫是Oralce怎麼寫呢?請往下看。

mybatis(四).MyBatis的關聯映射                                      MyBatis的關聯映射執行個體一:關聯屬性是集合執行個體二:關聯屬性是對象執行個體三:MyBatis傳回自動主鍵

注:

     keyProperty="id" ,要查詢的字段是id;

     order="BEFORE" ,在insert之前執行,還有AFTER是在之後(都用大寫)

到這裡MyBatis的關聯映射部分,就暫告一段落了。有什麼問題請大家多多指教!