还在 MySQL 中使用枚举?小心有坑~

为什么使用枚举

限定值的取值范围,比如性别(男,女,未知)等。

枚举类型使用陷阱

1.超级不推荐在mysql中设置某一字段类型为enum,但是存的值为数字,比如‘0’,‘1’,‘2’;

  • 解释1: 你会混淆,因为enum可以通过角标取值,但它的角标是从1开始,对于不熟悉这个字段的人这里会出错

  • 解释2: enum类型的字段对于0与‘0’有非常大的区别,如果你是用0当角标做操作,因它没有这个角标,所要会报错;如果你使用‘0’这个值去取枚举值,并做插入操作,你会发现它竟然会成功,但是插入的结果是一个“空”(不是null)

  • 解释3: enum类型对于php等弱语言类型的支持很差,弱语言类型打引号和不打引号的值可能是同一类型,但是对于mysql中enum类型的字段来说,那就不一定是一回事了

结论:总之,不要拿mysql的enum类型取存一些数字;如果你一定要使用这个字段去存数字,请把这个字段定义为int,然后在java代码中使用枚举类做一个对于这个字段值范围的一个限定!(后面有代码)

2.你可能会报这个错——Caused by: java.sql.SQLException: Data truncated for column 'Color' at row 1 ;

原因:

  • Jpa默认使用整数顺序值持久化枚举类型;

  • Mysql中枚举类型Color定义取值的顺序是RED、GREEN、BLUE,因此,当这三个取值持久化到数据库表时,取值分别是0、1、2;

  • 意思就是我们这里存往数据库的数据是0、1、2这样的数字,而不是RED、GREEN、BLUE字符串,但是Mysql数据库中定义的是RED、GREEN、BLUE,并没有其它值所以报错

解决:在entity中使用@Enumerated(EnumType.STRING)标注你的枚举类型属性,如果标注,默认是integer

使用例子

建表语句为

 CREATE TABLE test4 (  id BIGINT UNSIGNED  PRIMARY KEY AUTO_INCREMENT,  brand VARCHAR(255) NOT NULL,  color ENUM('RED','GREEN','BLUE')) ENGINE = InnoDB; 

Java代码中,枚举类

public enum Color {RED,  GREEN,  BLUE  
}

Java代码中,Javabean

@Entity  
@Table(name="test4") 
public class ClothesRight {@Id  @GeneratedValue(strategy = GenerationType.IDENTITY)  private Long id;  @Enumerated(EnumType.STRING)private Color color;  private String brand;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getBrand() {return brand;}public void setBrand(String brand) {this.brand = brand;}public ClothesRight(Long id, Color color, String brand) {super();this.id = id;this.color = color;this.brand = brand;}public Color getColor() {return color;}public void setColor(Color color) {this.color = color;}public ClothesRight() {super();}}

简单使用:

