mybatis多表查詢,一對一查詢

2020-09-21 22:23:22

一對一

前提條件

什麼時候會用到一對一?

  1. 假設有兩張表,一張使用者表,一張賬號表,使用者只能有一個賬戶,而使用者資訊和賬戶資訊都放到一張表裡就很顯得資料很冗餘。所以就分出來兩張表。
  2. 假設一款遊戲,要做登入驗證,使用者名稱和密碼就可以單獨出來一個表,因為登入的時候只查詢的是使用者名稱和密碼,所以單獨一個表出來是最佳方案,這樣查詢速度快, 同時使用者密碼錶也要關聯上使用者資訊表。

一對一設計的兩種方案

  1. 主鍵共用 (pk+fk)
  2. 外來鍵唯一 (fk+unique)

一對一查詢

一對一查詢有兩種方式
1. 建立子類 (不常用)
2. 從表中有實體參照(常用)

準備環境
現在有兩種表,一張使用者名稱(從表),一張賬戶表(主表)

  1. 從表實體類中應該含一個主表實體的包物件參照
public class Account {
	private Integer id;
	private Integer uid;
	private Double money;
	//從表實體類中應該有一個主表的物件
	private User user;
	//提供getset方法 該重寫的方法重寫了
}
  1. 準備的SQL語句
select
	a.*,u.id,u.name,u.password
from
	account a
join
	user u
on
	a.uid = u.id

  1. 因為Account(子表)表中有一個主表的物件,那麼再查詢結果封裝的時候是 沒辦法把User封裝進去的,需要這樣設定(在對映檔案中寫 resultMap)
<!--定義一個能封裝account和user的resultMap-->
<resultMap id="accountUserMap" type="Account">
	<!--定義主鍵欄位-->
	<id property="id" column="id"></id>
	<!--定義非主鍵欄位-->
	<result property="uid" column="uid"></result>
	<result property="money" column="money"></result>
	
	<!--一對一的關係對映:設定user的內容-->
	<!--property:該實體類中的哪個對應關係的主表屬性-->
	<!--column:通過哪一個 欄位進行獲取的-->
	<!--javaType:最後的結果封裝到哪個類  正常寫法是com.xxx.xx 用了TypeAlia..所以直接類名-->
	<association property="user" column="uid" javaType="User">
		<!--在裡面寫User的屬性和資料庫對應起來-->
		<id property="id" column="id"></id>
		<result property="name" column="name"></result>
		<result property="password" column="password"></result>
	</association>
</resultMap>

  1. sql語句原封不動的寫就行 (這裡寫上 resultMap起的id名)
<select id="findAll" resultMap="accountUserMap">
	select
		a.*,u.id,u.name,u.password
	from
		account a
	join
		user u
	on
		a.uid = u.id
</select>

這樣就能查詢出來了


下一篇更新: 多表查詢 一對多查詢