Mybatis的关联映射
关联映射:将数据库中的有关联关系的表,以实体对象引用的方式体现出来
关联单个对象
关联多个对象
Class user{
Private List<Book> books
}
Class Book{
Private User user
}
什么时候使用
业务需要对数据库进行关联查询的时候
可以通过一条SQL语句完成关联映射,也可以通过两条SQL语句进行关联查询
案例:
通过userID查询用户信息和关联的笔记本信息
<!-- 关联多个信息 -->
1:User实体类添加笔记本对象并实现get/set 方法
2:定义Dao,配置Mapper文件
<!--使用两条SQL语句加载数据 -->
<mapper namespace="cn.tedu.cloudnote.dao.RelationDao">
<select id="findUserAndBooks"
parameterType="string"
resultMap="userMap1">
select *from cn_user
where cn_user_id=#{id}
</select>
<resultMap type="cn.tedu.cloudnote.entity.User" id="userMap1">
<id property="id" column="cn_user_id"/>
<result property="name" column="cn_user_name"/>
<!-- 指定books属性是一个List集合 ,泛型为Book-->
<!-- javaType返回类型 -->
<collection property="books"
javaType="java.util.List"
ofType="cn.tedu.cloudnote.entity.Book"
select="findBooks"
column="cn_user_id">
</collection>
</resultMap>
<!-- 查询book -->
<select id="findBooks"
parameterType="string"
resultType="cn.tedu.cloudnote.entity.Book">
select *from cn_notebook
where cn_user_id=#{userId}
</select>
</mapper>
<!-- 一条SQL加载User -->
<select id="findUserAndBooks1"
parameterType="string"
resultMap="userMap2">
select *from cn_user u join cn_notebook b
on(u.cn_user_id=b.cn_user_id)
where u.cn_user_id=#{userId}
</select>
<resultMap
type="cn.tedu.cloudnote.entity.User"
id="userMap2">
<!-- 定义cn_user字段的加载,不能省略 -->
<id property="id" column="cn_user_id"/>
<result property="name" column="cn_user_name"/>
<result property="password" column="cn_user_password"/>
<result property="token" column="cn_user_token"/>
<result property="nick" column="cn_user_nick"/>
<collection
property="books"
javaType="java.util.List"
ofType="cn.tedu.cloudnote.entity.Book">
<id property="id" column="cn_notebook_id"/>
<result property="userId" column="cn_user_id"/>
<result property="typeId" column="cn_notebook_type_id"/>
<result property="name" column="cn_notebook_name"/>
<result property="desc" column="cn_notebook_desc"/>
<result property="createTime" column="cn_notebook_createtime"/>
</collection>
</resultMap>
</mapper>
一个SQL语句:语句简单,但配置繁琐,与数据库两次交互
两个SQL语句:语句复杂,但配置简单,与数据库一次交互
****注意字数据库字段名的书写(不会报错,但是为null)
3:通过测试类验证查询结果
案例
通过查询笔记信息,关联用户信息
<!-- 关联单个信息 -->
在Book实体类中添加User对象并实现get/set方法
<!-- 关联单个信息 -->
<!-- 一个SQL语句查询Book -->
<select id="findBookAndUser" resultMap="bookMap1">
select *
from cn_notebook
b
join cn_user u
on(b.cn_user_id=u.cn_user_id)
</select>
<resultMap id="bookMap1" type="cn.tedu.cloudnote.entity.Book">
<!-- 定义cn_notebook映射关系 -->
<id property="id" column="cn_notebook_id" />
<result property="userId" column="cn_user_id" />
<result property="typeId" column="cn_notebook_type_id" />
<result property="name" column="cn_notebook_name" />
<result property="desc" column="cn_notebook_desc" />
<result property="createTime" column="cn_notebook_createtime" />
<!-- 定义cn_user映射关系 -->
<association property="user" javaType="cn.tedu.cloudnote.entity.User">
<id property="id" column="cn_user_id" />
<result property="name" column="cn_user_name" />
<result property="password" column="cn_user_password" />
<result property="token" column="cn_user_token" />
<result property="nick" column="cn_user_nick" />
</association>
</resultMap>
<!-- 两个SQL语句实现单个对象关联 -->
<select id="findBookAndUser1" resultMap="bookMap2">
select
cn_notebook_id as id,
cn_user_id as userId,
cn_notebook_name as name,
cn_notebook_type_id as typeId,
cn_notebook_desc as "desc",
cn_notebook_createtime as createTime
from
cn_notebook
</select>
<resultMap id="bookMap2" type="cn.tedu.cloudnote.entity.Book">
<!-- Book属性映射定义,可省略 -->
<association property="user" javaType="cn.tedu.cloudnote.entity.User"
select="findUser" column="userId">
</association>
</resultMap>
<select id="findUser" parameterType="String"
resultType="cn.tedu.cloudnote.entity.User">
select
cn_user_id as id,
cn_user_name as name,
cn_user_password as password,
cn_user_token as token,
cn_user_nick as nick
from cn_user
where cn_user_id=#{userId}
</select>
</mapper>