Mybtais高级结果映射-多对一表映射

前言

从前我们只进行单表的sql操作,但是如果涉及多张表的操作,原先的映射关系就不太适用了,因此这里将会介绍Mybatis的高级结果映射技巧

 准备工作

准备两张数据库表,一个员工表,一个部门表(我们使用oracle的数据表结构在mysql中实现,实现mysql的相关操作)

本文示例程序的数据模型来自oracle数据库scott示范账户的部门信息表(dept)和员工信息表(emp)。表结构如下:

departments:

employees:

 需求分析:

  • 如果查询结果需要返回多张表的数据,则需要配置高级结果映射,将多个类型和多张表进行映射。
  • 例如如下sql语句,你无法通过简单的设置别名来完成将部门表的部门名称列dname映射到Emp类的dept属性的dname属性:
select e.employee_id,e.first_name,e.salary,d.department_id,d.department_name as departments.department_name 
from employees e inner join departments d
on e.department_id = d.department_id

别名是不能带“.”符号的

注意:这里演示的是员工表到部门表的映射(这是一种多对一的映射关系):

需要在多的一方创建一的一方的对象

 高级结果映射

准备工作

参照我的博客:MyBatis入门到进阶-解锁高效数据库操作技巧 ,在它的基础上创建实体类、Dao和mapper以及测试类

Departments:

我仅将需要用到的字段封装成属性,配置映射关系时也仅配置我们存在的属性对应的字段,此时sql即使查询的是所有字段,因为我们没有映射,也没有对应的属性,相当于没有查询该字段

package entity;import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;import java.io.Serializable;@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Departments implements Serializable {private Integer department_id;private String department_name;
}

Employees:

package entity;import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;import java.io.Serializable;@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Employees implements Serializable {private Integer employees_id;private String first_name;private Double salary;private Departments dept;}

在多的一方(Employees)设置一的一方(Departments)的对象

EmpDao:

package dao;import entity.Employees;import java.util.List;public interface EmpDao {List<Employees> getEmpBySalAndDept(Employees emp);
}

EmpMapper:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<!--mapper为映射的根节点,用来管理DAO接口 namespace指定DAO接口的完整类名,表示mapper配置文件管理哪个DAO接口(包.接口名)mybatis会依据这个接口动态创建一个实现类去实现这个接口,而这个实现类是一个Mapper对象-->
<mapper namespace="dao.EmpDao"><resultMap id="empDept" type="entity.Employees"><id property="employees_id" column="employees_id"/><result property="first_name" column="first_name"/><result property="salary" column="salary"/><association property="dept" column="department_id" javaType="entity.Departments"><id property="department_id" column="department_id"/><result property="department_name" column="department_name"/></association></resultMap><select id="getEmpBySalAndDept" parameterType="entity.Employees" resultMap="empDept">select * from employees einner joindepartments d on e.department_id = d.department_id<where><if test="salary>0">e.salary > #{salary}</if><if test="dept !=null and dept.department_id>0">and e.department_id = #{dept.department_id}</if></where></select>
</mapper>

详细分析:

  • resultMap标签:配置属性和字段的映射关关系
    • id属性:定义resultMap的名字;type属性:定义resultMap的类型
    • id标签:配置属性和主键字段的映射关系
      • property属性:属性名
      • column属性:字段名
    • result标签:配置我们需要查询的字段的,属性和字段的映射关系
    • association标签:配置高级结果映射(多对一),将部门表的部门名称列department_name映射到Emp类的dept属性的department_name属性

      • property属性:代表一的一方的对象名

      • column属性:代表外键

      • javaType属性:代表一的一方的类型

      • id标签:配置属性和主键字段的映射关系

      • result标签:配置我们需要查询的字段的,属性和字段的映射关系

在select标签中使用resultMap属性,resultMap的属性值为resultMap标签的id属性值

  • where标签:用来包裹动态sql
    • if标签:进行逻辑判断,test属性的表达式值为true拼接sql

员工到部门的关联关系映射配置,查询结果中的部门数据将会封装到Dept对象中,作为Emp对象的dept属性值和Emp对象一并返回

 将resultType改成resultMap,并指定为id为empDept的映射配置

 如果查询条件有多个,并且是可任意选择的,则需要采用动态条件查询技巧,使用where标签和if标签,注意if标签中的test属性值可以直接使用对象的属性来进行条件判断,不能加#{}

EmpTest:

