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

news2024/11/20 21:33:42

前言

从前我们只进行单表的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 mapper
        PUBLIC "-//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 e
        inner join
        departments 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);
    @Test
    public 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.coloradmin.cn/o/2163866.html

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

相关文章

彻底理解前端模块化

目录 引入历史问题 CommonJSexports导出module.exports导出require导入加载过程缺点 AMD规范&#xff08;基本不用&#xff09;require.js使⽤ CMD规范&#xff08;基本不用&#xff09;SeaJS的使⽤ ES Module简单使用export关键字import关键字export和import结合default⽤法im…

自然语言处理在人工智能领域的发展历程,以及NLP重点模型介绍

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下自然语言处理在人工智能领域的发展历程&#xff0c;以及NLP重点模型介绍。本文详细介绍了自然语言处理的发展历程&#xff0c;同时深入探讨了各种自然语言处理模型的原理与应用。文章首先回顾了自然语言处理技术的发…

读论文《OmniGen: Unified Image Generation》

OmniGen演示了在单一框架内执行各种图像生成任务的能力。此外&#xff0c;它还具有推理能力和语境学习能力。 论文地址&#xff1a;2409.11340v1 (arxiv.org) 项目地址&#xff1a;GitHub - VectorSpaceLab/OmniGen 项目目前还不完整&#xff0c;论文展现的通用性十分强大&am…

【Java】Java中接口与内部类详解

目录 引言 一、接口&#xff08;Interface&#xff09; 1.1 接口的定义 1.1.1 接口的特点 1.2 接口的实现 1.3 接口的继承 1.4 接口的注意事项 1.5 代码示例 二、内部类&#xff08;Inner Class&#xff09; 2.1 内部类特点 2.2 成员内部类 2.2.1 对象的创建 2.…

基于SpringBoot社区疫情信息管理系统的设计和实现

文未可获取一份本项目的java源码和数据库参考。 选题的意义 保护好人民群众的基本安全&#xff0c;贯彻党的领导下中国一盘棋的基本准则。将病毒隔绝在外&#xff0c;信息系统的存在显得至关重要&#xff0c;应对新型冠状病毒肺炎疫情治理的实践背景。实时关注更新疫情动态&a…

开放式耳机哪个牌子的质量好?2024开放式蓝牙耳机排行榜前5强推荐!

​开放式耳机因其舒适的佩戴感和较小的耳朵损伤而广受好评。曾经让人头疼的漏音问题&#xff0c;随着科技的进步&#xff0c;已经有了显著改善&#xff0c;不再是个大问题。在拥挤的环境中&#xff0c;耳机音量过大不仅会打扰他人&#xff0c;也会让自己感到不适。因此&#xf…

双十一买什么?高性价比数码好物来袭,不心动都难!

​每年的双十一都是一场购物的狂欢盛宴&#xff0c;众多数码好物纷纷推出诱人的折扣。在这琳琅满目的数码产品中&#xff0c;电容笔无疑是一颗格外耀眼的 “星”。无论是学生党用于记录课堂笔记、撰写论文&#xff0c;还是绘画爱好者进行艺术创作、灵感挥洒&#xff0c;电容笔都…

linux -L16-linux 查看应用占用的资源top

linux 查看应用占用的资源top Targetsteps启动 top 命令排序进程&#xff1a;查看特定进程&#xff1a;过滤进程其他常用选项交互式帮助 Target linux 查看应用占用的资源top steps 在 Linux 系统中&#xff0c;top 命令是一个非常有用的工具&#xff0c;它提供了一个实时更…

springframework Ordered接口学习

Ordered接口介绍 完整路径&#xff1a; org.springframework.core.Ordered Ordered 接口是 Spring 框架中的一个核心接口&#xff0c;用于定义对象的顺序。这个接口通常用于需要排序的组件&#xff0c;例如 Spring 中的 Bean、过滤器&#xff08;Filters&#xff09;、拦截器…

SUSCTF2024-Redroid-出题笔记与解题思路

