我的编程空间,编程开发者的网络收藏夹
学习永远不晚

【MyBatis框架】关联映射

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

【MyBatis框架】关联映射

关系映射

1. 关联映射概述

在关系型数据库中,多表之间存在着三种关联关系,分别为一对一,一对多和多对多,如图

在这里插入图片描述

  • 一对一的关系:就是在本类中定义对方类型的对象,如A类中定义B类类型的属性b,B类中定义A类类型的属性a。
  • 一对多的关系:就是一个A类类型对应多个B类类型的情况,需要在A类中以集合的方式引入B类类型的对象,在B类中定义A类类型的属性a。
  • 多对多的关系:在A类中定义B类类型的集合,在B类中定义A类类型的集合。

2. 环境搭建

创建t_emp表

在这里插入图片描述

t_dept表

在这里插入图片描述

实体类Dept

package com.atguigu.mybatis.pojo;import java.util.List;public class Dept {    private Integer deptId;    private String deptName;    private List<Emp> emps;    public Dept() {    }    public Dept(Integer deptId, String deptName) {        this.deptId = deptId;        this.deptName = deptName;    }    public Integer getDeptId() {        return deptId;    }    public void setDeptId(Integer deptId) {        this.deptId = deptId;    }    public String getDeptName() {        return deptName;    }    public void setDeptName(String deptName) {        this.deptName = deptName;    }    public List<Emp> getEmps() {        return emps;    }    public void setEmps(List<Emp> emps) {        this.emps = emps;    }    @Override    public String toString() {        return "Dept{" +                "deptId=" + deptId +                ", deptName='" + deptName + '\'' +                ", emps=" + emps +                '}';    }}

实体类Emp

package com.atguigu.mybatis.pojo;public class Emp {    private Integer empId;    private String empName;    private Integer age;    private String gender;    private Dept dept;    public Emp() {    }    public Emp(Integer empId, String empName, Integer age, String gender) {        this.empId = empId;        this.empName = empName;        this.age = age;        this.gender = gender;    }    public Integer getEmpId() {        return empId;    }    public void setEmpId(Integer empId) {        this.empId = empId;    }    public String getEmpName() {        return empName;    }    public void setEmpName(String empName) {        this.empName = empName;    }    public Integer getAge() {        return age;    }    public void setAge(Integer age) {        this.age = age;    }    public String getGender() {        return gender;    }    public void setGender(String gender) {        this.gender = gender;    }    @Override    public String toString() {        return "Emp{" +                "empId=" + empId +                ", empName='" + empName + '\'' +                ", age=" + age +                ", gender='" + gender + '\'' +                ", dept=" + dept +                '}';    }    public Dept getDept() {        return dept;    }    public void setDept(Dept dept) {        this.dept = dept;    }}

3.处理字段名和属性名不一致的情况

SQL语句

在这里插入图片描述

接口:

public interface EmpMapper {    Emp getEmpById(@Param("empId") Integer empId);}

测试方法:

   public void test(){        SqlSessionUtils sqlSessionUtils = new SqlSessionUtils();        SqlSession sqlSession = sqlSessionUtils.getSqlSession();        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);        Emp empById = mapper.getEmpById(1);        System.out.println(empById.toString());     }

执行测试方法后会得到如下结果:

在这里插入图片描述

可以看到,我们的SQl语句并没有问题,但为什么查询出的结果会有NUll出现呢,这就是因为我们的数据库中的字段名于Emp实体类的属性名不一致,因此出现了无法对应的情况。

解决办法:

1.可以通过为字段起别名的方式,保证和实体类中的属性名保持一致

select emp_id empId,emp_name empName,age,gender from t_emp where emp_id = #{empId};

再次执行尝试:
在这里插入图片描述

2.可以在MyBatis的核心配置文件中设置一个全局配置信息mapUnderscoreToCamelCase,

此属性可以在查询表中数据时,自动将_类型的字段名,即下划线转换为驼峰

举个栗子:

