自定义 MyBatis 通用枚举类型解析器 在使用MyBatis的过程中,我们经常会使用到枚举类型的数据, 一般在保存数据时只是想将枚举类型的code值存入到数据库中,查询时希望能自动根据code值映射出对应的枚举对象出现 接下来,怎么将自定义的枚举类型处理器用于处理所有枚举类型的数据? 4. { public void customize(Configuration configuration) { // 将自定义的通用枚举类型处理器`MyBatisEnumTypeHandler 获取所有需要注册到通用枚举类型处理器中的枚举类 1. 过滤出需要处理的枚举类后,通过`TypeHandlerRegistry`将当前枚举类型使用通用的枚举类型处理器注册到类型处理器中 4.
通用枚举 为什么需要枚举类 类的对象只有有限个,确定的。举例如下: 星期:Monday(星期一)、...... 当我们使用Java中的枚举类型作为实体类的属性时,如果想要将枚举类型属性的值映射到数据库中以便于查询和存储,就需要使用@EnumValue注解来定义枚举类中具体的映射值。 不过我们对于枚举类型都给了对应的int的值,所以这里我们只需要进行一个配置,就可以将枚举类型作为数字插入到数据库中,为属性gender,添加上@EnumValue注解 【5】修改枚举类 public 字段类型处理器 为什么需要字段类型处理器 在某些场景下,我们在实体类中是使用Map集合作为属性接收前端传递过来的数据的,但是这些数据存储在数据库时,我们使用的是json格式的数据进行存储,json 那怎么做到实体类的Map类型和数据库的varchar类型的互相转换,这里就需要使用到字段类型处理器来完成。
throws SQLException { // TODO Auto-generated method stub //需要根据从数据库中拿到的枚举的状态码返回一个枚举对象 存储的是自己定义的枚举类型中的code。 --2、也可以在处理某个字段的时候告诉MyBatis用什么类型处理器 保存:#{empStatus,typeHandler=xxxx} 查询
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
在和前端开发对接接口过程中经常发现需要一些枚举类的字典参数,虽然可以通过swagger在线文档给前端开发,不过可以直接返回枚举的编码和字典值就可以更直观,所以在项目里怎么实现? 可以通过Mybatis的一些接口,自定义枚举类的处理器实现 环境准备 开发环境 JDK 1.8 SpringBoot2.2.1 Maven 3.2+ 开发工具 IntelliJ IDEA smartGit enumConstants) { if (t.getName().equals(name)) return t; } return null; } } 自定义类型转换器 自定义Mybatis的类型转换器类,继承BaseTypeHandler,里面有几个需要实现的方法 void setNonNullParameter(PreparedStatement ps, int null : EnumUtils.codeOf(this.type , code); } } yaml配置类型处理器 在application.yml里配置default-enum-type-handler
>, T>一个是枚举类自身,一个是枚举的key的类型。 通用类型处理器的设计 // 所有的自定义类型处理器都需要实现TypeHandler或者继承BaseTypeHandler类。 Student { /** * 性别 */ private SexEnum sexEnum; //省略getter,setter方法 } 如上,定义一个通用的类型处理器来处理枚举还是比较方便的 然后在通用类型处理器GeneralEnumHandler中类名上添加如下注解即可 // 该包名是枚举类下的包名路径 @MappedTypes(basePackage = {"com.jay.chapter3 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 这个时候再去查询,返回的结果就直接是我们在枚举类型中定义的
) { 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定义的标识符比较,枚举有类型检查,更加严谨。 ⑤枚举常量是遵循作用域规则的,枚举声明在函数内,只能在函数内使用。
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合并,可以将匿名枚举类型声明为自定义类型
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 联合类型的定义 联合也是一种特殊的自定义类型 这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。
原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访 问。 总体来说: 结构体的内存对齐是拿空间来换取时间的做法。 {}中的内容是枚举类型的可能取值,也叫 枚举常量 。 这些可能取值都是有值的,默认从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 注解,完成了自动映射,这使得在查询数据库的时候 例如我们在 Excel 的性别字段中填写数字 1 表示的是枚举类型的性别 男 ,但是 EasyExcel 会认为要把数字类型的 1 转化为 枚举类型 GenderType,这样就会报错。 GenderType.WOMEN; } } /** * 将从数据库中查到的数据转换为 Excel 展示的数据 * * @param value 枚举对象 ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception { // 将枚举类型按照
自定义类型:结构体,枚举,联合 1. 枚举 3.1 枚举的使用: 3.2 枚举的优点: 4. 联合(共用体) 4.1 联合类型的定义 4.2 联合的特点 4.3 联合大小的计算 5. 总结: 1. 原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。 联合(共用体) 4.1 联合类型的定义 联合也是一种特殊的自定义类型。 这种类型定义的变量也包含一系列的成员,特征是这些成员共用同一块空间(所以联合也叫共用体)。 总结: 通过以上的对自定义类型的详解,可以让我们根据实际情况和具体的需求来节省空间和时间上的消耗,从而获得最大的效益。好了,本篇文章的分享到此结束了,码字不易,你们的支持将是我坚持的不竭动力。
---- 编者按 我记得之前看过专门介绍各种PU List的文章,最大的感受是:处理器类型很多很多,从APU到ZPU,26个字母都已经被用光了。 ---- 1 不同处理器类型的分类和协同 我目前有个基本的思考框架,来把各种PU进行划分:系统是由分层分块的模块组成的,这样我们可以大致上把系统分为三部分,如上图所示。 不管叫什么PU,逃不开这四个类型。 2 场景特点:综合、通用以及资源预备 许多AI芯片或系统落地面临的一个主要问题是“我好不容易做了一盘饺子,可用户需要的是一桌菜肴”。 不管名称具体叫什么,这个处理器,一定是基于多种处理引擎混合的(超异构计算)、面向宏系统场景的(MSOC,Micro-SOC)、数据驱动的(DPU,Data Processing),一个全新的处理器类型。 如下表格为超异构处理器和传统SOC的对比: 5 超异构处理器,是否可以极致性能的同时,还足够“通用”? 每一种处理器(引擎)都有其优势,也都有其劣势: CPU非常通用,能够干几乎所有事情。
一一《古诗十九首》 在项目开发中,经常数据库中的一个字段对应一个枚举 对于这些枚举,我们要使用数据库将他们的值映射起来 MybatisPlus为我们提供了优雅的解决方案 只需要配置中添加枚举处理器 ,开启通用枚举支持 mybatis-plus: #指定Mybatis的Mapper文件 mapper-locations: classpath:mappers/*xml #指定Mybatis configuration: # 开启mybatis日志 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 开启通用枚举支持 ordinalType default-enum-type-handler: org.apache.ibatis.type.EnumOrdinalTypeHandler 然后如果是对于一些简单的枚举 ; import lombok.AllArgsConstructor; import lombok.Getter; /** * 性别枚举 * * @author <achao1441470436
这个时候我们需要自定义类型转换器。 二、自定义类型处理器 实现TypeHandler接口或者继承BaseTypehandler TypeHandler是一个接口,它定义了如下四个方法,实现类必须去实现,方法如下: void setParameter ) { e.printStackTrace(); } } return result; } } 配置注册自定义处理器 --自定义类型处理器--> <typeHandlers> <typeHandler handler="com.mdd.mybatis.typehandle.MyTypeHandle "></typeHandler> </typeHandlers> 使用自定义处理器(mapper文件) <?
import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
枚举类型的声明 枚举顾名思义就是⼀⼀列举 把可能的取值⼀⼀列举 比如:一周的星期一到星期日是有限的7天,可以⼀⼀列举 enum Day //星期 { Mon, Tues, ,我再用这个枚举类型创建一个变量叫做“s” 那现在我们枚举里面的值打印出来看一下 #include<stdio.h> enum Day { Mon,Tues,Wed,Thur,Fri, Thur); printf("%zd\n", Fri); printf("%zd\n", Sat); printf("%zd\n", Sun); return 0; } 枚举类型的优点 增加代码的可读性和可维护性 和#define定义的标识符⽐较枚举有类型检查,更加严谨 便于调试,预处理阶段会删除 #define 定义的符号 使用方便,一次可以定义多个常量 枚举常量是遵循作用域规则的 ,枚举声明在函数内,只能在函数内使用 枚举类型的使用 enum Color //颜色 { RED=1, GREEN=2, BLUE=4 enum Co }; int main