SUSCTF2024-Redroid-出题笔记与解题思路 Step1Step2Step3Step4 描述&#xff1a;题目要求使用安卓13/14系统真机 Step1 Java层的逻辑比较简单&#xff0c;两个Activity MainActivity读并验证password&#xff0c;正确即进入CheckActivity&#xff0c;同时会传递password pass…

铝壳电阻与普通电阻有什么区别?

铝壳电阻和普通电阻是电子元件中常见的两种电阻类型&#xff0c;它们在结构和性能上有一定的区别。铝壳电阻是具有金属外壳的电阻器&#xff0c;其外壳通常由铝合金制成&#xff0c;具有良好的散热性能。而普通电阻则没有金属外壳&#xff0c;只有一层绝缘材料包裹着电阻丝。 …

软件设计之JavaWeb(8)

软件设计之JavaWeb(8) 此篇应在MySQL之后进行学习: 路线图推荐&#xff1a; 【Java学习路线-极速版】【Java架构师技术图谱】 尚硅谷全新JavaWeb教程&#xff0c;企业主流javaweb技术栈 资料可以去尚硅谷官网免费领取 此章节最好学完JDBC观看 学习内容&#xff1a; promiseA…

力扣面试经典150题——合并两个有序数组

目录 题目链接&#xff1a; 题目描述 示例 提示&#xff1a; 解法一&#xff1a;合并数组排序 Java写法&#xff1a; 运行时间 C写法&#xff1a; 运行时间 时间复杂度和空间复杂度 解法二&#xff1a;双指针 Java写法&#xff1a; 运行时间 C写法&#xff1a; 运…

新闻文本分类识别系统Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+TensorFlow+Django网页界面

一、介绍 文本分类识别系统。本系统使用Python作为主要开发语言&#xff0c;首先收集了10种中文文本数据集&#xff08;“体育类”, “财经类”, “房产类”, “家居类”, “教育类”, “科技类”, “时尚类”, “时政类”, “游戏类”, “娱乐类”&#xff09;&#xff0c;然…

024.PL-SQL进阶—游标

课 程 推 荐我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448;入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448;虚 拟 环 境 搭 建 &#xff1a;&#x1…

STM32 Modbus主从站实例程序-FreeRTOS

资料下载地址&#xff1a;STM32 Modbus主从站实例程序-FreeRTOS​​​​​​​ 基本设置 启用Freertos,添加任务 设置中断优先级 设置长生成MDK工程 工程里面添加Modbus库 修改main.c 修改freertos.c 编译下载到单片机,完美运行

黄奕前夫勇夺“全球金融圈奥斯卡”!与她离婚后,姜凯身价涨30倍

黄奕前夫勇夺“全球金融圈奥斯卡”&#xff01;与她离婚后&#xff0c;姜凯身价涨30倍 近日&#xff0c;小编被一则经济类新闻吸引。姜凯主理的凯资本Kai Capital荣获“2024年度全球最佳多策略对冲基金”。 这不是演员黄奕的第一任丈夫姜凯吗&#xff1f; 这个奖项可不一般。…

Ubuntu LLaMA-Factory实战

一、Ubuntu LLaMA-Factory实战安装&#xff1a; CUDA 安装 CUDA 是由 NVIDIA 创建的一个并行计算平台和编程模型&#xff0c;它让开发者可以使用 NVIDIA 的 GPU 进行高性能的并行计算。 首先&#xff0c;在 https://developer.nvidia.com/cuda-gpus 查看您的 GPU 是否支持CU…

html TAB切换按钮变色、自动生成table--使用函数优化结构

<!DOCTYPE html> <head> <meta charset"UTF-8"> <title>Dynamic Tabs with Table Data</title> <style> /* 简单的样式 */ .tab-content { display: none; border: 1px solid #ccc; padding: 1px; marg…

【专题】2024年中国白酒行业数字化转型研究报告合集PDF分享(附原数据表)

原文链接&#xff1a;https://tecdat.cn/?p37755 消费人群趋于年轻化&#xff0c;消费需求迈向健康化&#xff0c;消费场景与渠道走向多元化&#xff0c;这些因素共同驱动企业凭借数据能力来适应市场的变化。从消费市场来看&#xff0c;消费群体、需求、场景及渠道皆展现出与…