Mybatis中mapper.xml的使用


詳解多對多,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語句控制每一步操作(可以級聯查詢)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM