mybatis实现级联查询一对一

文章展示了在MyBatis框架下,如何通过接口和XML配置进行一对一关联查询。包括两种方式实现Person与IdenCard的级联查询,以及从IdenCard反向查询Person。同时,提供了对应的Mapper接口和XML配置文件的详细代码示例。
摘要由CSDN通过智能技术生成

接口形式

package com.hspedu.mapper;

import com.hspedu.entity.Person;

public interface PersonMapper {
    //通过person的id获取到Person,包括这个Person关联的IdenCard对象【级联查询】
    public Person getPersonById(Integer id);


    //通过person的id获取到Person,包括这个Person关联的IdenCard对象【级联查询】 方式2
    public Person getPersonById2(Integer id);


    //需要在PersonMapper新建一个方法来解决idenCard反向查询得到Person对象/数据
    public Person getPersonByCardId(Integer cardId);
}

xml文件形式

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
这是一个mapper xml 文件
2.该文件可以去实现对应接口的方法
3.namespace  指定该xml文件和哪个接口对应
  <mapper namespace="com.hspedu.mapper.MonsterMapper"> 别乱写  重建项目的时候卡在这里



-->


<mapper namespace="com.hspedu.mapper.PersonMapper">

    <!-- 配置实现  getPersonById 通过personid 获取Person 并且实现级联
    resultType="Person"如果简单的配置  就会把IdenCard card =》置空
      使用resultMap 搞定

      因为getPersonById 最终返回的是Person对象【只是有级联属性】
    -->
    <resultMap id="PersonResult" type="Person">

<!--  可优化  标记出作为ID的结果可以提高整体性能    <result property="id" column="id"/>-->
        <id property="id" column="id"/>
        <result property="name" column="name"/>
<!--        association 复杂的关联类型  property="card"表示对Person的card属性-->
        <association property="card" javaType="IdenCard">
            <result property="id" column="id"/>
            <result property="card_sn" column="card_sn"/>

        </association>

    </resultMap>
<!--      必须用resultMap=-->
    <select id="getPersonById" parameterType="Integer" resultMap="PersonResult">
SELECT * FROM `person`,`idencard` WHERE person.id = #{id} AND person.card_id =  idencard.id
    </select>

<!--    第二种一对一-->
    <resultMap id="PersonResultMap2" type="Person">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
<!--        1.第二种方式核心思想就是将多表联查分解成单表操作  简洁 易于维护  而且可以复用已经写好的方法  建议用这种
2.property="card" 表示person对象的card属性
3.column="card_id" 表示 card_id字段
4.返回的 字段 card_id 信息数据 作为getIdenCardById入参
-->

        <association property="card" column="card_id"

                     select="com.hspedu.mapper.IdenCardMapper.getIdenCardById"/>

    </resultMap>
    <select id="getPersonById2" parameterType="Integer" resultMap="PersonResultMap2">
        SELECT * FROM `person` WHERE `id` = #{id}
    </select>



<!--    =========================homework需要配置的方法===================================-->
<!--    //需要在PersonMapper新建一个方法来解决idenCard反向查询得到Person对象/数据-->

    <select id="getPersonByCardId" parameterType="Integer" resultType="Person">
            SELECT * FROM person WHERE `card_id` = #{id}

    </select>



</mapper>

下面是idenCard的接口形式

public interface IdenCardMapper {
   //根据id获取到身份证序列号
    public IdenCard getIdenCardById(Integer id);



    //根据id级联查询到Person【作业】

    public IdenCard getIdenCardById2(Integer id);




}

下面是xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
这是一个mapper xml 文件
2.该文件可以去实现对应接口的方法
3.namespace  指定该xml文件和哪个接口对应
  <mapper namespace="com.hspedu.mapper.MonsterMapper"> 别乱写  重建项目的时候卡在这里



-->


<mapper namespace="com.hspedu.mapper.IdenCardMapper">

    <!-- 配置实现   public IdenCard getIdenCardById(Integer id);     IdenCard可以直接写的原因-->
    <select id="getIdenCardById" parameterType="Integer" resultType="IdenCard">
    SELECT * FROM idencard WHERE `id` = #{id}
    </select>

<!--=-===================================作业======================================-->
    <resultMap id="IdenCardResultMap" type="IdenCard">
        <id property="id" column="id"/>
        <result property="card_sn" column="card_sn"/>
        <!--
           需要column="id"
           需要       SELECT * FROM idencard WHERE id =#{id} 返回的id字段的值作为入参传递给
                我们的一个方法,通过这个方法可以返回该idenCard对应的person

        -->

        <association property="person" column="id"

                     select="com.hspedu.mapper.PersonMapper.getPersonByCardId"/>

    </resultMap>
    
    
    <select id="getIdenCardById2" parameterType="Integer" resultMap="IdenCardResultMap">
       SELECT * FROM idencard WHERE id =#{id}

    </select>

</mapper>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值