在代码层面上解决由于Java用有符号数值类型映射MySQL无符号数值类型而导致的数值溢出问题

35 篇文章 1 订阅
28 篇文章 0 订阅
在代码层面上解决由于Java用有符号数值类型映射MySQL无符号数值类型而导致的数值溢出问题。

如果MySQL数据库中定义一个无符号的数值类型字段,这样在Java中如果用工具生成实体类时,会自动使用一个比特位数相同的有符号数值类型属性映射了这个字段,所以数值范围减半,偏离了设计逻辑。

比如给User表定义一个年龄字段age,类型是无符号的TINYINT(定义有符号的不合逻辑),在Java中用工具生成User表的实体类后,对应的年龄属性被定义成一个Byte类型。

public class User {
    private Long id;
    private String name;
    private Byte age;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Byte getAge() {
        return age;
    }

    public void setAge(Byte age) {
        this.age = age;
    }
}
尽管Byte与数据库的TINYINT比特位数相同,但是Byte是有符号的,所以正数范围减半了。
那么怎么解决这个问题呢?很多人首先想到的是修改数据库,定一个大点的数值类型,比如定义成INT。个人认为不建议这么做,原因有三:
1. 年龄数值范围0~255足够用,如果定义成大类型,一方面不合逻辑(不需要那么大的数值范围),另一方面占用存储空间(别小觑多了三个字节,积小成多,量大就惊人了!)。
2. 坚持逻辑设计原则,出现问题,如果不是因为数据库设计不合理而引起的,那就不要在数据库上打主意,因为数据库是根基,根基怎能随便乱动!
3. 即使修改了数据库,改为一个大的数值类型,还是要修改Java代码,修改实体类对应的属性类型以及相关联的代码。
基于上述三个原因,不修改数据,能不能只在代码层面上解决这个问题呢?
答案是肯定的,而且很简单,只需把age属性类型改为Integer即可,如下:

public class User {
    private Long id;
    private String name;
    private Integer age;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

在实际工程中已经检验通过,包括前端提交数据、写数据库、从数据库读取数据在前端显示,都正常。

问题解决!



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值