1.一对一关系映射,从表的封装方式
①
<!--封装方式一 官方推荐使用-->
<resultMap id="userWithDetailMap" type="com.cyk.pojo.UserWithDetail">
<!--user的基本信息-->
<id property="id" column="uid"/>
<result property="phone" column="phone"/>
<result property="password" column="password"/>
<result property="createDate" column="create_date"/>
<result property="status" column="status"/>
<!--持有UserDetail,这个如何封装-->
<association property="userDetail" javaType="com.cyk.pojo.UserDetail">
<id property="id" column="udId"/>
<result property="address" column="address"/>
<result property="cid" column="cid"/>
</association>
</resultMap>
建议用第一种,毕竟是官方推荐
②
<!--封装方式二-->
<resultMap id="userWithDetailMap2" type="com.cyk.pojo.UserWithDetail">
<!--user的基本信息-->
<id property="id" column="uid"/>
<result property="phone" column="phone"/>
<result property="password" column="password"/>
<result property="createDate" column="create_date"/>
<result property="status" column="status"/>
<!--连缀的写法-->
<result property="userDetail.id" column="udId"/>
<result property="userDetail.cid" column="cid"/>
<result property="userDetail.address" column="address"/>
</resultMap>
UserMapper.java(interface)
UserWithDetail queryById(@Param("id") Integer id);
UserMapper.xml
<!--<select id="queryById" resultMap="userWithDetailMap1">-->
<select id="queryById" resultMap="userWithDetailMap2">
SELECT t1.`id` as uid,t1.`create_date`,t1.`password`,t1.`phone`,t1.`status`,
t2.`address`,t2.`cid`,t2.`id` as udId
FROM USER t1, user_detail t2
<where>
t1.`id`=t2.`u_id`
AND t1.`id`=#{id}
</where>
</select>
测试类
@Test
public void m1(){
SqlSession sqlSession = MybatisUtil.getSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
UserWithDetail userWithDetail = mapper.queryById(1);
System.out.println(userWithDetail);
sqlSession.close();
}
③
这种方法适合场景复杂的时候使用,首先extends可以继承一些基础的、经常重复的信息代码,其次association标签保证了是一对一的映射关系,select标签决定将在另一个mapper.java文件中调用queryByUserId接口,column的值的含义是传入queryByUserId的参数
<resultMap id="userBaseMap" type="com.cyk.pojo.UserWithDetail">
<!--user的基本信息-->
<id property="id" column="uid"/>
<result property="phone" column="phone"/>
<result property="password" column="password"/>
<result property="createDate" column="create_date"/>
<result property="status" column="status"/>
</resultMap>
<!--封装方式三 支持分步查询 复杂时使用-->
<resultMap id="userWithDetailMap3" extends="userBaseMap" type="com.cyk.pojo.UserWithDetail">
<association property="userDetail" select="com.cyk.mapper.UserDetailMapper.queryByUserId" column="uid">
</association>
</resultMap>
UserMapper.java (interface)
UserWithDetail queryByIdByStep(@Param("id") Integer id);
UserMapperDetail.java (interface)
UserDetail queryByUserId(@Param("id") Integer id);
UserMapper.xml
<select id="queryByIdByStep" resultMap="userWithDetailMap3">
SELECT t1.`id` as uid,t1.`create_date`,t1.`password`,t1.`phone`,t1.`status`
FROM USER t1
where t1.`id`=#{id}
</select>
UserDetailMapper.xml
<select id="queryByUserId" resultType="com.cyk.pojo.UserDetail">
select * from user_detail
where u_id = #{id}
</select>
测试类
@Test
public void m2(){
SqlSession sqlSession = MybatisUtil.getSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
UserWithDetail userWithDetail = mapper.queryByIdByStep(1);
System.out.println(userWithDetail);
sqlSession.close();
}
2.一对多
UserMapper.xml
<resultMap id="userBaseMap" type="com.cyk.pojo.UserWithDetail">
<!--user的基本信息-->
<id property="id" column="uid"/>
<result property="phone" column="phone"/>
<result property="password" column="password"/>
<result property="createDate" column="create_date"/>
<result property="status" column="status"/>
</resultMap>
<resultMap id="userWithBlog" extends="userBaseMap" type="com.cyk.pojo.UserBlog">
<!--封装博客-->
<collection property="blogs" ofType="com.cyk.pojo.Blog">
<id property="id" column="bid"/>
<result property="title" column="title"/>
<result property="summary" column="summary"/>
<result property="content" column="blogContent"/>
<!--博客里面还有评论-->
<collection property="comments" ofType="com.cyk.pojo.Comment">
<id property="id" column="cid"/>
<result property="content" column="commentContent"/>
</collection>
</collection>
</resultMap>
此时UserBlog.java中包含的是一个blog的结果集
扫描二维码关注公众号,回复:
5761693 查看本文章
package com.cyk.pojo;
import java.util.List;
public class UserBlog extends User {
private List<Blog> blogs;
public List<Blog> getBlogs() {
return blogs;
}
public void setBlogs(List<Blog> blogs) {
this.blogs = blogs;
}
}
测试类
@Test
public void m3(){
SqlSession sqlSession = MybatisUtil.getSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
UserBlog userBlog = mapper.queryByIdWithBlog(1);
System.out.println(userBlog.getPhone()+userBlog.getBlogs());
sqlSession.close();
}