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

news/2024/11/16 20:46:25/

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.ppmy.cn/news/84050.html

相关文章

tpm2-tools中Makefile的关键宏定义

AM_V_CC AM_V_CC $(am__v_CC_$(V)) 可以看到&#xff0c;AM_V_CC实际上分为两个部分&#xff1a;am__v_CC_和V。 am__v_CC_相关定义如下&#xff1a; am__v_CC_ $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) AM_DEFAULT_VERBOSITY 0 am__v_CC_0 echo " CC "…

Eyeshot Fem 2023.1 你选Fem还是Ultimate Crack

Eyeshot Fem--当然选Fem Everything in Ultimate, plus Geometry meshing and Finite Element Analysis. Scope Modules Image Gallery Features Scope Eyeshot Fem edition is designed for Geometry meshing and Finite Element Analysis. Modules Geometric modules includ…

HTTP详细教程与讲解

目录 1. 什么是HTTP&#xff1f; 2. HTTP请求的组成部分是什么&#xff1f; 3. HTTP响应的组成部分是什么&#xff1f; 4. 什么是HTTP方法&#xff1f; 5. HTTP状态码是什么&#xff1f; 6. 什么是HTTP头&#xff1f; 7. 什么是HTTP Cookie&#xff1f; 8. 什么是HTTP缓…

若依框架在未登录的情况下访问swagger3.0页面,出现弹窗的解决方法

若依框架在未登录的情况下访问swagger3.0页面&#xff0c;出现弹窗的解决方法 效果展示&#xff1a; 解决方法&#xff1a;在ShiorConfig.java类中找到shiroFilterFactoryBean方法&#xff0c;然后在filterChainDefinitionMap里面put你要过滤的地址&#xff0c;如下&#xff…

ThingsBoard的Actor模型

0、概述 下面是我从网上查阅资料总结下来的. 1、背景 多线程编程是每个程序员的基本功,同时也是开发中的难点,处理各种“锁”的问题是让人十分头痛的一件事。例如,设计一个转账功能,怎么保证在多线程下能正常运行?你可能会说,这个简单,在进行转账操作前,先对两个账户…

基因注释R包——annotatr介绍

目录 简介安装annotatr包使用annotatr进行注释CpG注释基因注释自定义注释读取基因组区域注释区域 简介 下一代测序实验和生物信息学管道产生的基因组区域在注释基因组特征时更有意义。出现在外显子或增强子中的SNP可能比出现在基因间区域的SNP更令人感兴趣。有趣的是&#xff…

写写shell中数组的处理方式

数组 在Shell中&#xff0c;可以使用数组来存储一组相关的数据。Shell中的数组是一种特殊的变量类型&#xff0c;它可以用于存储多个值。 数组的定义&#xff1a;Shell中的数组可以使用以下语法定义&#xff1a; array_name(value1 value2 ... valuen)其中&#xff0c;array…

yarn的使用、yarn与npm的区别

简介 Yarn与npm一样&#xff0c;都是包管理工具。 但是Yarn比npm更高效&#xff0c;具有包缓存机制&#xff0c;下载过的包&#xff0c;无需再次下载&#xff0c;直接引用。 安装 参考文档&#xff1a;官方文档_安装 因为Node.js默认使用npm作为包管理工具。 有这样一个全…