public interface Test4RightRepository extends JpaRepository<ClothesRight, Long>{}
@Autowiredprivate Test4RightRepository t4R;
/*** 使用@Enumrated()标注字段为枚举的数据* 结果 正确插入RED*/@GetMapping(value="/addclothesright")public void GetTest4Right(){List<ClothesRight> entities = new ArrayList<>();ClothesRight clothes = new ClothesRight();  //clothes.setId(1L);clothes.setBrand("佐丹奴");  clothes.setColor(Color.RED); entities.add(clothes);t4R.save(entities);}

结果为:

图片

插入数字例子(不推荐)

建表

CREATE TABLE test5num (  id BIGINT UNSIGNED  PRIMARY KEY AUTO_INCREMENT,  used int(11) DEFAULT NULL COMMENT '0:没用过  1:已用过  2:不能用')ENGINE = InnoDB; 

Java代码为:

@Entity
@Table(name="test5num")
public class Test5Num {@Id@GeneratedValue(strategy=GenerationType.IDENTITY)private Long id;private Used used;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public Used getUsed() {return used;}public void setUsed(Used used) {this.used = used;}public Test5Num() {super();}public Test5Num(Long id, Used used) {super();this.id = id;this.used = used;}}
/**
*枚举类
*/
public enum Used {UNUSED(0,"没用过"),USED(1,"已用过"),FORBIDDEN(2,"不能用");private Integer code;private String discribe;public Integer getCode() {return code;}public String getDiscribe() {return discribe;}private Used(Integer code, String discribe) {this.code = code;this.discribe = discribe;}
}
/*** dao层*/
public interface Test5NumRepository extends JpaRepository<Test5Num, Long>{}
@Autowired
private Test5NumRepository t5N;/*** mysql枚举的字段类型不宜插入数字,但是需求就是要用数字,怎么办?* 解决:mysql数据类型定义为int,枚举限定在java代码中解决* */
@GetMapping("/test5insert")
public void insertT5(){Test5Num t5 = new Test5Num();t5.setUsed(Used.USED);List<Test5Num> list = new ArrayList<Test5Num>();list.add(t5);t5N.save(list);
}

结果:

图片

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

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

相关文章

软考135-上午题-【软件工程】-软件配置管理

备注&#xff1a; 该部分考题内容在教材中找不到。直接背题目 一、配置数据库 配置数据库可以分为以下三类&#xff1a; (1) 开发库 专供开发人员使用&#xff0c;其中的信息可能做频繁修改&#xff0c;对其控制相当宽松 (2) 受控库 在生存期某一阶段工作结束时发布的阶段产…

【算法】深度优先遍历(DFS)算法详解与实现

文章目录 1.算法原理2. 常见的深度优先遍历方式3. 代码实现总结 深度优先遍历&#xff08;DFS&#xff09;是一种常用的树或图的遍历算法&#xff0c;它通过尽可能深地搜索树或图的分支&#xff0c;直到路径上的所有节点都被访问完毕&#xff0c;然后再回溯到上一层&#xff0c…

什么是云渲染?云渲染平台怎么使用?云渲染怎么收费?

什么是云渲染&#xff1f; 云渲染是一种利用云计算技术提供的云端服务&#xff0c;用户可以将本地任务递交到远程服务器上&#xff0c;由远程计算集群协调和完成渲染&#xff0c;并将结果返回本地&#xff0c;最后用户可以在本地下载渲染结果。 而实时云渲染则是云渲染的一种…

P1010 [NOIP1998 普及组] 幂次方

本文由Jzwalliser原创&#xff0c;发布在CSDN平台上&#xff0c;遵循CC 4.0 BY-SA协议。 因此&#xff0c;若需转载/引用本文&#xff0c;请注明作者并附原文链接&#xff0c;且禁止删除/修改本段文字。 违者必究&#xff0c;谢谢配合。 个人主页&#xff1a;blog.csdn.net/jzw…

python入门之简洁安装VS保姆版安装(含虚拟环境)

11、保姆版安装 Anoconda安装&#xff08;python的一个发行版本&#xff09; 优点&#xff1a;集成了许多关于python科学计算的第三方库&#xff0c;保姆级别 下载&#xff1a;www.anaconda.com/download/ 版本默认64位&#xff0c;py37 √&#xff1a;add anaconda to my…

OCP Java17 SE Developers 复习题14

答案 C. Since the question asks about putting data into a structured object, the best class would be one that deserializes the data. Therefore, ObjectInputStream is the best choice, which is option C. ObjectWriter, BufferedStream, and ObjectReader are no…

可视化看板有那么多应用场景,该如何快速搭建?可视化工具该如何选择?

在当今的信息化时代&#xff0c;数据已经成为了现代决策的核心。无论是企业战略规划、运营管理&#xff0c;还是个人生活决策&#xff0c;数据都扮演着至关重要的角色。随着数据分析技术和工具的不断进步&#xff0c;数据在决策中的作用将变得更加突出&#xff0c;对组织和个人…

【Qt】Qt中代替C语言scanf和gets函数的方法

1、图形界面 Qt可以使用图像界面控件获取输入(这不废话吗?) 1)QLineEdit获取单行输入 QLineEdit *lineEdit = new QLineEdit(); // 单行输入框 QString strTextInput = lineEdit->text(); // 获取输入内容2)QTextEdit 获取多行输入框 QTextEdit *textEdit =

代码随想录算法训练营第三十六天|435. 无重叠区间,763.划分字母区间,56. 合并区间

