MyBatis中discriminator鉴别器如何使用?你若不会,我手把手教你 | 超级详细,建议收藏

news2025/5/28 2:59:08

1. 前言

        不知道大家在平时有没有手写sql的习惯,当还没有开源mybatis-plus时,手写sql那是非常的常见,但是在维护一个老项目的时候,竟然勾起了我的一丝回忆。涉及到一个需求,我要追溯到它sql语句上,发现了一个很有趣的东西,竟然还有人记得用它,虽然符合的应用场景很少,但是能把它派上场,属实是有点惊艳到我了。

        如上运用场景是根据一个type字段来区别,0是启用,1是禁止,启用可以查到对于的权限属性,1是没有权限属性也查询不到,于是这位同事就巧妙地用到了它。

        所以,今天我就给大家讲讲它discriminator,估计很多小伙伴未曾见过或者基本很少人用过吧,是不是,大家说,知道这个是干嘛用的嘛。

2. 环境说明

本地的开发环境:

  • 开发工具:IDEA 2021.3
  • JDK版本: JDK 1.8
  • Spring Boot版本:2.3.1 RELEASE
  • Maven版本:3.8.2

3. discriminator

3.1 简介

        discriminator,中文翻译过来就是鉴别器的意思。至于它是干啥用的,顾名思义,在mybatis中可以使用discriminator来判断某列的值,然后根据某列的值改变封装结构。你就可以理解成在中的Java 语言中的 switch 语句,这样大家可明白了吧。有时候,一个数据库查询可能会返回多个不同的结果集,它就派上用场了。

3.2 结构使用

一个鉴别器的定义需要指定 column 和 javaType 属性。例如:

<resultMap type="com.example.demo.entity.UserEntity" id="getUserForSex">
    <discriminator javaType="java.lang.String" column="sex">
        <case value="男" resultType="com.example.demo.vo.user.boy"/>
        <case value="女" resultType="com.example.demo.vo.user.girl"/>
    </discriminator>
</resultMap>

3.3 属性介绍

  • column:设置要进行鉴别比较值的列名。
  • javaType:指定列的类型,保证使用相同的Java类型来比较值。

其中discriminator标签可以有1个或多个case标签,case标签包含以下3个属性:

  • value:该值为discriminator标签column属性用来匹配的值。
  • resultMap:当column的值和value的值匹配时,可以配置使用resultMap指定的映射,resultMap优先级高于resultType。
  • resultType:当column的值和value的值匹配时,用于配置使用resultType指定的映射。

更多详细可自行查阅官方文档:mybatis – MyBatis 3 | XML 映射器

4. 代码测试

        接下来,我带着大家来实践一波,学习任何东西不光是理论,更注重实践,这样才能提高对该知识点的认知与理解。

4.1 定义查询方法

顾,我先在UserMapper.xml中定义一个查询方法。根据用户id查询信息。

<select id="getUserByIdFor" resultMap="getUserForSex">
     select * from user where id= #{id}
</select>

        然后我再通过user表中的sex作为鉴别比较值,其sex共分男女两个值,所以接下来我们在写case的时候其实就只有两种情况。

4.2 定义resultMap

<!--根据sex返回指定结构体-->
<resultMap type="com.example.demo.entity.UserEntity" id="getUserForSex">
    <discriminator javaType="java.lang.String" column="sex">
        <case value="男" resultType="com.example.demo.vo.user.boy"/>
        <case value="女" resultType="com.example.demo.vo.user.girl"/>
    </discriminator>
</resultMap>

如上我是直接定义了两个pojo结构体,分别为boy与girl

4.3 定义pojo 

boy.java

@Data
public class boy {
    private String sex;
    private String address;
}

girl.java

@Data
public class girl {
    private String sex;
    private String age;
}

        大家可以看出,boy与girl的构造一字段之差,没错,我就是要让大家直观感受discriminator到底做了一件什么事。很明确啊,如果查询到的数据中sex=男,那就返回体为boy,反之返回体为girl。

接下来我们来验证一下。

先写个Controller请求方法。

4.4 定义Controller 

/**
 * 根据id查询区分性别返回不同结构体内容
 */
@GetMapping("/get-user-for-id")
@ApiOperation(value = "根据id查询区分性别返回不同结构体内容", notes = "根据id查询区分性别返回不同结构体内容")
public List<UserEntity> getUserInfo(@RequestParam Integer id) {
    return userMapper.getUserByIdFor(id);
}

完事之后,我们直接重启项目,在swagger中进行接口测试。

我们对于id分别传入一个sex=男和sex=女的数据试试。

大家请看,当传入id=1.

