您的位置:首页 > 数据库 > MySQL

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

2018-01-25 14:27 597 查看
在代码层面上解决由于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;
}
}

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

问题解决!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