mybatis一对一关联关系映射

 一对一关系:在操作上,任意一方引入对方的主键作为外键。

 例如 person 和 IDcard,一个人只有一个身份证号,而一个身份证号只对应一个人。

Person 表

 IDcard 表

 

 //Person 持久化类

public class Person {
    private Integer id; 
    private String name; 
    private Integer age; 
    private String sex; 

    private IdCard card; //一对一关系映射
    
   //setter/getter方法
}

 //身份证持久化类

public class IdCard {
    private Integer id; 
    private String code;
}

PersonMapper接口

public interface PersonMapper {
    Person selectPersonById(int id);
}

PersonMapper.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 namespace="cn.jason.bootmybatis.mapper.PersonMapper">

    <resultMap id="BaseResultMap" type="cn.jason.bootmybatis.model.Person">
        <id column="id" property="id" jdbcType="INTEGER"/>
        <result column="name" property="name" jdbcType="VARCHAR"/>
        <result column="age" property="age" jdbcType="INTEGER"/>
        <result column="sex" property="sex" jdbcType="VARCHAR"/>

        <!--这是嵌套查询,这样不方便,开发效率比较低,需要写两处sql和mapper接口和mapper文件,比较多余,
        现在我想只写一处sql就把需求搞定,也就是写多表查询。把多表查询语句写在一个mapper文件中就可以了。-->
        <!--   <association property="card" column="card_id" javaType="IdCard"
                        select="cn.jason.bootmybatis.mapper.IdCardMapper.selectById">
           </association>-->
           
        <!--嵌套结果查询 一对一关系映射-->
        <association property="card" javaType="IdCard">
            <!--这里面的属性都是关联的那个实体的属性,都是可以在前台获取到的-->
            <id property="id" column="card_id"/><!-- id 为主键列,也就是在 tb_idcard 表中的 id 对应 tb_person 表中的 card_id -->
            <result property="code" column="code"/><!-- result表示需要查询出来的结果字段, column="code" 为tb_idcard中的字段-->
        </association>

    </resultMap> 

    <select id="selectPersonById" parameterType="Integer" resultMap="BaseResultMap">
            select p.*,idcard.code
            from tb_person p ,tb_idcard idcard
            where p.card_id=idcard.id and p.id=#{id}
    </select> 

</mapper>

 Person业务层接口

//service业务层接口
public interface FindPersonWithIdCard {
    Person findByIdWithIdcard(int id);
}

业务层实现类

@Service
public class FindPersonWithIdCardImpl implements FindPersonWithIdCard {
    @Autowired
    private PersonMapper personMapper;
 
    @Override
    public Person findByIdWithIdcard(int id) {
        return personMapper.selectPersonById(id);
    }
}

控制器类

@Controller
public class OneToOne {
    @Autowired
    private FindPersonWithIdCard findPersonWithIdCard;
 
    @RequestMapping("/findpersonid/{id}")//restful架构风格
    public String find(@PathVariable int id, Model model) {
        model.addAttribute("personinfo", findPersonWithIdCard.findByIdWithIdcard(id));
        return "personinfo";
    }
 
}

页面

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org"
      xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>person信息页面</title>
</head>
<body>
<table>
    <thead>
    <tr>
        <th>personID</th>
        <th>姓名</th>
        <th>年龄</th>
        <th>身份证号</th>
        <th>idcardID</th>
    </tr>
    </thead>
    <tr>
        <td th:text="${personinfo.id}">personid</td>
        <td th:text="${personinfo.name}">姓名</td>
        <td th:text="${personinfo.age}">年龄</td>
        <td th:text="${personinfo.card.code}">身份证号</td>
        <td th:text="${personinfo.card.id}">idcardID</td>
    </tr>
</table>
</body>
</html>

REF

https://www.cnblogs.com/jasonboren/p/11394758.html

https://blog.csdn.net/abc997995674/article/details/80873053

原文地址:https://www.cnblogs.com/emanlee/p/15721636.html