一對一
前提條件
什么時候會用到一對一?
- 假設有兩張表,一張用戶表,一張賬號表,用戶只能有一個賬戶,而用戶資訊和賬戶資訊都放到一張表里就很顯得資料很冗余,所以就分出來兩張表,
- 假設一款游戲,要做登錄驗證,用戶名和密碼就可以單獨出來一個表,因為登錄的時候只查詢的是用戶名和密碼,所以單獨一個表出來是最佳方案,這樣查詢速度快, 同時用戶密碼表也要關聯上用戶資訊表,
一對一設計的兩種方案
- 主鍵共享 (pk+fk)
- 外鍵唯一 (fk+unique)
一對一查詢
一對一查詢有兩種方式
1. 創建子類 (不常用)
2. 從表中有物體參考(常用)
準備環境
現在有兩種表,一張用戶名(從表),一張賬戶表(主表)
- 從表物體類中應該含一個主表物體的包物件參考
public class Account {
private Integer id;
private Integer uid;
private Double money;
//從表物體類中應該有一個主表的物件
private User user;
//提供getset方法 該重寫的方法重寫了
}
- 準備的SQL陳述句
select
a.*,u.id,u.name,u.password
from
account a
join
user u
on
a.uid = u.id
- 因為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>
- 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>
這樣就能查詢出來了
下一篇更新: 多表查詢 一對多查詢
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/99451.html
標籤:AI
上一篇:求助!!
