【Mybatis学习笔记】4.关系映射

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();
    }

猜你喜欢

转载自blog.csdn.net/weixin_43046082/article/details/88961967