4.5 Swagger测试 

正确返回的结构体就是girl。

我们再将id=3传入。

从截图返回内容可以看到,sex=男,毫无悬念返回的是boy结构体。


5. 热文推荐🔥

  1. 浅谈你对单例类中使用volatile关键字的理解
  2. Mysql分页 vs Oracle分页 对比分析
  3. Java 如何实现手动连接数据库(MySQL或Oracle)?
  4. Java 如何实现获取客户端公网IP地址?
  5. 为什么print和println输出java对象时会打印内存地址?
  6. 如何解决springboot拦截器@Autowried注入为空问题?
  7. MyBatis中的discriminator鉴别器如何使用?
  8. 如何快速手撕单例类?一文教会你
  9. 如何保证三个线程按顺序执行?不懂我教你 
  10. 简谈你对synchronized关键字的使用

6. 最后🔥

🏆本文收录于《Java进阶实战》,需要的小伙伴可以进去瞅瞅。

本专栏致力打造最硬核Java进阶系列学习内容,🚀均为全网独家首发,打造精品专栏,专栏持续更新中…欢迎大家订阅持续学习。

       我是bug菌,一名CSDN / 阿里云 / 华为云 / 51CTO 等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者,全网粉丝合计10w+,硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!一起学习,一起变强。

关注公众号,获取最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等硬核资源

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

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

相关文章

【PC迁移与管理】上海道宁为每个用户和每个 PC 传输和迁移场景提供解决方案——PCmover

PCmover 是一款 可以自动将所有选定文件、 文件夹、设置、用户配置文件 甚至应用程序 从旧PC传输、恢复和升级到 新PC或操作系统的软件 而且由于 大多数迁移的应用程序 都已安装在新PC上即可使用 通常无需查找旧CD 以前下载的程序 序列号或许可证代码 开发商介绍 La…

mongodb-分片集群-搭建

分片集群 高数据量和吞吐量的数据库应用会对单机的性能造成较大压力,大的查询量会将单机的CPU耗尽,大的数据量对单机的存储压力较大,最终会耗尽系统的内存而将压力转移到磁盘IO上。 为了解决这些问题,有两个基本的方法: 垂直扩展和水平扩展。 垂直扩展&#xff1a;增加更多的…

嵌入式 QT 基于mplayer的音乐播放器

1、实现功能 2、音乐播放界面 2.1 界面程序 2.1.1 界面控制初始化 2.1.2 控件风格程序 3、 歌曲列表界面 3.1.1 在 widget.h 定义 QListWidge 对象指针 3.1.2 在 memberInit 函数中添加 QlistWidge 初始化 3.1.3 在 setMusicPlayStyle 函数中设置其风格 4、音乐播放功…

第四章 程序的控制结构

文章目录 第四章 程序的控制结构4.1 程序的三种控制结构4.1.1 程序流程图4.1.2 程序控制结构基础4.1.3 程序控制结构扩展 4.2 程序的多分支结构4.2.1 单分支结构&#xff1a;if4.2.2 二分支结构&#xff1a;if-else4.2.3 多分支结构&#xff1a;if-elif-else4.2.4 判断条件及组…

Github Copilot AI配对开发者编程,提升项目建设进度

Github Copilot是什么&#xff1f; GitHub Copilot 是结对编程的虚拟版本。结对编程是一种常见的敏捷软件开发技术 —— 即两个开发人员在同一个项目上并肩协作&#xff0c;轮流编写代码并检查合作伙伴的输出。 Copilot 可以支持十几种语言&#xff0c;与 Python、JavaScript、…

一文揭秘高效稳定的 Apache Doris 内存管理机制

作者&#xff1a;SelectDB 高级研发工程师、Apache Doris Committer 邹新一 背景 Apache Doris 作为基于 MPP 架构的 OLAP 数据库&#xff0c;数据从磁盘加载到内存后&#xff0c;会在算子间流式传递并计算&#xff0c;在内存中存储计算的中间结果&#xff0c;这种方式减少了频…

Vue2创建脚手架小案例

Vue CLI是一个官方提供的命令行工具&#xff0c;用于快速创建Vue.js项目和管理项目依赖项。下面是使用Vue CLI创建Vue.js项目的基本步骤&#xff1a; 首先&#xff0c;确保已安装Node.js和npm包管理器。可以在终端输入以下命令来检查它们的版本&#xff1a; node -v npm -v如…

MySQL备份

MySQL的备份方式有哪几种&#xff1f;分别如何实现&#xff1f; 目录 一、数据的备份类型 1、数据的备份类型根据其自身的特性主要分为以下几组&#xff1a; 二、MySQL备份数据的方式 三、常见的备份工具 1、一般情况下, 我们需要备份的数据分为以下几种 2、备份工具 3…

