1. 程式人生 > >mybatis基於xml配置的多表查詢

mybatis基於xml配置的多表查詢

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>