Mybatis的关联映射(一)——一对一关联映射

1. 数据库表结构

  1. 在我们的生活中有许多的关联关系,我们大致可以分为三类,一对一,一对多,多对多三种,在这里我们借助Mybatis较为详细的介绍一下,一对一的关联实现
  2. 我们这里就以身份证和人的一对一关系为例,使用mybatis来处理这个关联关系
  3. 首先是idcard的数据库的设计,这里我的id设置了自增
    idcard数据表设计4. 再就是myperson数据表的设计,我的id设置了自增
    在这里插入图片描述
    其中cid为外键关联的是idcard里面的id

2. 实体类结构

  1. 对于实体类的设计,我们正常生活中身份证应该是人的一个属性,所以我们的MyPerson类中应该把IdCard类作为一个私有属性,所以如下设计:
public class MyPerson {
    private Integer id;
    private String name;
    private Integer age;
    private String sex;
    private IdCard idcard;//注意这里是实体类和数据库表有所不同的地方
    
//set和get方法这里省略
    @Override
    public String toString() {
        return "MyPerson{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                ", idcard.id=" + idcard.getId() +
                '}';
    }
}
  1. 对于IdCard类的设计没有什么特别的,就是和数据库属性完全对应
public class IdCard {
    private Integer id;
    private String cno;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getCno() {
        return cno;
    }

    public void setCno(String cno) {
        this.cno = cno;
    }
}

3. Mapper.xml

  1. mybatis里面的Mapper.xml,就是为了描述我们的sql语句和结果如何映射到实体类的,这里为了设计方便,只展示查询方面的SQL语句,对于IdCard的,我们这里就做如下的设计:
<?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 namespace="xzw.dao.IdCardMapper">
<!--    这个需要对应我们的对应的接口Mapper类-->
    
    
    <select id="findIdCardById" parameterType="int" resultType="xzw.bean.IdCard">
        select * from idcard where id = #{id}
    </select>
<!--    这里的id是SQL语句唯一的标识符,和对应的方法名需要保持相同,这样mybatis就能自动帮我们对应-->
</mapper>

在这里我也放上我的接口代码:

public interface IdCardMapper {
    IdCard findIdCardById(int id);//注意和我们的id是对应的
}

这是注解版:

public interface IdCardMapper {
    @Select("select * from idcard where id = #{id}")
    IdCard findIdCardById(int id);
}

2.接着就是我们如何设计一些我们MyPersonMapper.xml的语句和怎么将查询出来的结果保存到我们的实体类(因为和数据库表不一样),我们这里采取的策略就是在查询的时候,我们查出来的cid属性,我们接着查询对应的IdCard类,然后将对应的结果放入我们的MyPerson类中

<?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 namespace="xzw.dao.MyPersonMapper">
    <select id="findPersonById" parameterType="int" resultMap="MyPersonMap">
        select * from myperson where id = #{id}
    </select>
    <resultMap id="MyPersonMap" type="xzw.bean.MyPerson">
        <association property="idcard" javaType="xzw.bean.IdCard" column="cid" select="xzw.dao.IdCardMapper.findIdCardById"/>
    </resultMap>
<!--    因为这个查询出来的结果并不能直接对应赋值,所以我们需要使用resultMap标签指定它如何对应-->
<!--    这里mybatis也为我们提供相应的标签实现,这里association标签会将cid属性,赋值到select语句对应的里面,然后赋值在-->
<!--    property标签也就是实体类属性名,这里的原理就是查出来的cid属性,会再进行一次查询,这个查询可以是你之间写好的-->
    <update id="UpdatePerson" parameterType="xzw.bean.MyPerson">
        update myperson set name=#{name},age=#{age},sex=#{sex},cid=#{idcard.id} where id=#{id}
    </update>
    <insert id="addPerson" parameterType="xzw.bean.MyPerson">
        insert into myperson(name,age,sex,cid) values (#{id},#{name},#{age},#{idcard.id})
    </insert>
    <delete id="deletePersonById" parameterType="int">
        delete from myperson where id= #{id}
    </delete>
</mapper>

注解版:

    @Select("select * from myperson where id = #{id} ")
    @Results({
            @Result(column = "cid",property = "idcard",one = @One(select = "xzw.dao.IdCardMapper.findIdCardById"))
    })
    MyPerson findPersonById(int id);

4. 谢谢阅读

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值