文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

【MyBatis框架】关联映射

2023-10-28 09:42

关注

关系映射

1. 关联映射概述

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

在这里插入图片描述

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>

属性:

子标签:

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); }

执行结果:

在这里插入图片描述

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

在这里插入图片描述

6. 处理一对多查询

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

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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