import dao.EmpDao;
import dao.UserDao;
import entity.Departments;
import entity.Employees;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import util.SqlSessionFactoryUtil;import java.util.List;public class EmpTest {SqlSession session= SqlSessionFactoryUtil.getSessionSql();EmpDao empDao=session.getMapper(EmpDao.class);@Testpublic void testEmp() {Employees emp = new Employees();emp.setSalary(3000.0);Departments dept = new Departments();dept.setDepartment_id(50);emp.setDept(dept);List<Employees> list = empDao.getEmpBySalAndDept(emp);for (Employees e : list) {System.out.println(e.getFirst_name() + "," + e.getSalary() + ","+ e.getDept().getDepartment_name());}}
}

总结

这里演示的是mybtais的高级结果映射(多对一的表映射)。目的是快速理解mybatis中实现多表查询的方式(多对一的表查询)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/150947.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

一份转型大模型产品经理指南

作为一个产品经理&#xff0c;你可能已经熟悉了一些常见的AI技术和应用&#xff0c;比如机器学习、深度学习、自然语言处理、计算机视觉等。 但是&#xff0c;你是否了解什么是大模型&#xff1f;大模型又有什么特点和优势&#xff1f;为什么大模型会成为AI领域的一个重要趋势…

SQL语言入门

一、SQL语言入门&#xff1a; 数据库管理人员&#xff08;DBA&#xff09;通过数据库管理系统&#xff08;DBMS&#xff09;可以对数据库&#xff08;DB&#xff09;中的数据进行操作 SQL是一种非过程化语言&#xff0c;只需提出“做什么”&#xff0c;而不需要指明“怎么做”…

如何打造一个圈子社交系统?社交圈子论坛系统源码该如何实现

要打造一个圈子社交系统&#xff0c;并实现其源码&#xff0c;需要经历一系列详细的步骤&#xff0c;包括需求分析、系统设计、技术选型、开发、测试以及部署等。以下是一个全面的指南&#xff1a; 一、需求分析 明确目标用户&#xff1a;确定你的社交圈子面向哪类用户群体&a…

将U盘作为启动项报错:Verifying shim SBAT data failed: Security Policy Violation

问题描述 今天给新电脑装双系统的时候&#xff0c;将U盘设为启动项&#xff0c;总是报错&#xff0c;起初以为是启动盘做的有问题&#xff0c;报错如下&#xff1a; Verifying shim SBAT data failed: Security Policy Violation Something has gone seriously wrong: SBAT s…

栈的深度解析:顺序栈与链栈的实现

引言 栈是一种重要的线性数据结构&#xff0c;遵循“后进先出”&#xff08;LIFO&#xff09;的原则。栈的应用非常广泛&#xff0c;如表达式求值、括号匹配、递归实现等。在本文中&#xff0c;我们将深入探讨栈的概念&#xff0c;并通过顺序栈和链栈两种实现方式进行对比分析…

路径报错问题

项目场景&#xff1a; 假设这是我的项目结构&#xff0c;我现在需要在aa.js文件中引入并使用aa.geojson文件&#xff0c; 问题&#xff1a; 当我引入路径是const filePath ../geo/aa.geojson&#xff1b;的时候&#xff0c;系统报错 "aa.geojson is not Found",找不…

[000-002-01].第29节:MySQL执行流程

1、MySQL的查询流程&#xff1a; 客户端请求进入到数据库服务器后&#xff0c;先进行查询缓存&#xff0c;如果命中&#xff0c;那么就返回结果&#xff1b;如果没命中&#xff0c;进入到解析器&#xff0c;进行词法解析和语法解析&#xff0c;生成解析树&#xff1b;然后进入到…

企业图纸文档管理系统推荐 三大企业图纸文档管理软件详细介绍

在现代企业的设计和生产过程中&#xff0c;图纸文档的管理是至关重要的一环。 无论是建筑、制造业&#xff0c;还是技术研发领域&#xff0c;图纸文档的正确存储、分享与管理能够极大提升工作效率&#xff0c;避免误操作或信息丢失。 接下来&#xff0c;小编将为大家推荐三款优…

采购管理系统SRM助力电子元器件制造企业构建高效的供应商管理体系

在当今快速迭代的电子元器件制造行业中&#xff0c;构建一套高效、透明的供应商管理体系对于提升企业竞争力、降低运营成本、确保供应链稳定性至关重要。采购管理系统(SRM&#xff0c;Supplier Relationship Management)作为这一领域的得力助手&#xff0c;正引领着电子元器件制…

远程连接服务器时出现“这可能是由于CredSSP加密数据库修正”的错误提示的解决办法

