天天看點

MyBatis架構基礎知識(04)

1. 1對多的關聯資料查詢

假設需要實作:根據id查詢某個使用者組的詳情時,顯示該組的所有使用者的資訊!

需要執行的SQL語句大緻是:

select * from t_group left join t_user on t_group.id=t_user.group_id where t_group.id=1;
           

首先,需要在項目中建立新的

GroupVO

類,用于封裝查詢結果:

public class GroupVO {
    private Integer id;
    private String name;
    private List<User> users;
}
           

GroupMapper

接口中添加抽象方法:

GroupVO findVOById(Integer id);
           

在GroupMapper.xml檔案中配置SQL映射:

<resultMap id="GroupMap" type="cn.tedu.spring.GroupVO">
	<id column="gid" property="id" />
    <result column="name" property="name" />
    <!-- collection節點:用于配置1對多的屬性,也就是List集合類型的屬性 -->
    <!-- ofType屬性:List集合中的元素的類型 -->
    <!-- 在collection節點的子級的各id、result節點中的property指的是ofType的類中的屬性名 -->
    <collection property="users" ofType="cn.tedu.spring.User">
        <id column="id" property="id"/>
        <result column="username" property="username"/>
        <result column="password" property="password"/>
        <result column="age" property="age"/>
        <result column="phone" property="phone"/>
        <result column="email" property="email"/>
        <result column="group_id" property="groupId"/>
    </collection>
</resultMap>

<select id="findVOById" resultMap="GroupMap">
	SELECT 
    	t_group.id AS gid, name,
    	t_user.* 
    FROM 
    	t_group 
    LEFT JOIN
    	t_user 
    ON 
    	t_group.id=t_user.group_id 
    WHERE 
    	t_group.id=#{id}
</select>
           

【MyBatis階段小結】

  • 【了解】MyBatis的主要作用:簡化持久層開發;
  • 【掌握】使用MyBatis架構時需要添加的依賴;
  • 【認識】使用MyBatis架構時必要的配置;
  • 【掌握】抽象方法的設計原則:
    • 傳回值:如果是增、删、改類型的操作,使用

      Integer

      作為傳回值類型;如果是查詢類型的操作,可以使用期望的類型作為傳回值類型,隻要能把查詢結果封裝進去就行;
    • 方法名稱:自定義,但是不允許重載;
    • 參數清單:根據需要執行的SQL語句中的參數來設計抽象方法的參數清單,簡單的說,就是SQL語句中有哪些問号,在抽象方法中就設計哪些參數,當參數較多時,還可以使用封裝的類型作為參數,使得抽象方法中的1個參數就可以表示SQL語句中的若幹個參數,當抽象方法的參數超過1個時,必須為每個參數都配置

      @Param

      注解。
  • 【掌握】配置SQL映射:
    • 通常,每個接口檔案都有1個對應的XML檔案,在配置SQL語句的XML中,必須在根節點

      <mapper>

      中配置

      namespace

      屬性指定對應的接口檔案;
    • 需要根據所執行的SQL語句的種類來選取

      <insert>

      <delete>

      <update>

      <select>

      節點,每個節點都必須配置

      id

      屬性指定對應的抽象方法的名稱,

      <select>

      還必須配置

      resultType

      resultMap

      中的某1個屬性。
  • 【了解】

    #{}

    ${}

    格式的占位符的差別;
  • 【掌握】解決查詢時,查詢結果中的列名與封裝結果的類的屬性名不一緻的問題:
    • 在SQL語句中指定列的别名,使得查詢結果中的列名能與類的屬性名比對;
    • 配置

      <resultMap>

      節點,以指定MyBatis架構完成封裝過程。
  • 【掌握】動态SQL的

    <foreach>

    節點的使用;
  • 【了解】動态SQL的

    <if>

    <choose>

    系列節點的使用;
  • 【了解】實體類與VO類的定位與差別;
    • 在設計SQL語句中,不使用星号(

      *

      )表示字段清單,且存在名稱不比對的問題時,例如實作1對1的關聯查詢時;
    • 在關聯查詢時,查詢結果中出現了名稱完全相同的列名時,必須通過自定義别名,使得查詢結果中的每個列名都不同。
    • 在SQL語句中使用了星号(

      *

      )表示字段清單,且存在名稱不比對的問題時,配置

      <resultMap>

      便于應用到多個不同的查詢中;
    • 需要實作1對多的關聯查詢時。