例如:字段名user_id,设置了mapUnderscoreToCamelCase,此时字段名就会转换为userId

在这里插入图片描述

  <settings>        <setting name="mapUnderscoreToCamelCase" value="true"/>  settings>

4. 处理一对一映射

调节数据库字段与实体类的属性对应需要标签resultMap,如上文那个简单的查询例子就可以这样写:

<resultMap id="empResultMap" type="Emp">    <id property="empId" column="emp_id">id>    <result property="empName" column="emp_name">result>    <result property="age" column="age">result>    <result property="gender" column="gender">result>resultMap>     <select id="getEmpById" resultMap="empResultMap">        select * from t_emp where emp_id = #{empId};    select>

属性:

  • id:表示自定义映射的唯一标识

  • type:查询的数据要映射的实体类的类型

子标签:

  • id:设置主键的映射关系

  • result:设置普通字段的映射关系

  • association :设置多对一的映射关系

  • collection:设置一对多的映射关系

  • 属性:

    • property:设置映射关系中实体类中的属性名

    • column:设置映射关系中表中的字段名

5. 处理多对一映射

5.1 级联方式处理
  <resultMap id="empAndDeptResultMap" type="Emp">            <id column="emp_id" property="empId">id>            <result column="emp_name" property="empName">result>            <result column="age" property="age">result>            <result column="gender" property="gender">result>                                     <result column="dept_id" property="dept.deptId">result>            <result column="dept_name" property="dept.deptName">result> resultMap>       <select id="getEmpAndDeptById" resultMap="empAndDeptResultMap">      SELECT t_emp.*,t_dept.* FROM t_emp      LEFT JOIN t_dept      ON t_emp.dept_id=t_dept.dept_id      where t_emp.emp_id=#{empId}    select>

接口:

在这里插入图片描述

测试方法:

    public void test(){        SqlSessionUtils sqlSessionUtils = new SqlSessionUtils();        SqlSession sqlSession = sqlSessionUtils.getSqlSession();        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);        Emp empAndDeptById = mapper.getEmpAndDeptById(1);        System.out.println(empAndDeptById);    }

查询结果:

在这里插入图片描述

5.2 使用association处理映射关系
  <resultMap id="empAndDeptResultMap" type="Emp">            <id column="emp_id" property="empId">id>            <result column="emp_name" property="empName">result>            <result column="age" property="age">result>            <result column="gender" property="gender">result>      <association property="dept" javaType="Dept">          <id column="dept_id" property="deptId">id>          <result column="dept_name" property="deptName">result>      association>  resultMap>
5.3 分步查询

第一步:查询员工信息

在这里插入图片描述

    <resultMap id="empAndDeptByStepResultMap" type="Emp">        <id column="emp_id" property="empId">id>        <result column="emp_name" property="empName">result>        <result column="age" property="age">result>        <result column="gender" property="gender">result>        <association property="dept"                     select="com.atguigu.mybatis.mapper.DeptMapper.getDeptByStep" column="dept_id">        association>     resultMap>     <select id="getEmpAndDeptByStep" resultMap="empAndDeptByStepResultMap">     select * from t_emp where emp_id=#{empId};    select>

注意:

select:设置分步查询,查询某个属性的值的sql的标识(namespace.sqlid)

column:将sql以及查询结果中的某个字段设置为分步查询的条件

第二步:根据员工所对应的部门 id 查询部门信息

在这里插入图片描述

    <select id="getDeptByStep" resultType="com.atguigu.mybatis.pojo.Dept">        select * from t_dept where dept_id=#{deptId};    select>

测试方法:

public void test(){    SqlSessionUtils sqlSessionUtils = new SqlSessionUtils();    SqlSession sqlSession = sqlSessionUtils.getSqlSession();    EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);    Emp empAndDeptByStep = mapper.getEmpAndDeptByStep(1);    System.out.println(empAndDeptByStep); }

执行结果:

在这里插入图片描述

