1. 程式人生 > >Mybatis總結(3)-關係對映

Mybatis總結(3)-關係對映

  1. 關係對映的理解:就像我們每個人之間的人際關係一樣,兒子是父親的兒子也是爺爺的孫子,父親是母親的丈夫是爺爺的兒子這樣的人際關係組成一張關係網構成一張對映網,就像我們資料庫中的表一樣互相都有可能是這樣的關係。所以我們需要在做開發的時候將這種關係對映(獲得爺爺的後代)的時候就需要用到我們的關係對映
  2. 關係對映的分類:
  • 一對一:身份證號和個人
  • 一對多:一個教室對應多張桌椅
  • 多對多:水果店的水果種類和水果供貨商
  1. 一對一關係對映的實現
  • 巢狀查詢:通過關聯另一張表的sql語句來進行查詢,下面例項是身份證號和使用者的對應關係
<select id="findPersonById" parameterType="Integer" resultMap="IdCardWithPersonResult">
				select * from tb_person where id=#{id}
		</select>
		<resultMap type="Person" id="IdCardWithPersonResult">
				<id property="id" column="id" />
				<result property="name" column="name"/>
				<result property="age" column="age" />
				<result property="sex" column="sex"/>
				<!-- 一對一:association使用select屬性引入另外一條SQL語句 -->
				<association property="card" column="card_id" javaType="IdCard"
						select="com.mybatis.mapper.IdCardMapper.findCodeById" />			
		</resultMap>
  • 使用巢狀結果對映來處理重複的聯合結果:就是一次性查出結果然後分類裝載
<select id="findPersonById2" parameterType="Integer" resultMap="IdCardWithPersonResult2">
						select p.*,idcard.code 
						from tb_person p,tb_idcard idcard
						where p.card_id=idcard.id
						and p.id=#{id}
		</select>
		<resultMap type="Person" id="IdCardWithPersonResult2">
					<id property="id" column="id"/>
					<result property="name" column="name"/>
					<result property="age" column="age"/>
					<result property="sex" column="sex"/>
					<association property="card" javaType="IdCard">
							<id property="id" column="card_id" />
							<result property="code" column="code" />
					</association>
		</resultMap>
  1. 一對多對映關係實現
  • 將需要查詢的“多”的對映關係作為一個集合來定義到“一”的類中
  • 一對多的查詢例項(mapper.xml):一個使用者多個訂單
<mapper namespace="com.mybatis.mapper.UserMapper">
		<select id="findUserWithOrders" parameterType="Integer" resultMap="UserWithOrders">
						select u.*,o.id as orders_id,o.number 
						from tb_user u,tb_orders o
						where u.id=o.user_id
						and u.id=#{id}
		</select>
		<resultMap type="User" id="UserWithOrders">
					<id property="id" column="id"/>
					<result property="username" column="username"/>
					<result property="address" column="address"/>
					<collection property="ordersList" ofType="Orders" >
						<id property="id" column="orders_id" />
						<result property="number" column="number"/> 
					</collection>
  1. 多對多的關係對映
  • 將多的類注入到對應的多的類中:商品持久化類中定義一個訂單集合物件,訂單類中定義一個商品集合物件
  1. 小結 :
  • 一對多與多對多的對映關係mapper檔案的巢狀查詢都需要查詢出所有的結果,即需要複雜的SQL語句。
  • <resultMap >元素是查詢各種返回結果型別不固定的元素其子元素有***< association >< collecaion >***. - -
  • association 元素與collecaion 元素大部分相同,但是collecation中含有一個ofType型別是負責指定實體物件的集合類的屬性。