mybatis一对一关联关系映射

mybatis一对一关联关系映射

在关联关系中,有一对一,一对多,多对多三种关联关系。

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

一对多关系:在“多”的一方添加“一”的一方的主键作为外键。

多对多关系:产生中间表引入两张表的主键作为外键,将两个主键作为联合主键或者引入新的字段作为这个中间表的主键。

一对一关联关系

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

以上是person表和IDcard表。

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"/><!--表示需要查询出来的结果字段,为tb_idcard中的字段-->
        </association>
    </resultMap>

    <sql id="Base_Column_List">
    id, name, age, sex, card_id
    </sql>

    <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>

一对一运行结果截图

一对一关系总结:

一对一关系是比较简单的,通过在实体类中声明另一个实体类的对象属性,这样就可以把他们关联起来,在写mapper文件时,关联关系都应该采用嵌套结果查询的方式进行关联查询,因为这样比较方便而且快速,不用去建另一个的实体类的mapper接口和mapper映射文件。一对一关系映射使用<association>元素。

原文地址:https://www.cnblogs.com/jasonboren/p/11394758.html

时间: 2024-10-27 11:40:27

mybatis一对一关联关系映射的相关文章

MyBatis的一对一关联关系映射

原文链接:http://www.yiidian.com/mybatis/one-to-one.html 1 什么是一对一.一对多映射? 以用户和订单举例, 一对一 : 一个订单只属于一个用户 ==> 订单对用户是一对一关系 一对多 : 一个用户可以拥有多个订单 ==> 用户对订单是一对多关系 注意:在MyBatis中,如果要完成多对多关系,其实就是两个一对多映射! 接下来先讲解MyBatis的一对一映射如何实现. 2 建立表结构 2.1 创建用户表 CREATE TABLE `t_user`

mybatis 一对一关联映射实例

在实际项目开发中,经常存在一对一的关系,如一个人对应一张身份证信息,这就是一对一的关系.下面是一个简单的实例: 1.建表过程我就省略了,主要是一张Person表,一张IDCard表,其相关属性见步骤2Pojo类属性所示: 2.建立一个Person对象和一个IDCard对象: mybatis/pri/xiaoyang/otot/pojo/IDCard.java 1 public class IDCard implements Serializable { 2 private int id; //

Hibernate(5)—— 联合主键 、一对一关联关系映射(xml和注解) 和 领域驱动设计

俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: One to One 映射关系 一对一单向外键(XML/Annotation) 一对一双向外键关联(XML/Annotation) 联合主键 一对一单向外键联合主键(Xml/Annotation) 一对一组件关联(XML/Annotation) 理解组件 领域驱动设计——自动生成数据库脚本 一对一关系的小结 一些出错问题的总结 自动生成数据库脚本 一般在项目开发过程中,我们的习惯是先建好数据库和表,然后在进

mybatis 一对一的映射(两种方式)

对于一对一的关系映射一共有两种解决方案: 开发步骤:1)写OrdersMapperUser.xml文件 2)编写与xml同名的接口OrdersMapperUser 3)测试 声明:一下xml文件的代码都在<mapper  namespace="cn.itcast.mapper.OrdersMapperUser"></mapper>中 方式一:使用包装类完成映射关系(比较容易理解) 需求:一个订单只对应一个用户 1)编写包装了类OrdersUser继承Orders

Hibernate关联关系映射之一对一关联关系

人和身份证之间就是一个典型的一对一关联关系.实现一对一关联关系映射的方式有两种一种是基于外键,一种是基于主键,下面我们先看基于外键的关联方式 首先看他们的实体类 Person类 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 package entity; public class Person {     private Integer id;     private String name;     pr

【二】MyBatis的SQL映射文件 ----- 一对一的关联查询

现在假设数据库中有两张表,一张是班级表,另一张是教师表.一个班级只有一名班主任老师,而一个老师只能担任一个班的班主任,这就是我们所说的一对一关联关系.现在要求,查询班级表的同时也要查询出老师的信息.两张表的数据如下所示: 教师表: 班级表: 创建表的SQL语句如下(MySQL数据库): CREATE TABLE teacher( t_id INT PRIMARY KEY AUTO_INCREMENT, t_name VARCHAR(20) ); CREATE TABLE class( c_id

mybatis一对一映射配置详解

听说mybatis一对一有三种写法,今天我试了一下. 数据库表准备 为了偷懒,我直接就拿用户权限菜单里的菜单表和菜单与权限的中间表做实现,他们原来是多对多的关系,这边我假设这两张表是一对一. 表  gl_role_men:id,role_id,menu_id     --------->  实体类 GlrolemenuModel  private String id;private String roleId;private String menuId;private MenuModel men

Hibernate映射一对一关联关系

映射一对一关联 Hibernate提供了两种映射一对一关联关系的方式,分别是按照外键映射和按照主键映射. 下面是员工表和档案信息表(员工和档案表之间的关系是一对一的关系)  档案表(dept) 1 public class Dept { 2 private Integer deptid; 3 private String mystreet; 4 private Emp emp; 5 6 public Dept() { 7 } 8 9 public Dept(Integer deptid, Str

Hibernate之关联关系映射(一对一主键映射和一对一外键映射)

1:Hibernate的关联关系映射的一对一外键映射: 1.1:第一首先引包,省略 1.2:第二创建实体类: 这里使用用户信息和身份证信息的关系,用户的主键编号既可以做身份证信息的主键又可以做身份证信息的外键,这里先做外键. 创建User.java: 用户和身份证一对一的关联关系映射       private IdCart idCart; IdCart.java: 身份证和用户,一对一的关系       private User user; 1 package com.bie.bean; 2