我是靠谱客的博主 沉默玉米,最近开发中收集的这篇文章主要介绍基于MyBatis的关联映射查询一、介绍,二、关联映射步骤,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

  • 一、介绍,
  • 二、关联映射步骤
    • 1.接口文件编写接口
    • 2.修改关联实体类
    • 3.编写映射文件
      • 3.1 配置映射关联
      • 3.2 编写SQL语句
    • 4.测试


一、介绍,

关联映射查询:
查询的结果涉及数据库中多个表格的列,则这种查询称为关联映射查询
存在的问题:
如何处理查询到的结果,而不创建新的类?我TM也不知道为啥非有这种设定
解决方案:
在从表的关联实体类中创建主表关联实体类的属性类,也就衍生出另一个问题,粗暴点说“到底在哪个实体类里创建别的实体类的属性类?”
在这里插入图片描述
代码:
注意创建了属性类,记得增加set和get语句,否则没有意义
在这里插入图片描述

二、关联映射步骤

以查询结果涉及Emp、Dept、Salgrade三个关联实体类的search( )函数接口为例

1.接口文件编写接口

在mapper文件中编写

List<Emp> search(Dto dto);

2.修改关联实体类

由于Emp是唯一有外键的关联实体类,所以在Emp实体类里创建Dept和Salgrade的属性类,记得创建对应属性类的Set和Get访问方法。

package com.upc.homework2.po;


public class Emp {

  private Integer empno;
  private String ename;
  private String job;
  private Integer mgr;
  private String hiredate;
  private Double sal;
  private Double comm;
  private Integer deptno;

  // 创建属性类
  private Dept dept;
  private Salgrade grade;
  
  // 创建Dept的访问
  public Dept getDept() { return dept;}
  public void setDept(Dept dept) {this.dept = dept;}
  // 创建Salgrade的访问
  public Salgrade getGrade() {return grade;}
  public void setGrade(Salgrade grade) {this.grade = grade;}
  
  // Emp实体类属性本身的访问
  public Integer getEmpno() {return empno;}
  public void setEmpno(Integer empno) {this.empno = empno;}
  public String getEname() {return ename;}
  public void setEname(String ename) {this.ename = ename;}
  public String getJob() {return job;}
  public void setJob(String job) {this.job = job;}
  public Integer getMgr() {return mgr;}
  public void setMgr(Integer mgr) {this.mgr = mgr;}
  public String getHiredate() { return hiredate;}
  public void setHiredate(String hiredate) {this.hiredate = hiredate;}
  public Double getSal() {return sal;}
  public void setSal(Double sal) {this.sal = sal;}
  public Double getComm() {return comm;}
  public void setComm(Double comm) {this.comm = comm;}
  public Integer getDeptno() {return deptno;}
  public void setDeptno(Integer deptno) {this.deptno = deptno;}

}

3.编写映射文件

3.1 配置映射关联

个人理解:
所谓配置映射关联,就是创建了一种新的数据类型

配置的原因:
由于自动创建的Emp关联实体类计算机默认只与emp表关联,即使我们在里面添加了表属性,计算机是不会识别的,所以我们直接让resultType=“com.upc.homework2.po.Emp”电脑会报错,需要重新弄配置一个新的类型

语法:

  • id 标签 将数据库表格的主键 与关联实体类的属性进行关联
  • resul 标签 将数据库表格的 与关联实体类的属性进行关联
  • association 标签 将 关联实体类 与关联实体类的属性类进行关联
    说是配置、关联,也可以说是一种声名,声名数据类型都是来自哪
 <!-- 创建新的resultMap,名为empMap,数据类型是com.upc.homework2.po.Emp -->
<resultMap id="empMap" type="com.upc.homework2.po.Emp">
        <!--    关联-Emp实体类与emp表格的主键    -->
        <id column="empno" property="empno"/>
        <!--    关联-Emp的属性和emp表的列名    -->
        <result column="ename"  property="ename" />
        <result property="job" column="job" />
        

        <!--   关联-Emp中的属性类dept与关联实体类Dept    -->
        <association property="dept" javaType="com.upc.homework2.po.Dept">
            <!--      关联-属性类dept与数据库表dept的主键、列名     -->
            <id column="deptno" property="deptno"/>
            <result property="dname" column="dname"/>
            <result property="loc" column="loc"/>
        </association>

        <!--   关联-Emp实体类里的属性类grade与关联实体类Salgrade    -->
        <association property="grade" javaType="com.upc.homework2.po.Salgrade">
       		 <!--      关联-属性类grade与数据库表salgrade的主键、列名     -->
            <id column="grade" property="grade"/>
            <result column="losal" property="losal"/>
            <result column="hisal" property="hisal"/>
        </association>
    </resultMap>

注意:

  • 配置关联关系,查询结果涉及到的属性都要配置,多写了可以,少了不行
  • 关联语法中property与colunmn的前后位置有什么意义、区别 :没有任何意义,谁在前都可以

3.2 编写SQL语句

唯一的区别是保存结果的数据类型变了
由 resultType=“com.upc.homework2.po.Emp” 变为
resultMap=“empMap”

    <select id="search" resultMap="empMap" parameterType="com.upc.homework2.dto.Dto">
        select
        e.ename,d.dname,s.grade
        from emp e,dept d,salgrade s
        where e.deptno=d.deptno
        and e.sal between s.losal and s.hisal
        <if test="lowsal != null and lowsal != ''">
            and losal >= #{lowsal}
        </if>
        <if test="higsal != null and higsal != ''">
            and hisal &lt;= #{higsal}
        </if>
    </select>

4.测试

关键在于如何调用关联实体类的属性类

    @Test
        // emp.getDept().getDname():emp.getDept()获取emp里的Dept表,.getDname()再获取Dept表里的danme属性
        // emp.getGrade().getGrade() 同理,获取Grade表里的grade属性
        //与Salgrade salgrade = emp.getGrade(); salgrade.getGrade()同理
    void search() {
        Dto dto = new Dto();
        List<Emp> emps = mMapper.search(dto);
        
        // 一个for循环在总台输出
        emps.forEach(emp->{
            Salgrade salgrade = emp.getGrade();
            System.out.println(emp.getEname()+"t"+emp.getDept().getDname()+"t"+salgrade.getGrade());
        });
        
    }

最后

以上就是沉默玉米为你收集整理的基于MyBatis的关联映射查询一、介绍,二、关联映射步骤的全部内容,希望文章能够帮你解决基于MyBatis的关联映射查询一、介绍,二、关联映射步骤所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部