目录
2,javaType与jdbcType的对应,jdbctyep与Oracle、MySql,数据类型对应列表
数据库日期类型:
一,Oracle:
类型 | 存储 | 说明 | Mybatis JdbcType |
DATE | 年月日时分秒,固定存储7字节 | 可以保存日期和时间,常用日期处理都可以采用这种类型 | DATE |
timestamp | timestamp除了存储年月日时分秒,还有小数秒,小数秒默认6位,可指定0-9,timestamp(6)表示秒的小数点后面可以存储6位,后面还带有时区,是timestamp with time zone。 | TIMESTAMP | |
interval year to month | 存储年-月的时间间隔,通过year_precision来指定年的精度 | interval '1' year时间间隔是1年;interval '14' month时间间隔是14个月;interval '0-5' year to month时间间隔是0年5个月;interval '123' year(3) to month时间间隔123年,精度为3位。 | |
interval day to sesond | 存储天-秒的时间间隔 | interval '3' day时间间隔是3天;interval '2' hour时间间隔是2个小时;interval '123 2:25:45.12' day(3) to second(2)时间间隔是123天零2小时25分钟45.12秒,天的精度是3位,秒的精度是2位。 |
ORACLE 的时间类型date和TIMESTAMP 进度不同。
注意日期的加减处理:
1,在Oracle中,date类型可以直接进行加减天数,而加减月份要用add_months函数
2,TIMESTAMP日期类型如果与数值进行加减运算会自动转换为DATE型,也就是说小数秒会自动去除
DATE类型:
1,其展示格式既可以为:YYYY/MM/DD,也可以为YYYY/MM/DD HH24:MI:SS
,2,其存储格式只有一种:YYYY/MM/DD HH24:MI:SS
3,即,date类型的值在数据库图形界面中可以有不同的显示格式(具体的显示格式由工具设置决定),但其实际储存的格式只有一种
4,当你只存年月日时,date实际存储的是:年月日0时0分0秒,在plsql中,其展示格式为:YYYY/MM/DD
timestamp类型:
1, timestamp简称时间戳。时间戳可以存储世纪、4位年、月、日、时(以24小时格式)、分、秒。与DATE类型相比,时间戳具有以下优点:
⑴时间戳可以存储秒的小数位
⑵时间戳可以存储时区
2、TIMESTAMP数据类型,它包括了所有DATE数据类型的年月日时分秒的信息,而且包括了小数秒的信息。如果想把DATE类型转换成TIMESTAMP类型,就使用CAST函数
二,MYSQL
类型 | 存储 | 说明 | Mybatis JdbcType |
DATE | 日期:年、月、日 ‘YYYY-MM-DD’ '1000-01-01' to '9999-12-31' | java.sql.Date | DATE |
DATETIME | 来表示年、月、日、时、分、秒 ‘YYYY-MM-DD hh:mm:ss’' 1000-01-01 00:00:00.000000' to '9999-12-31 23:59:59.9999 | java.time.LocalDateTime | TIMESTAMP |
TIMESTAMP[(M)] | 带时区的年、月、日、时、分、秒 ‘YYYY-MM-DD hh:mm:ss’' 1970-01-01 00:00:01.000000' UTC to '2038-01-19 03:14:07.999999' UTC | java.sql.Timestamp | TIMESTAMP |
TIME | 时间:时分秒 ‘hh:mm:ss’ '-838:59:59' to '838:59:59' | java.sql.Time | TIME |
YEAR[(2|4)] | 年 :YYYY或YY 1901 to 2155 |
mysql常用类型:
DATE类型:
DATE类型表示日期,没有时间部分,格式为YYYY-MM-DD,其中,YYYY表示年份,MM表示月份,DD表示日期。需要3个字节的存储空间。在向DATE类型的字段插入数据时,同样需要满足一定的格式条件。
使用CURRENT_DATE()或者NOW()函数,会插入当前系统的日期。
DATETIME类型:
DATETIME类型在所有的日期时间类型中占用的存储空间最大,总共需要8个字节的存储空间。在格式上为DATE类型和TIME类型的组合,可以表示为YYYY-MM-DD HH:MM:SS,其中YYYY表示年份,MM表示月份,DD表示日期,HH表示小时,MM表示分钟,SS表示秒。
使用函数CURRENT_TIMESTAMP()和NOW(),可以向DATETIME类型的字段插入系统的当前日期和时间。
TIME类型
TIME类型用来表示时间,不包含日期部分。在MySQL中,需要3个字节的存储空间来存储TIME类型的数据,可以使用“HH:MM:SS”格式来表示TIME类型,其中,HH表示小时,MM表示分钟,SS表示秒。
使用CURRENT_TIME()或者NOW(),会插入当前系统的时间。
TIMESTAMP类型
TIMESTAMP类型也可以表示日期时间,其显示格式与DATETIME类型相同,都是YYYY-MM-DD HH:MM:SS,需要4个字节的存储空间。但是TIMESTAMP存储的时间范围比DATETIME要小很多,只能存储“1970-01-01 00:00:01 UTC”到“2038-01-19 03:14:07 UTC”之间的时间。其中,UTC表示世界统一时间,也叫作世界标准时间。
存储数据的时候需要对当前时间所在的时区进行转换,查询数据的时候再将时间转换回当前的时区。因此,使用TIMESTAMP存储的同一个时间值,在不同的时区查询时会显示不同的时间。
PS: TIMESTAMP和DATETIME的区别:
1,TIMESTAMP和时区有关。TIMESTAMP会根据用户的时区不同,显示不同的结果。而DATETIME则只能反映出插入时当地的时区,其他时区的人查看数据必然会有误差的,
2,TIMESTAMP存储空间比较小,表示的日期时间范围也比较小,
3,底层存储方式不同,TIMESTAMP底层存储的是毫秒值,距离1970-1-1 0:0:0 0毫秒的毫秒值。
4,两个日期比较大小或日期计算时,TIMESTAMP更方便、更快。
三,OB
OceanBase : 国产数据库,公司现阶段在进行转切OB数据库
OB为兼容现有主流模式,分为Mysql与 Oracle数据库模式:
1,mysql : 日期时间数据类型直接兼容现有mysql数据库模式
2,Oracle : 对于oracle模式,不能进行完全兼容,在使用mybatis开发过程中会有少许差别。
类型 | 存储 | 说明 | Mybatis JdbcType |
DATE | 存储日期和时间信息,精确到秒,不带时区。 | 注意实际设置的值是时分秒,还是年月日 | DATE |
TIMESTAMP | DATE 数据类型的扩展,精确到纳秒,不带时区。 | TIMESTAMP | |
TIMESTAMP WITH TIME ZONE | DATE 数据类型的扩展,精确到纳秒,带时区信息。 | ||
TIMESTAMP WITH LOCAL TIME ZONE | 带有本地时区的 TIMESTAMP,存储数据库时区。 |
DATE类型:
1, 遇到问题,使用mybatis进行开发,jdbcType = DATE, DO对应字段为java.util.Date,字段设置值为 new Date()当前时间,则字段对应值为2022-11-12 16:25:44 ,
mybatis会进行转换为 java.sql.Date,即为2022-11-12
落入数据库实际值会有差异,oracle则是mybatis转换后2022-11-12 ,OB则是实际入库值:2022-11-12 16:25:44 。
则需要开发人员进行在入库前的日期处理部分明确,只需要日期还是需要还是需要时间,不要将日部分处理完全交由mybtis或者数据库日期类型。
2, 关于jdbcType = TIME,mybatis会进行转换为 java.sql.Time,即为 16:25:44,当数据库是DATE类型时,无论是OB还是ORACLE,数据库是否支持,和实际入库值均与使用的数据库驱动版本有关,暂时遇见两种问题类型,a,类型不符,b,日期部分为1970-01-01日期其实值。
故不是确定需要时分秒,慎重使用 jdbcType = TIME,慎重使用,javatype:java.sql.time ;
mybatis:JdbcType
1,jdbcType的作用
数据库列字段的类型,且不同数据库的类型也不同,Java源码是采用枚举来定义这些数据类型:
public enum JDBCType implements SQLType {
TINYINT(Types.TINYINT),
SMALLINT(Types.SMALLINT),
INTEGER(Types.INTEGER)
}
作用:在mybatis进行执行sql时,会进行将自动将Java类型转换成数据库的类型,当为指定jdbcType时,在insert等场景又传入null,在进行类型转换时,无法确定改转换成何种类型,视不同的数据库类型,可能会出行报错,故mybatis要求在进行增删改时,空值必须指定jdbcType类型。参考官网描述:
在大部分时候,我们不需要指定 jdbcType,因为 MyBatis 足够智能地可以辨别出对象的类型。但是如果你传过来的参数是一个 HashMap,其中一个参数是空的,MyBatis 将不能通过 HashMap 来决定对象的类型。因为 HashMap 是一个通用的容器并且如果它本身是空的话,将不会携带任何的类型信息。所以最好的做法是,当值是空的时候去指定它的 jdbcType,这样在之后转换为 db 实现的时候就不会再引起任何问题了。
2,javaType与jdbcType的对应,jdbctyep与Oracle、MySql,数据类型对应列表
对应关系:
Java Type | JDBC Type | mysql | oracle |
String | CHAR | CHAR | CHAR |
String | VARCHAR | ||
String | LONGVARCHAR | ||
java.math.BigDecimal | NUMERIC | ||
java.math.BigDecimal | DECIMAL | DECIMAL | DECIMAL |
boolean | BIT | BIT | |
boolean | BOOLEAN | ||
byte | TINYINT | ||
short | SMALLINT | ||
INTEGER | INTEGER | INTEGER | INTEGER |
long | BIGINT | ||
float | REAL | ||
double | FLOAT | FLOAT | FLOAT |
double | DOUBLE | DOUBLE | NUMBER |
byte[] | BINARY | ||
byte[] | VARBINARY | ||
byte[] | LONGVARBINARY | VARCHAR | LONG |
java.sql.Date | DATE | DATE | DATE |
java.sql.Time | TIME | TIME | |
java.sql.Timestamp | TIMESTAMP | TIMESTAMP/DATETIME | TIMESTAMP |
Clob | CLOB | CLOB | CLOB |
Blob | BLOB | BLOB | BLOB |
Array | ARRAY |
有歧义,可一起讨论。
java的时间类型区别:
参考:java中几个时间的区别(java.sql.date,java.sql.time,java.sql.Timestamp)_圆圆的汤汤圆圆的博客-CSDN博客_java sql.time