一、Java数据类型
Java的数据类型分为两大类:
基本数据类型:包括整数 、 浮点数 、 字符、 布尔 。
引用数据类型:包括类 、 数组 、 接口 。
1、基本数据类型
四类八种基本数据类型:
Java中的默认类型:整数类型是 int 、浮点类型是double 。
2、基本数据类型的包装类
Java提供了两个类型系统,基本类型与引用类型,使用基本类型在于效率,然而很多情况,会创建对象使用,因为对象可以做更多的功能,如果想要我们的基本类型像对象一样操作,就可以使用基本类型对应的包装类,如下:
3、装箱与拆箱
基本类型与对应的包装类对象之间,来回转换的过程称为”装箱“与”拆箱“:
-
-
拆箱:从包装类对象转换为对应的基本类型。
用Integer与 int为例:
基本数值---->包装对象
Integer i = new Integer(4);//使用构造函数函数 Integer iii = Integer.valueOf(4);//使用包装类中的valueOf方法
包装对象---->基本数值
int num = i.intValue();
由于我们经常要做基本类型与包装类之间的转换,从Java 5(JDK 1.5)开始,基本类型与包装类的装箱、拆箱动作可以自动完成。例如:
Integer i = 4;//自动装箱。相当于Integer i = Integer.valueOf(4); i = i + 5;//等号右边:将i对象转成基本数值(自动拆箱) i.intValue() + 5; //加法运算完成后,再次装箱,把基本数值转成对象。
二、MySQL 的数据类型
1、常使用的数据类型如下
2、mysql中boolean类型设置
/**
* 字典项状态("0":禁用 “1”:启用)
*/
@Column(name = "status")private Boolean status;
数据库设计时,采用int类型,如下:
由于数据库为int类型,Java实体类该属性可以设计为Integer类型,但是由于该字段只有两种情况:启用和禁用,故我们可以将该属性设计为Boolean类型。我们在查找记录是,该字段应使用true或false
Example dictEntryExample = new Example(DictEntry.class);
dictEntryExample.orderBy("sortNo").asc();
Example.Criteria criteria = dictEntryExample.createCriteria();
if (StringUtils.isNotBlank(dict.getDictTypeId())) {
criteria.andEqualTo("dictTypeId", dict.getDictTypeId());
}
criteria.andEqualTo("status", true);
List<DictEntry> dictEntries = dictEntryDao.selectByExample(dictEntryExample);
3、int(1)和int(11)有什么区别?
官方解释
其实想知道他们的区别直接看mysql手册即可,这也是最靠谱的办法
int(M): M indicates the maximum display width for integer types.1 在 integer 数据类型中,M 表示最大显示宽度。
原来,在 int(M) 中,M 的值跟 int(M) 所占多少存储空间并无任何关系。int(3)、int(4)、int(8) 在磁盘上都是占用 4 btyes 的存储空间。说白了,除了显示给用户的方式有点不同外,int(M) 跟 int 数据类型是相同的。
我们来新建一张表
CREATE TABLE `test` ( `id` int(1) unsigned NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
test表id为int(1),然后插入int可以表示的最大值4294967295
mysql> INSERT INTO `test` (`id`) VALUES (4294967295); Query OK, 1 row affected (0.00 sec)
我们可以看到是可以插入成功的,而且也是可以保存下来的。所以由此说明int(M)中的M和存储的数据长度是没什么关系的。换句话说int(11)能存储多大的数字,那么int(1)就能存储多大的数字
根据上面的结论int(11)和int(1)表示的数字的范围是一样的,那么设置int(M)中的M的意义是什么呢?其实设置M得和zerofill结合起来才会生效。
我们先看个例子
CREATE TABLE `test` ( `id` int(4) unsigned zerofill NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`) )
注意int(4)后面加了个zerofill,我们先来插入4条数据。
mysql> INSERT INTO `user` (`id`) VALUES (1),(10),(100),(1000); Query OK, 4 rows affected (0.00 sec) Records: 4 Duplicates: 0 Warnings: 0
然后我们来查询下
mysql> select * from test; +------+ | id | +------+ | 0001 | | 0010 | | 0100 | | 1000 | +------+ 4 rows in set (0.00 sec)
通过数据可以发现 int(4) + zerofill实现了不足4位补0的现象,单单int(4)是没有用的。而且对于0001这种,底层存储的还是1,只是在展示的会补0。
总结:int(M)中的M并不能表示数字的长度,int(M)得和zerofill配合使用,才有效果,简单说就是零填充的作用。
长整型:
由于bigint类型和long类型都是8个字节,故在数据库建表的时候,类型用bigint,长度为19。后台用Long类型来接收。而当后台是Long类型时,由于前端只能保留17位,后两位前端会用00补充,会丢失精度。解决办法参考:https://www.cnblogs.com/zwh0910/p/15104277.html
三、Oracle数据类型