【2023 · CANN训练营第一季】昇腾AI入门课(TensorFlow)第三章——AI应用开发

1.具备编程经验 本课程中的示例代码、练习涉及C&C语言、Python语言的如下基础知识&#xff0c;建议您在学习本课程前先学习这部分内容 1.C&C语言 a.变量、基本数据类型、指针、引用、const限定符等 b&#xff0c;字符串和数组 c.表达式&#xff0c;包括赋值运算、条件…

回收站中怎么找回误删除的文件?这几种方法很实用

当我们在电脑上操作文件的时候&#xff0c;难免会有不小心删除文件的情况发生。这个时候&#xff0c;我们可以打开回收站来找回误删除的文件。但是&#xff0c;有时候我们也会误将回收站清空。那么&#xff0c;该怎样才能找回已经误删除的文件呢&#xff1f;在这里提供了回收站…

免费搭建个人stable-diffusion绘画(干货教程)

目前AI绘画主流的模型有Midjourney、Stable Diffusion、DALLE&#xff0c;最火的当属Midjorney和Stable Diffusion&#xff0c;但是由于Midjourney没有开源且要付费&#xff0c;我今天主要分享Stable Diffusion的部署和使用方法的分享。 大家应该面对的一个不可避免的问题&…

kubernetes-informer机制

一、概念 informer 是 client-go 中的核心工具包&#xff0c;在kubernetes中&#xff0c;各个组件通过HTTP协议跟 API Server 进行通信。如果各组件每次都直接和API Server 进行交互&#xff0c;会给API Server 和ETCD造成非常大的压力。在不依赖任何中间件的情况下&#xff0…

Git简单使用介绍

Git作用 版本控制&#xff08;版本迭代&#xff09;&#xff0c;多人开发&#xff0c;没有版本控制&#xff0c;每修改一下文件就需要备份 常用的版本控制器&#xff1a;Git 和SVN 主要区别&#xff1a; SVN是集中式版本控制系统&#xff0c;版本库是集中放在中央服务器的&a…

半导体芯片划片机怎么使用

使用半导体芯片划片机的方法如下&#xff1a; 准备工作&#xff1a;清洁设备&#xff0c;核对晶圆数量和批次信息&#xff0c;确保晶圆完好无破损。 粘贴晶圆片&#xff1a;将待切割的晶圆片粘贴到蓝膜上&#xff0c;并将蓝膜框架放入划片机。 划片开始&#xff1a;实时清除划…

想劝大家别去外包,干了5年,彻底废了......

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近5年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01; 而我已经在一个企业干了四…

什么是SQL Server 审核

IT 安全专业人员需要定期监视和审核 SQL Server 中的所有活动&#xff0c;以确保关键数据的完整性和机密性不会受到损害。手动监视服务器上的所有这些活动是一个忙碌的过程。为了使管理员的工作更轻松一些&#xff0c;Microsoft 提供了 SQL Server 审核功能来帮助管理员有效地审…

vue不同开发方式引用vue文件讲解

上面这个图是vue构建后dist目录的文件&#xff0c;这里面包含了各种开发环境所需要的vue文件 一、开发环境和生产环境 主要分为带有prod和不带prod的版本&#xff1b; 带有prod为生产环境版本并进行了代码压缩&#xff0c;没有运行中不会有警告、错误等详细的提示信息 不带pr…

《程序员面试金典(第6版)》面试题 02.07. 链表相交(查找节点操作,哈希表,双指针(先走n步法,交替遍历法))

题目描述 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null 。 题目传输门&#xff1a;面试题 02.07. 链表相交 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结…

Python——openpyxl读取Excel表格(读取、单元格修改、单元格加底色)

首先python读取Excel的库有很多&#xff0c;包括xlwings&#xff0c;pandas&#xff0c;xlrd等等&#xff0c;我比较常用的是openpyxl&#xff0c;以及pandas&#xff0c;当然还有喜欢将数据量比较大的Excel转为csv格式再读取。 今天我们用openpyxl来读取excel文件&#xff0c…

【Python爬虫】urllib模块:强大的网络爬虫利器,让你轻松获取万千信息!

前言&#xff1a; Python爬虫是一种获取互联网信息的技术&#xff0c;它可以自动化地从网站上抓取数据并进行处理。Python爬虫的优点在于它可以快速地获取大量数据&#xff0c;并且可以自动化地进行数据处理和分析。在Python爬虫中&#xff0c;urllib模块是一个非常重要的模块&…