现象&#xff1a; 当远程连接服务器时&#xff0c;有时候会出现以下提示&#xff0c;从而导致无法成功连接服务&#xff0c;如下所述&#xff1a; 原因&#xff1a; 远程桌面使用的是“凭据安全支持提供程序协议 (CredSSP) ”&#xff0c;这个协议在未修补的版本中是存在漏…

scrapy 爬取微博(四)【最新超详细解析】: 设计篇

一、功能设计 开始开发之前我们先对本文的scrapy微博爬虫工程进行一个功能的设计&#xff0c;包含的功能模块如下&#xff1a; 功能模块具体描述微博文章爬取根据关键词、时间范围等参数爬取微博文章&#xff0c;获取用户名、ID、微博mid、微博内容、点赞、转发、评论等数据微…

《深度学习》卷积神经网络 使用最优模型、调整学习率 用法解析及案例实现

目录 一、使用最优模型 1、什么是最优模型 2、如实使用最优模型 1&#xff09;读取参数方法 2&#xff09;调用完整模型方法 3&#xff09;实例 完整代码&#xff1a; 打印结果&#xff1a; 二、调整学习率 1、什么是调整学习率 2、目的 3、调整学习率的方法 1&am…

C++ 语言课程笔记

C 语言课程笔记 C语言程序设计第四版——谭浩强著&#xff0c;此书中的代码题大部分已经在本文中展示&#xff0c;以及南开大学 C 语言上机题库 100 题的作答&#xff0c;如果有作答不正确的地方或者可优化的地方&#xff0c;欢迎指正&#xff0c;谢谢&#xff01; 001 屏幕输出…

DAMODEL丹摩智算平台实践CogVideoX

文章目录 前言 一、平台账号注册并登录 二、部署CogVideoX &#xff08;一&#xff09;简介 &#xff08;二&#xff09;部署 1. 创建实例 2. 配置环境和依赖 3.预制模型与配置文件 三、开始运行 总结 前言 该文章主要记录DAMODEL丹摩智算平台实践过程与心得体会&…

【YashanDB知识库】客户端字符集与数据库字符集兼容问题

本文转自YashanDB官网&#xff0c;具体内容请见https://www.yashandb.com/newsinfo/7352675.html?templateId1718516 问题现象 客户端yasql配置字符集为GBK&#xff0c;服务端yasdb配置字符集为UTF8&#xff0c;之后执行语句&#xff1a; 会发现&#xff1a; 期望是两个都…

FAT32取证分析

前言&#xff1a; 在正常工作中经常会有数据恢复或者取证分析的场景&#xff0c;数据是否能被恢复&#xff0c;主要还是看数据是否被覆盖&#xff0c;正常情况下文件虽然被删除&#xff0c;只是修对应的标志位&#xff0c;文件本身数据并不会被破坏&#xff0c;所以我们就可以…

【Java】1.初识Java

文章目录 1. 使用记事本创建.Java程序2. 使用IDEA创建第一个Java程序3. 标识符4. 关键字 1. 使用记事本创建.Java程序 先创建了HelloWorld.java这个文件。然后用Sublime Text记事本打开&#xff0c;输入以下代码。 winr&#xff0c;cmd输入D:切换到D盘&#xff0c;然后输入cd …

投资气膜场馆:开启未来体育发展的新纪元—轻空间

随着对体育设施建设的重视&#xff0c;气膜场馆作为一种创新的体育设施&#xff0c;正日益成为投资的热门选择。气膜场馆凭借其独特的优势和多重好处&#xff0c;不仅能提升体育场馆的功能性和经济性&#xff0c;更为地方经济发展注入了新的活力。 成本效益显著 气膜场馆具有快…

419. 棋盘上的战舰(C++)

题目 给你一个大小为 m x n 的矩阵 board 表示棋盘&#xff0c;其中&#xff0c;每个单元格可以是一艘战舰 X 或者是一个空位 . &#xff0c;返回在棋盘 board 上放置的 舰队 的数量。 舰队 只能水平或者垂直放置在 board 上。换句话说&#xff0c;舰队只能按 1 x k&#xff…

SimpleAIAgent:使用免费的glm-4-flash即可开始构建简单的AI Agent应用

SimpleAIAgent是基于C# Semantic Kernel 与 WPF构建的一款AI Agent探索应用。主要用于使用国产大语言模型或开源大语言模型构建AI Agent应用的探索学习&#xff0c;希望能够帮助到感兴趣的朋友。 接下来我想分享一下我的AI Agent应用实践。 翻译文本并将文本存入文件 第一个…