分步查询的优点:可以实现延迟加载
但是必须在核心配置文件中设置全局配置信息:

  • lazyLoadingEnabled:延迟加载的全局开关。当开启时,所有关联对象都会延迟加载
  • aggressiveLazyLoading:当开启时,任何方法的调用都会加载该对象的所有属性。否则,每个属性会按需加载
    此时就可以实现按需加载,获取的数据是什么,就只会执行相应的 sql 。
  • 此时可通 association和 collection 中的 fetchType 属性设置当前的分步查询是否使用延迟加载, fetchType=“lazy(延迟加载) | eager(立即加载)”

在这里插入图片描述

6. 处理一对多查询

接口:
在这里插入图片描述

使用collection处理

  • collection :设置一对多的映射关系

  • ofType :设置 collection 标签所处理的集合属性中存储数据的类型

    <resultMap id="DeptAndEmpByDeptIdResultMap" type="Dept">        <id column="dept_id" property="deptId">id>        <result column="dept_name" property="deptName">result>        <collection property="emps"  ofType="Emp">            <id column="emp_id" property="empId">id>            <result column="emp_name" property="empName">result>            <result column="age" property="age">result>            <result column="gender" property="gender">result>         collection>       resultMap>      <select id="getDeptAndEmpByDeptId" resultMap="DeptAndEmpByDeptIdResultMap">      SELECT t_emp.*,t_dept.* FROM t_dept      LEFT JOIN t_emp      ON t_emp.dept_id=t_dept.dept_id      WHERE t_dept.dept_id=#{deptId}    select>

测试:

    public void test4(){        SqlSessionUtils sqlSessionUtils = new SqlSessionUtils();        SqlSession sqlSession = sqlSessionUtils.getSqlSession();        DeptMapper mapper = sqlSession.getMapper(DeptMapper.class);        Dept deptAndEmpByDeptId = mapper.getDeptAndEmpByDeptId(1);        System.out.println(deptAndEmpByDeptId);    }

执行结果:

在这里插入图片描述

7. 小结

关系映射主要处理复杂的SQl查询,如子查询,多表联查等复杂查询,应用此种需求时可以考虑使用。

来源地址:https://blog.csdn.net/m0_64102491/article/details/127619980

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

【MyBatis框架】关联映射

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

mybatis如何实现一对一关联映射

小编给大家分享一下mybatis如何实现一对一关联映射,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言在客观世界中,对象很少是孤独存在的,如班级与学生之间的关系
2023-05-30

怎么在mybatis框架中查询xml映射文件

本篇文章为大家展示了怎么在mybatis框架中查询xml映射文件,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。什么是Mybatis框架?MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、
2023-06-14

MyBatis怎么实现自定义映射关系和关联查询

本篇内容介绍了“MyBatis怎么实现自定义映射关系和关联查询”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、使用注解实现自定义映射关系当
2023-07-06

Hibernate映射关联是什么

这篇文章主要讲解了“Hibernate映射关联是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Hibernate映射关联是什么”吧!Hibernate映射关联关系和我们现实世界里事物的关
2023-06-17

MyBatis自定义映射关系和关联查询实现方法详解

这篇文章主要介绍了MyBatis自定义映射关系和关联查询实现方法,当POJO属性名与数据库列名不一致时,需要自定义实体类和结果集的映射关系,在MyBatis注解开发中,使用@Results定义并使用自定义映射,使用@ResultMap使用自定义映射
2023-05-15

MyBatis注解开发之实现自定义映射关系和关联查询

本文主要详细介绍了MyBatis注解开发中,实现自定义映射关系和关联查询,文中有详细的代码示例,对学习MyBatis有一定的参考价值,需要的朋友可以参考阅读
2023-05-15

SpringBoot如何整合Dozer映射框架

今天小编给大家分享一下SpringBoot如何整合Dozer映射框架的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. Do
2023-07-02

Hibernate映射一对多关联关系是什么

这篇文章主要讲解了“Hibernate映射一对多关联关系是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Hibernate映射一对多关联关系是什么”吧!在域模型中,类和类之间最普通的关系
2023-06-17

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录