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
中的某1個屬性。resultMap
- 通常,每個接口檔案都有1個對應的XML檔案,在配置SQL語句的XML中,必須在根節點
- 【了解】
和#{}
格式的占位符的差別;${}
- 【掌握】解決查詢時,查詢結果中的列名與封裝結果的類的屬性名不一緻的問題:
- 在SQL語句中指定列的别名,使得查詢結果中的列名能與類的屬性名比對;
- 配置
節點,以指定MyBatis架構完成封裝過程。<resultMap>
- 【掌握】動态SQL的
節點的使用;<foreach>
- 【了解】動态SQL的
<if>
系列節點的使用;<choose>
- 【了解】實體類與VO類的定位與差別;
-
- 在設計SQL語句中,不使用星号(
)表示字段清單,且存在名稱不比對的問題時,例如實作1對1的關聯查詢時;*
- 在關聯查詢時,查詢結果中出現了名稱完全相同的列名時,必須通過自定義别名,使得查詢結果中的每個列名都不同。
- 在設計SQL語句中,不使用星号(
-
- 在SQL語句中使用了星号(
)表示字段清單,且存在名稱不比對的問題時,配置*
便于應用到多個不同的查詢中;<resultMap>
- 需要實作1對多的關聯查詢時。
- 在SQL語句中使用了星号(