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个属性。
- 通常,每个接口文件都有1个对应的XML文件,在配置SQL语句的XML中,必须在根节点
-
【理解】
#{}
和${}
格式的占位符的区别; -
【掌握】解决查询时,查询结果中的列名与封装结果的类的属性名不一致的问题:
- 在SQL语句中指定列的别名,使得查询结果中的列名能与类的属性名匹配;
- 配置
<resultMap>
节点,以指定MyBatis框架完成封装过程。
-
【掌握】动态SQL的
<foreach>
节点的使用; -
【了解】动态SQL的
<if>
和<choose>
系列节点的使用; -
【理解】实体类与VO类的定位与区别;
-
【掌握】
<resultMap>
的配置与使用; -
【理解】在处理查询时,什么时候需要自定义别名:
- 在设计SQL语句中,不使用星号(
*
)表示字段列表,且存在名称不匹配的问题时,例如实现1对1的关联查询时; - 在关联查询时,查询结果中出现了名称完全相同的列名时,必须通过自定义别名,使得查询结果中的每个列名都不同。
- 在设计SQL语句中,不使用星号(
-
【理解】在处理查询时,什么时候需要配置
<resultMap>
:- 在SQL语句中使用了星号(
*
)表示字段列表,且存在名称不匹配的问题时,配置<resultMap>
便于应用到多个不同的查询中; - 需要实现1对多的关联查询时。
- 在SQL语句中使用了星号(