mybatis基於xml配置的多表查詢
阿新 • • 發佈:2018-12-04
mybatis多表查詢
表之間的關係有幾種:
一對多
多對一
一對一
多對多
舉例:
使用者和訂單就是一對多
訂單和使用者就是多對一
一個使用者可以下多個訂單
多個訂單屬於同一個使用者
人和身份證號就是一對一
一個人只能有一個身份證號
一個身份證號只能屬於一個人
老師和學生之間就是多對多
一個學生可以被多個老師教過
一個老師可以交多個學生
特例:
如果拿出每一個訂單,他都只能屬於一個使用者。
所以Mybatis就把多對一看成了一對一。
mybatis中的多表查詢:
示例:使用者和賬戶 一個使用者可以有多個賬戶 一個賬戶只能屬於一個使用者(多個賬戶也可以屬於同一個使用者) 步驟: 1、建立兩張表:使用者表,賬戶表 讓使用者表和賬戶表之間具備一對多的關係:需要使用外來鍵在賬戶表中新增 2、建立兩個實體類:使用者實體類和賬戶實體類 讓使用者和賬戶的實體類能體現出來一對多的關係 3、建立兩個配置檔案 使用者的配置檔案 賬戶的配置檔案 4、實現配置: 當我們查詢使用者時,可以同時得到使用者下所包含的賬戶資訊 當我們查詢賬戶時,可以同時得到賬戶的所屬使用者資訊
- 表關係建立()
從表為一: (一對一,多對一)
在"主表"中建立一個"從表"實體的物件引用
//簡單理解,如果當前"主表"類的一個物件,只能對應一個"從表"類的物件,則就是"對一"關係.就建立一個物件引用
從表為多: (一對多,多對多)
在"主表"中建立一個"從表"實體的集合引用
//簡單理解,如果當前"主表"類的一個物件,能對應多個"從表"類的物件,則就是"對多"關係.就建立集合引用
- 多表聯合查詢-從表為一
1.示例: /** * 以"User使用者"和"Account賬戶"作為案例, * 從"Account"角度分析,一個賬戶,只能屬於一個使用者. * 所以"Account"對"User"是"對一關係". */ 2.在"主表"中建立一個"從表"實體的物件引用 public class Account implements Serializable { //定義"主表Account"的屬性 private Integer id; private Integer uid; private Double money; // 定義"從表User"的物件引用 private User user; set....get... } 3.修改"主表"查詢相關的sql語句,改為聯合查詢,並重新定義返回值型別resultMap <select id="findAll" resultMap="accountUserMap"> select u.*,a.id as aid,a.uid,a.money from account a , user u where u.id = a.uid; </select> 4.修改"主表"查詢結果型別 //配置"主表"的對映資訊 <resultMap id="accountUserMap" type="account"> <id property="id" column="aid"></id> <result property="uid" column="uid"></result> <result property="money" column="money"></result> //配置"從表",也就是"對一"的那一方的對映 <association property="user" column="uid" javaType="user"> <id property="id" column="id"></id> <result column="username" property="username"></result> <result column="address" property="address"></result> </association> </resultMap>
- 多表聯合查詢-從表為多
1.說明 /** * 以"User使用者"和"Account賬戶"作為案例, * 從"User"角度分析,一個人,可以有多個賬戶 * 所以"User"對"Account"是"對多關係". */ 2.在"主表"中建立一個"從表"實體的物件引用 public class User implements Serializable { //定義"主表User"的屬性 private Integer id; private String username; private String address; private String sex; private Date birthday; //對多關係對映:定義"從表Account"的集合對映 private List<Account> accounts; set....get... } 3.修改"主表"查詢相關的sql語句,改為聯合查詢,並重新定義返回值型別resultMap <select id="findAll" resultMap="userAccountMap"> select u.*,a.id as aid,a.uid,a.money from user u left outer join account a on u.id = a.uid </select> 4.修改"主表"查詢結果型別 //配置"主表"的對映資訊 <resultMap id="userAccountMap" type="user"> <id property="id" column="id"></id> <result property="username" column="username"></result> <result property="address" column="address"></result> <result property="sex" column="sex"></result> <result property="birthday" column="birthday"></result> //配置"從表",也就是"對多"的那一方的對映 <collection property="accounts" ofType="account"> <id column="aid" property="id"></id> <result column="uid" property="uid"></result> <result column="money" property="money"></result> </collection> </resultMap>