Mysql tinyint长度为1时在java中被转化成boolean型(踩坑)
资料参考链接1:
https://www.cnblogs.com/joeylee/p/3878223.html
资料参考链接2:
https://blog.csdn.net/HD243608836/article/details/118197811
背景
踩过两次tinyint的坑
线上事故
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;
代码如图
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) 这样的,这个 类型会变成 sbyte ,这个就是一个整形 .java用Integer接受
备注:sbyte:存储8位带符号整数。sbyte中的s代表带符号(signed),意味着变量可为正值或负值。sbyte变量的最小可能值为-128,最大可能值为127。