MySQL中的字段类型对应于Java对象中的数据类型

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 还在纠结javaType和jdbcType?MySQL数据类型对应Java什么类型?JdbcType类型和Java对象有什么对应关系?数据库类型的Integer是对应int还是对应Integer?本文带你一探究竟!

  我在网上也搜过很多,就是想知道在数据库中的建表语句的字段类型对应Java实体类中属性的类型是什么。

  结果网上一套一套的说法不一,完全不一致,有没有一致点的,不会错的!看我,你就有。

  于是我就无聊到用mybatis-generator插件一一生成对应关系,插件根据数据库建表语句自动生成Java实体类对象。现在开发都是自动生成实体类,我这里也生成后记录一下。

给出数据库图形界面,方便大家理解我在做什么
在这里插入图片描述

sql如下

CREATE TABLE `testtype` (
  `int_type` int unsigned DEFAULT NULL,
  `int_unsigned` int NOT NULL,
  `bigint_unsigned20` bigint DEFAULT NULL,
  `bigint_unsigned255` bigint DEFAULT NULL,
  `big_int` bigint DEFAULT NULL,
  `big_int_255` bigint DEFAULT NULL,
  `varchar` varchar(255) DEFAULT NULL,
  `bit` bit(20) DEFAULT NULL,
  `bit_64` bit(64) DEFAULT NULL,
  `tiny_int` tinyint DEFAULT NULL,
  `tiny_int_unsigned` tinyint unsigned DEFAULT NULL,
  `small_int` smallint DEFAULT NULL,
  `small_int_unsigned` smallint DEFAULT NULL,
  `binary` binary(255) DEFAULT NULL,
  `blob` blob,
  `char_utf8` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `char_utf8mb4` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  `char_utf8gbk` char(255) CHARACTER SET gbk COLLATE gbk_chinese_ci DEFAULT NULL,
  `date` date DEFAULT NULL,
  `datetime` datetime DEFAULT NULL,
  `timestamp` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  `float_type` float DEFAULT NULL,
  `float_unsigned` float unsigned DEFAULT NULL,
  `decimal` decimal(10,0) DEFAULT NULL,
  `numeric` decimal(10,0) DEFAULT NULL,
  `double_type` double DEFAULT NULL,
  `double_unsigned` double unsigned DEFAULT NULL,
  `integer_type` int DEFAULT NULL,
  `integer_unsigned` int unsigned DEFAULT NULL,
  `text` text,
  `time` time DEFAULT NULL,
  `tinytext` tinytext,
  `year` year DEFAULT NULL,
  `enum_type` enum('1','red') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  PRIMARY KEY (`int_unsigned`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

生成的Java实体类对象如下(篇幅原因,我删掉自动生成的gettersetter):

public class testType {
   
    private Integer intUnsigned;
    private Integer intType;
    private Long bigintUnsigned20;
    private Long bigintUnsigned255;
    private Long bigInt;
    private Long bigInt255;
    private String varchar;
    private byte[] bit;
    private byte[] bit64;
    private Byte tinyInt;
    private Byte tinyIntUnsigned;
    private Short smallInt;
    private Short smallIntUnsigned;
    private String charUtf8;
    private String charUtf8mb4;
    private String charUtf8gbk;
    private Date date;
    private Date datetime;
    private Date timestamp;
    private Float floatType;
    private Float floatUnsigned;
    private Long decimal;
    private Long numeric;
    private Double doubleType;
    private Double doubleUnsigned;
    private Integer integerType;
    private Integer integerUnsigned;
    private Date time;
    private String tinytext;
    private Date year;
    private String enumType;
}

表我给大家列出来了,帅的人已经点赞、关注、收藏一键三连了,谁偷看一下就溜走?后续有补充,就不重复前面例子里面的类型了,直接看下表就行

MySQL数据类型 Java实体类属性类型 说明
int Integer 不管是signed还是unsigned,Java实体类型都是Integer
bigint Long 不管是bigint(xxx)括号多少位,不管signed还是unsigned,Java实体类型都是Long
bit byte[] -
tinyint Byte 不管是signed还是unsigned,Java实体类型都是Byte,在java.lang包下
smallint Short 不管是signed还是unsigned,Java实体类型都是Short
char String 不管char是gbk、utf8、utf8mb4等编码类型,Java实体类型都是String
varchar String 不管char是gbk、utf8、utf8mb4等编码类型,Java实体类型都是String
longvarchar String 不管char是gbk、utf8、utf8mb4等编码类型,Java实体类型都是String
date Date java.util.Date
datetime Date java.util.Date
timestamp Date java.util.Date
time Date java.util.Date
float Float 不管是signed还是unsigned,Java实体类型都是Float
decimal Long -
numeric Long -
double Double 不管是signed还是unsigned,Java实体类型都是Double
tinytext String -
text String -
year Date java.util.Date
enum String -

  有些类型插件没有自动转换过来,我就不列举,这里就列举常用的并且插件能转换过来的,这肯定是对的没错。

  实际的映射关系仍然取决于数据库和驱动程序的支持情况以及项目需求,比如NUMERICDECIMAL 映射为 java.math.BigDecimal 类型也是对的

后续设计表规范内容:

1.从8.0.17版本开始,TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT类型的显示宽度将失效。比如bigint(20),如果用navicat直接保存长度20,最终在建表语句被保存为bigint,长度会失效。
2.自增字段类型必须是整型而且必须是unsigned,推荐int或者bigint,并且自增字段必须是主键或者主键的一部分,我个人写物理主键id一般就是bigint unsigned
3.手机号使用varchar(20),不要使用整数。
4.对于精确浮点型数据存储,需要使用decimal,严禁使用floatdouble
5.如无特殊需要,禁止开发人员使用blob
6.日期类型字段不能使用varchar或者char,只能使用datedatetime字段类型存放。
7.所有只需要精确到天的字段全部使用date类型,而不应该使用timestamp或者datetime类型。
8.所有需要精确到时分秒的字段均使用datetime,不要使用timestamp类型,timestamp2038年就过期了。
9.不建议使用enumset类型,使用tinyint替代。
10.仅仅只有单个字符的字段用char(1),比如性别字段。
11.按照规范,每个列定义的时候必须加上comments,我上面举例子偷懒了所以没写。
12.数据库的字符集只能选择utf8mb4,如果需要导出,也需要显式选择utf8mb4作为导出格式。



欢迎一键三连~



有问题请留言,大家一起探讨学习



----------------------Talk is cheap, show me the code-----------------------

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
29天前
|
安全 Java 编译器
Java对象一定分配在堆上吗?
本文探讨了Java对象的内存分配问题,重点介绍了JVM的逃逸分析技术及其优化策略。逃逸分析能判断对象是否会在作用域外被访问,从而决定对象是否需要分配到堆上。文章详细讲解了栈上分配、标量替换和同步消除三种优化策略,并通过示例代码说明了这些技术的应用场景。
Java对象一定分配在堆上吗?
|
21天前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
43 4
|
19天前
|
存储 消息中间件 NoSQL
使用Java操作Redis数据类型的详解指南
通过使用Jedis库,可以在Java中方便地操作Redis的各种数据类型。本文详细介绍了字符串、哈希、列表、集合和有序集合的基本操作及其对应的Java实现。这些示例展示了如何使用Java与Redis进行交互,为开发高效的Redis客户端应用程序提供了基础。希望本文的指南能帮助您更好地理解和使用Redis,提升应用程序的性能和可靠性。
33 1
|
2月前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
48 17
|
1月前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
2月前
|
SQL Java 关系型数据库
java连接mysql查询数据(基础版,无框架)
【10月更文挑战第12天】该示例展示了如何使用Java通过JDBC连接MySQL数据库并查询数据。首先在项目中引入`mysql-connector-java`依赖,然后通过`JdbcUtil`类中的`main`方法实现数据库连接、执行SQL查询及结果处理,最后关闭相关资源。
|
2月前
|
存储 Java 关系型数据库
[Java]“不同族”基本数据类型间只能“强转”吗?
本文探讨了不同位二进制表示范围的计算方法,重点分析了Java中int和char类型之间的转换规则,以及float与int类型之间的转换特性。通过具体示例说明了显式和隐式转换的条件和限制。
38 0
[Java]“不同族”基本数据类型间只能“强转”吗?
|
2月前
|
存储 Java 数据管理
Java零基础-Java对象详解
【10月更文挑战第7天】Java零基础教学篇,手把手实践教学!
29 6
|
1月前
|
存储 缓存 NoSQL
一篇搞懂!Java对象序列化与反序列化的底层逻辑
本文介绍了Java中的序列化与反序列化,包括基本概念、应用场景、实现方式及注意事项。序列化是将对象转换为字节流,便于存储和传输;反序列化则是将字节流还原为对象。文中详细讲解了实现序列化的步骤,以及常见的反序列化失败原因和最佳实践。通过实例和代码示例,帮助读者更好地理解和应用这一重要技术。
32 0
|
2月前
|
存储 Java 编译器
[Java]基本数据类型与引用类型赋值的底层分析
本文详细分析了Java中不同类型引用的存储方式,包括int、Integer、int[]、Integer[]等,并探讨了byte与其他类型间的转换及String的相关特性。文章通过多个示例解释了引用和对象的存储位置,以及字符串常量池的使用。此外,还对比了String和StringBuilder的性能差异,帮助读者深入理解Java内存管理机制。
21 0