MyBatis-resultMap:一对一映射关系

官方文档

映射关系:一对一(映射方向:单向映射)

XXMapper.xml的方式配置映射:(推荐方式)

方法二:

  • 映射方式:把多表联查,分解成多个单表查询,易于维护,复用性强。(推荐写法,所以提到前面来了)

    <resultMap id="identify2" type="Person">
        <!--关键是这儿的column,是DB中的外键(也可以不是),作为参数传给select的方法-->
        <association property="idCard" column="card_id" select="com.stein.mapper.IDCardMapper.queryIDCardById">
            <result property="card_num" column="card_num"/>
        </association>
    </resultMap>

    <select id="queryPersonById2" parameterType="Integer" resultMap="identify2">
        SELECT * FROM `person` where card_id=#{id}
    </select>

这儿有个疑问:单表查询的,主表的property可以不用设置,mybatis自动添加;但是在多表联查里面,就需要手动设置property,否则为null。

方法一:

  • 映射方式:通过多表联查,结合resultMap完成映射。(原始思路,易于理解,初学还是从方法一开始)

  • 原理说明:使用sql的级联查询,获取到所有的返回信息,然后通过mqbatis封装javaBean的子类中去
  • 关注重点:
    • 使用<association>映射到嵌套的子类进行封装。称为 一个复杂类型的关联。
      1. property=“card” 表示 Person对象的 card 属性
      2. javaType=“IdenCard” 表示card 属性 的类型
      3. column=“id” 是从我们的 下面这个语句查询后返回DB的字段
    • 关于<id>的优化。
      1.id – 一个 ID 结果;标记出作为 ID 的结果可以帮助提高整体性能
      2.property=“id” 表示person 属性 id ,通常是主键
      3.column=“id” 表示对应表的字段
    • 使用了association ,就需要把上一级的原本自动设置的属性手动设置上,否则会为空。感觉有点麻烦了,如果后期有方法再来改。
<resultMap id="PersonResultMap" type="Person">//这个id自定义,随便填,给<select>中的resultMap引用;type相当于resultType,最终返回给javaBean的类型
            <!--<result property="id" column="id"/>用下面id这句替代了这句-->
       	    <id property="id" column="id"/>
	       	<result property="name" column="name"/> //property这儿自定义的,与javabean里面一致
        <association javaType="IdenCard" property="card" > //javaType是说明 property的类型的
            <result property="id" column="id"/>
            <result property="card_sn" column="card_sn"/>
        </association>
</resultMap>

<select id="getPersonById" parameterType="Integer"
            resultMap="PersonResultMap">
        SELECT *  FROM `person`,`idencard` WHERE `person`.id = #{id}
        AND `person`.card_id = `idencard`.id
</select>

@注解的方式配置映射

用单表查询的方式(即上面的方法二),使用@注解的形式完成实现。本质上跟XXMapper.xml配置的方式差不多。
@One表示一个返回结果

@Select("SELECT * FROM `person` WHERE `id` = #{id}")
    @Results({
          @Result(id = true, property = "id", column = "id"),
          @Result(property = "name", column = "name"),
          @Result(property = "card", column = "card_id", //同XXMapper.xml一样,column是指要传参的列
                  one = @One(select = "com.hspedu.mapper.IdenCardMapper.getIdenCardById")) //注意这儿select指向的路径,要指向到方法名,而不仅仅是到类
    })
    public Person getPersonById(Integer id);
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值