詳解多對多,mybatis多對多查詢(xml方式和注解方式)
鏈接:https://blog.csdn.net/qq_42524262/article/details/98383977
鏈接:https://blog.csdn.net/Mr_wangr/article/details/97920802
類里面attribute和property區別
attribute為數據成員
property是get/set方法后面那個詞,比如getMyName(),就是MyName。
typeAliases元素:
1,這個標簽里面的typeAlias標簽可以定義別名,會在映射文件中使用。如果沒有定義別名,那必須使用【全限定名】。
2,其【子標簽package】可以為包下所有類定義別名。
別名默認就是類名。
【自動生成主鍵】:
a.對於主鍵值可以自動增長的數據庫,例如mysql 可以如下:
<insert id="insertStudent" parameterType="Student" useGeneratedKeys="true" keyProperty="studId">表示主鍵為studId,且自動增長
b.對於主鍵值不能夠自動增長的數據庫,例如oracle,使用【序列】(SEQUENCE)來生成主鍵值。
create sequence my_seq;
<insert id="insertStudent" parameterType="Student">
<selectKey keyProperty="studId" resultType="int" order="BEFORE">
SELECT my_seq.nextval FROM DUAL
</selectKey>
INSERT INTO STUDENTS(STUD_ID,NAME,EMAIL, PHONE)
VALUES(#{studId},#{name},#{email},#{phone})
</insert>
使用了<selectKey>子元素來生成主鍵值,並將值保存到Student對象的studId 屬性上。
order屬性:MySQLorder需要設置為after,Oracle需要設置為before
ResultMap屬性:結果集映射,用來將SELECT語句的結果集映射到java對象的屬性中。ResultMaps特性非常強大,你可以使用它將簡單的SELECT語句映射到復雜的一對一、一對多關系的SELECT語句上。
拓展 ResultMap:
<resultMap type="Student" id="StudentResult">
<.......>
<resultMap type="Student" id="StudentWithAddressResult" extends="StudentResult">
<........>
其中id為StudentWithAddressResult的resultMap拓展了id為StudentResult的resultMap
使用【嵌套結果ResultMap】一對一
Association屬性:
<resultMap type="Address" id="AddressResult">
<....>
</resultMap>
<resultMap type="Student" id="StudentWithAddressResult">
<....>
<!-- 【關聯】的意思 【嵌套結果映射】-->
<association property="address" resultMap="AddressResult" />
</resultMap>
元素<association>被用來導入“有一個”(has-one)類型的關聯。在上述的例子中,我們使用了<association>元素引用了另外的在同一個XML文件中定義的<resultMap>。
Collection屬性:將多行結果映射成一個對象的一個集合
private List<Course> courses;
<!-- collection表一對多關系,遇到courses集合成員 -->
<collection property="courses" resultMap="CourseResult" />
使用【嵌套查詢select】一對一
嵌套查詢本質:
一個select語句 轉化成 多條select語句去實現功能。
【先根據addr_id去查找 地址對象】
<resultMap type="Address" id="AddressResult"></....>
<select id="findAddressById" parameterType="int" resultMap="AddressResult">
select * from addresses where addr_id=#{id}
</select>
<resultMap type="Student" id="StudentWithAddress">
<........>
<association property="address" column="addr_id" select="findAddressById" />
</resultMap>
在此方式中,<association>元素的select屬性被設置成了id為findAddressById的語句。這里,兩個分開的SQL語句將會在數據庫中分別執行,第一個調用findStudentById加載student信息,而第二個調用findAddressById來加載address信息。
addr_id列的值將會被作為輸入參數傳遞給findAddressById語句。
總結:
嵌套結果查詢 本質上是一條sql語句查詢多張表;
嵌套查詢 本質上是每條sql語句查詢一張表,組合在一起查詢多張表。
效率上,嵌套結果更快。
結論:
如果是 嵌套結果,通過 association標簽中的 resultMap屬性 實現;
如果是 嵌套查詢,通過 association標簽中的 select屬性 實現
嵌套結果映射和嵌套查詢 一對多 和 一對一 類似,只是運用collection屬性而已
多對多的關系可以參照一對多,只是中間多了一個橋表。
不論是一對一還是一對多還是多對多,都不能在mybatis中進行級聯保存、更新、刪除,我們需要使用sql語句控制每一步操作(可以級聯查詢)