Mysql tinyint长度为1时在java中被转化成boolean型(踩坑)

发布时间 2023-04-10 18:00:57作者: 进击的小蔡鸟

资料参考链接1: https://www.cnblogs.com/joeylee/p/3878223.html

资料参考链接2: https://blog.csdn.net/HD243608836/article/details/118197811

背景

踩过两次tinyint的坑img

线上事故

1 污染数据

问题背景

tinyint(1)在java中被转化成boolean型(使用mybatis代码生成器),更新时又通过updateById更新,导致非零的状态全部更新为1

mysql

`order_status` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '0-未支付 1-支付中 2-支付成功 3-退款中 4-已退款',

实体类

private Boolean orderStatus;

ps: 实习期,团队初创

2 类型转换异常

mysql

`subscribe` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否关注'

java代码

实体类字段: private Integer subscribe;

代码如图

image-20230410174305631

ps: 测试环境没有问题,生产环境出现了类型转换异常

原因

Mysql官方参考文档关于布尔类型的说明:

BOOL, BOOLEAN

These types are synonyms(同义词) for TINYINT(1). A value of zero is considered(认为是) false. Nonzero(不为0) values are considered true

解决方法 .

Tinyint(1) 就只用来保存 bool 值 只有0和1 不要保存其他的值, 对应的java的实体类用boolean接受

如果要保存多的值,就用 Tinyint(4) 这样的,那么到了Ef中这个 类型会变成 sbyte ,这个就是一个整形 .java用Integer接受

备注:sbyte:存储8位带符号整数。sbyte中的s代表带符号(signed),意味着变量可为正值或负值。sbyte变量的最小可能值为-128,最大可能值为127。