题目&#xff1a;435. 无重叠区间 给定一个区间的集合 intervals &#xff0c;其中 intervals[i] [starti, endi]。返回需要移除区间的最小数量&#xff0c;使剩余区间互不重叠。 题目链接/讲解链接&#xff1a; https://programmercarl.com/0435.%E6%97%A0%E9%87%8D%E5%8F%A0…

功能强大的开源数据中台系统 DataCap 2024.03.3 发布

推荐一套基于 SpringBoot 开发的简单、易用的开源权限管理平台&#xff0c;建议下载使用: https://github.com/devlive-community/authx 推荐一套为 Java 开发人员提供方便易用的 SDK 来与目前提供服务的的 Open AI 进行交互组件&#xff1a;https://github.com/devlive-commun…

密文字段模糊检索方案

代码地址: https://github.com/zuiyu-main/EncryptDemo https://mp.weixin.qq.com/s/cXOg1tiMtJz2eibDZmXHUQ 在个别特殊领域中&#xff0c;数据的安全问题是非常的重要的&#xff0c;所以需要数据库存储的数据是需要加密存储的。所以也就引申出来本文这个问题&#xff0c;加密…

【每日刷题】Day7

【每日刷题】Day7 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 2. 203. 移除链表元素 - 力扣&#xff08;…

重磅!Meta 发布 Llama 3,前所未有的强大功能和多模态能力|TodayAI

Meta今日宣布推出其最新一代尖端开源大型语言模型Llama 3。该模型预计很快将在多个领先的云服务平台上线&#xff0c;包括AWS、Databricks、Google Cloud、Hugging Face、Kaggle、IBM WatsonX、Microsoft Azure、NVIDIA NIM和Snowflake。 Llama 3模型得到了AMD、AWS、Dell、In…

XiaodiSec day020 Learn Note 小迪渗透学习笔记

XiaodiSec day020 Learn Note 小迪渗透学习笔记 记录得比较凌乱&#xff0c;不尽详细 php 缺陷 2024.1.29 00:32 前言 在课程安排上先讲语言缺陷&#xff0c;再讲漏洞 函数缺陷与绕过 CTF 详细点: intval strpos in_array preg_match str_replace 开始 1a 1 1admin …

代码随想录-哈希表 | 1两数之和

代码随想录-哈希表 | 1两数之和 LeetCode 1-两数之和解题思路代码复杂度难点总结 LeetCode 1-两数之和 题目链接 题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那两个整数&#xff0c;并返回它们的数组下标。…

【深度学习】yolov5目标检测学习与调试

2024.4.15 -2024.4.16 完结 0.准备&&补充知识点 yolo检测算法可以实现目标检测、分割和分类任务。 项目仓库地址&#xff1a;https://github.com/ultralytics/yolov5 跟练视频&#xff1a;目标检测 YOLOv5 开源代码项目调试与讲解实战 lux下载视频神器&#xff1a;h…

2W 3KVDC 隔离 稳压单输出 DC/DC 电源模块——TPK-SAR 系列介绍

TPK-SAR系列产品是专门针对PCB上分布式电源系统中需要与输入电源隔离且输出精度要求较高的电源应用场合而设计。该产品适用于&#xff1b;1&#xff09;输入电源的电压变化≤5%&#xff1b;2&#xff09;输入输出之前要求隔离电压≥3000VDC&#xff1b;3&#xff09;对输出电压…

idea新建一个springboot项目

本文分为几个部分&#xff0c; 首先是在idea中新建项目&#xff0c; 然后是配置 项目的目录&#xff08;新建controller、service、dao等&#xff09;&#xff0c; 然后是自定义的一些工具类&#xff08;比如启动后打印地址等&#xff09;。 1.、创建篇 新建项目&#xff0…

Zookeeper和Redis分别实现分布式锁的原理

目录 分布式锁的概述 ZooKeeper实现分布式锁的原理 Redis实现分布式锁的原理 ZooKeeper分布式锁的工具类 Redis分布式锁的工具类 对比 分布式锁的概述 分布式锁是一种在分布式系统中用来同步多个进程对共享资源访问的机制。它可以保证在同一时刻&#xff0c;只有一个进程…

若依OSS如何支持本地上传,保存到服务器本地?

SysOssController改动&#xff1a; GetMapping("/downloadByName/**")public void download(HttpServletRequest request, HttpServletResponse response) throws IOException {String path (String) request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPP…