" javaType="com.gong.mybatis.bean.EmpStatus"/> <! throws SQLException { // TODO Auto-generated method stub //需要根据从数据库中拿到的枚举的状态码返回一个枚举对象 ; import com.gong.mybatis.bean.Employee; import com.gong.mybatis.dao.EmployeeMapper; import com.gong.mybatis.mapper.EmployeeMapperDynamicSql 存储的是自己定义的枚举类型中的code。 --2、也可以在处理某个字段的时候告诉MyBatis用什么类型处理器 保存:#{empStatus,typeHandler=xxxx} 查询
自定义 MyBatis 通用枚举类型解析器 在使用MyBatis的过程中,我们经常会使用到枚举类型的数据, 一般在保存数据时只是想将枚举类型的code值存入到数据库中,查询时希望能自动根据code值映射出对应的枚举对象出现 自定义枚举类型处理器MyBatisEnumTypeHandler.java 继承自org.apache.ibatis.type.BaseTypeHandler,用于处理枚举类型数据的保存和查询使用 @Slf4j 接下来,怎么将自定义的枚举类型处理器用于处理所有枚举类型的数据? 4. 获取所有需要注册到通用枚举类型处理器中的枚举类 1. 过滤出需要处理的枚举类后,通过`TypeHandlerRegistry`将当前枚举类型使用通用的枚举类型处理器注册到类型处理器中 4.
EmpStatus empStatus=EmpStatus.LOGOUT; private Department dept; EmpStatus.java package com.gong.mybatis.bean ; import com.gong.mybatis.bean.Employee; import com.gong.mybatis.dao.EmployeeMapper; import com.gong.mybatis.mapper.EmployeeMapperDynamicSql BaseJdbcLogger.java:145) DEBUG 01-23 15:27:43,472 <== Updates: 1 (BaseJdbcLogger.java:145) 保存成功:9 数据库中: 插入的是枚举类型的值 我们也可以在mybatis全局配置文件中处理枚举类型的Handler: <typeHandlers> <typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler " javaType="com.gong.<em>mybatis</em>.bean.EmpStatus"/> </typeHandlers> 再进行测试,输出结果为: DEBUG 01-23
可以通过Mybatis的一些接口,自定义枚举类的处理器实现 环境准备 开发环境 JDK 1.8 SpringBoot2.2.1 Maven 3.2+ 开发工具 IntelliJ IDEA smartGit 写一个枚举工具类,根据code和name返回对应枚举类,根据反射获取getEnumConstants,循环匹配 package com.example.springboot.mybatis.common.enumhandler 自定义Mybatis的类型转换器类,继承BaseTypeHandler,里面有几个需要实现的方法 void setNonNullParameter(PreparedStatement ps, int null : EnumUtils.codeOf(this.type , code); } } yaml配置类型处理器 在application.yml里配置default-enum-type-handler ,加上自定义的MybatisEnumCodeTypeHandler mybatis: # 指定sql映射文件位置 mapper-locations: classpath:mybatis/
这个时候我们需要自定义类型转换器。 二、自定义类型处理器 实现TypeHandler接口或者继承BaseTypehandler TypeHandler是一个接口,它定义了如下四个方法,实现类必须去实现,方法如下: void setParameter 三、案例(自定义敏感字段加解密处理器) MyTypeHandler实现TypeHandler接口 package com.mdd.mybatis.typehandle; import com.mdd.mybatis.util.DESUtil --自定义类型处理器--> <typeHandlers> <typeHandler handler="com.mdd.<em>mybatis</em>.typehandle.MyTypeHandle "></typeHandler> </typeHandlers> 使用自定义处理器(mapper文件) <?
MyBatis自带的EnumTypeHandler转换为文字保存在数据库,EnumOrdinalTypeHandler使用的是序号,它们的一致性都可能被轻易地破坏,所以最好的办法是自定义一个int类型 自定义公共父接口 package com.tenmao.utils.mybatis; import java.util.Arrays; import java.util.Optional; public " /> </bean> 自定义枚举 package com.tenmao.utils.model; import com.tenmao.utils.mybatis.CodedEnum; public getCode() { return code; } } ps: 参考资料写得特别好,我之所以重新写了一下,是资料写得有点啰嗦,比如子类的注册,其实都是自动的,不需要再额外配置 自定义枚举系列 自定义枚举 --- Gson转换 自定义枚举 --- Swagger文档展示 参考 如何在MyBatis中优雅的使用枚举
Mybatis之类型处理器 无论是MyBatis在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型,下表描述了一些默认的类型处理器. Type 任何兼容的 NUMERIC 或 DOUBLE 类型,存储枚举的序数值(而不是名称)。 注意:使用上述的类型处理器将会覆盖已经存在的处理 Java 的 Boolean 类型属性和 NUMERIC 参数及结果的类型处理器。 要注意 MyBatis 不会通过窥探数据库元信息来决定使用哪种类型,所以你必须在参数和结果映射中指明那是 NUMERIC 类型的字段, 以使其能够绑定到正确的类型处理器上。
B站(乐哥聊编程)、西瓜(乐哥聊编程) 有完整配套视频,免费观看 背景 当项目中的实体 包含了另外一个实体,并且想要将包含的实体当作字段存入数据库,这个时候就需要类型处理器了。 虽然MyBatisPlus给我们提供了默认的处理器,将数据作为json存入字段,但是只处理了单个实体的存入和读取,并没有处理集合数据的读取反射,所以这节课就带大家怎么去处理集合数据从单个字段中进行读取映射 使用默认的处理器处理单实体 实体修改 /** *
* *
*autoResultMap = true * @author 乐哥聊编程 * @since 2022-07 permission)) .build(); manageUserServiceImpl.save(manageUser); } 查看数据库 读取数据(不用自定义处理器 ) 读取数据(使用自定义处理器) 成长心路 | 优质书单 | 面试资料 牛人故事 | 前沿技术 | 视频教程@EnumValue @EnumValue是Mybatis Plus框架中的一个注解,用于指定枚举类型属性在数据库中的映射值。 当我们使用Java中的枚举类型作为实体类的属性时,如果想要将枚举类型属性的值映射到数据库中以便于查询和存储,就需要使用@EnumValue注解来定义枚举类中具体的映射值。 不过我们对于枚举类型都给了对应的int的值,所以这里我们只需要进行一个配置,就可以将枚举类型作为数字插入到数据库中,为属性gender,添加上@EnumValue注解 【5】修改枚举类 public 字段类型处理器 为什么需要字段类型处理器 在某些场景下,我们在实体类中是使用Map集合作为属性接收前端传递过来的数据的,但是这些数据存储在数据库时,我们使用的是json格式的数据进行存储,json 那怎么做到实体类的Map类型和数据库的varchar类型的互相转换,这里就需要使用到字段类型处理器来完成。
) { int ret = check_sys(); if (ret == 1) printf("小端\n"); else printf("大端\n"); return 0; } 二、枚举类型 1.枚举类型的声明 枚举就是一一列举,把可能的值一一列举。 /星期 { Mon, Tues, Wed, Thur, Fri, Sat, Sun }; enum Color//颜⾊ { RED, GREEN, BLUE }; { }中的内容是枚举类型可能的取值 这些可能取值都是有值的,默认从0开始,当然在声明枚举类型时也可以赋值。 2.枚举类型的优点 ①增加代码的可读性和可维护性。 ②和#define定义的标识符比较,枚举有类型检查,更加严谨。 ⑤枚举常量是遵循作用域规则的,枚举声明在函数内,只能在函数内使用。
——王小波 我们clone下来mybatis-plus官方示例项目: https://gitee.com/baomidou/mybatis-plus-samples.git 首先看文档: JSON 必须开启映射注解 * * @TableName(autoResultMap = true) * * 以下两种类型处理器,二选一 也可以同时存在 * 选择对应的 JSON 处理器也必须存在对应 JSON 解析依赖包 */ @TableField(typeHandler = JacksonTypeHandler.class) 注解,然后再指定typeHandler 打开示例项目,可以看到确实如此 并且我们数据库表里的数据wallets字段为json 我们运行测试类测试一下: 得到的结果也是完美映射 可以看到我们这里也能自定义转换器 import com.baomidou.mybatisplus.samples.typehandler.entity.Wallet; import java.util.List; /** * 自定义复杂类型处理器
01 自定义类型 通过用户自定义类型,简化了verilog代码量并实现更多功能;用户自定义类型使得代码的可读性更强; 通过typedef来创建用户自定义类型; 通过enmu来创建枚举类型; 通过struct typedef int unsigned unit;//定义新类型unit unit a,b;//unit自定义类型unit声明的2个变量 注意:为了代码可读性,通常添加“_t”后缀表示它是一个自定义类型 ; end endmodule 02 枚举类型 枚举类型(enum)可以描述变量的合法值范围,其每一个值都需要提供一个用户自定义的名字; 如枚举类型 IC可以拥有ICer1,ICer2,ICer3.. [1:0] {WAITE,LOAD,READY} state; 自定义枚举类型 如果枚举类型变量被赋值,那么所赋的值应在其数值范围。 {ON=1’b1,OFF=1’b z} out; 如果枚举类型并没有伴随着typedef,那么该枚举类型指的是匿名枚举类型;此时变量名应伴随其后; 将typedef与enum合并,可以将匿名枚举类型声明为自定义类型
>, T>一个是枚举类自身,一个是枚举的key的类型。 通用类型处理器的设计 // 所有的自定义类型处理器都需要实现TypeHandler或者继承BaseTypeHandler类。 然后在通用类型处理器GeneralEnumHandler中类名上添加如下注解即可 // 该包名是枚举类下的包名路径 @MappedTypes(basePackage = {"com.jay.chapter3 >> javaTypeClass : mTypes) { // 注册枚举类以及其所使用的类型处理器 register(javaTypeClass,typeHandlerClass class 对象 获取该包下所有满足条件的class对象 循环注册枚举类以及其所使用的类型处理器。 IOException e) { e.printStackTrace(); } } 测试结果如下: 总结 本文通过一个小小的demo 示范了如果如何自定义类型处理器
在 Mybatis-Plus 中我们可以使用枚举类型来完成这一操作,他能自动将数据库里的字段映射成我们需要的字段,例如性别,新建枚举类如下: @Getter public enum GenderType 关键点: @EnumValue:标注哪一个字段是数据库里的字段; @JsonValue:标注要开启自定义序列化返回值; toString:具体的返回值; 同时我们需要在与数据库关联的实体类中修改类型,将性别字段改为枚举类型 */ private String name; /** * 性别 */ private GenderType gender; } 在配置文件中配置扫描注解类型 : #mybatis-plus 配置 mybatis-plus: type-enums-package: com.demo.test.enums 这个时候再去查询,返回的结果就直接是我们在枚举类型中定义的
2.1--枚举类型的声明 枚举顾名思义就是列举,把可能的取值都列举出来。 ,{ }中的内容是枚举类型的可能取值,也叫枚举常量。 往期回顾: 【自定义类型-结构体】--结构体类型,结构体变量的创建和初始化,结构体内存对齐,结构体传参,结构体实现位段 【数据在内存中的存储】--整数在内存中的存储,大小端字节序和字节序判断,浮点数在内存中的存储 【C语言内存函数】--memcpy和memmove的使用和模拟实现,memset函数的使用,memcmp函数的使用 结语:本篇文章就到此结束了,继前面一篇文章后,在此篇文章中给大家分享了自定义类型中的联合体类型 ,联合体大小的计算,枚举类型,枚举类型的使用等知识点,后续会继续给分享其它内容,如果文章对你有帮助的话,欢迎评论,点赞,收藏加关注,感谢大家的支持。
前言 本文介绍自定义类型中的枚举 一、枚举 枚举,通俗来讲就是一一列举 要注意枚举的枚举常量是有限个数 例如,三原色:红黄蓝;性别:男、女、保密;…… 二、定义与声明 #define _CRT_SECURE_NO_WARNINGS , 一般默认第一个枚举常量的值是0,后面的每一个枚举常量的值都是给前一个的值加一; 如果给第一个枚举常量进行赋值,则后面的枚举常量也会随之变化,规则也是加一。 三、枚举的优点 1.增加了代码的可读性和可维护性 例如:之前编写的小游戏主菜单就可以用枚举来将switch选择中的0、1、2进行替换,更方便阅读。 】 ②枚举类型由类型检查更加严谨(C语言中体现不多,但是C++会体现); 【只能拿枚举常量给枚举变量赋值才不会出现类型差异】 ③使用更方便,一次可以定义多个变量,用define就得一个一个定义。 ---- 总结 本文主要介绍了自定义类型中的结构体类型的相关知识,希望这篇文章对你理解结构体有所帮助。
的时候我们也可以自定义编写所需的自定义函数,那类型呢? ---- 一、自定义类型是什么,主要有哪些? 自定义类型主要用于程序员面对众多需求时,需要将一些特殊的对象封装、命名或重定义,以达到更好的分类与标准化的统一管理。 比较常见的自定义类型主要分为3种:结构体、枚举、联合。 二、探窥自定义类型 1.结构体(struct) 1.1 结构的基础知识 结构是一些值的集合,这些值称为成员变量。 原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。(如果对齐了访问一次就行) 总体来说: 结构体的内存对齐是拿空间来换取时间的做法。 联合(共用体) 4.1 联合类型的定义 联合也是一种特殊的自定义类型 这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。
类型处理器简单点说就是用于处理javaType与jdbcType之间类型转换用的处理器,MyBatis针对诸多Java类型与数据库类型进行了匹配处理。 第一种:JDBC_TYPE_HANDLER_MAP,这是一个枚举Map集合,其内部是以JdbcType枚举类中枚举值为键创建的一种集合,这种集合先天存在键(枚举值),它是以数据库类型为键来保存类型处理器 而MyBatis还提供了自定义类型处理器的功能,也就是说在该类中还提供了对外的自定义类型处理器注册入口。 这个扫描器针对的就是我们自定义的类型处理器进行注册,这个入口方法会在构建Configuration配置类时由XMLConfigBuilder进行调用,用于将用户自定义的类型处理器注册到注册器中。 但是为了使其能在MyBatis中发挥作用,我们要将其注册到类型处理器注册器中。
原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访 问。 总体来说: 结构体的内存对齐是拿空间来换取时间的做法。 {}中的内容是枚举类型的可能取值,也叫 枚举常量 。 这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值。 枚举的优点: 1. 增加代码的可读性和可维护性 2. 和#define定义的标识符比较枚举有类型检查,更加严谨。 3. 便于调试 4. Color clr = GREEN;//只能拿枚举常量给枚举变量赋值,才不会出现类型的差异。 联合(共用体) 4.1 联合类型的定义 联合也是一种特殊的自定义类型 这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。
问题描述 现在需要使用 EasyExcel 的报表导入导出功能,一般的字段都没有问题,但是由于系统使用了 Spring Boot + Mybatis Plus 的枚举类型映射功能,所以类似于 性别 的字段 @ExcelProperty(value = "性别(0:女,1:男)") private GenderType gender; 其中的枚举类使用了 @EnumValue 注解,完成了自动映射,这使得在查询数据库的时候 ,我们和数据库交互的工具 Mybatis Plus 可以自动帮我们完成类型的封装和拆解;但是我们和 Excel 交互的工具 EasyExcel 默认并不具备这个功能,需要我们自己完成拆解和封装。 例如我们在 Excel 的性别字段中填写数字 1 表示的是枚举类型的性别 男 ,但是 EasyExcel 会认为要把数字类型的 1 转化为 枚举类型 GenderType,这样就会报错。 ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception { // 将枚举类型按照