数据库日期时间类型,maybatis:JdbcType,java:时间类型

目录

数据库日期类型:

一,Oracle:

二,MYSQL

三,OB

mybatis:JdbcType

1,jdbcType的作用

2,javaType与jdbcType的对应,jdbctyep与Oracle、MySql,数据类型对应列表

java的时间类型区别:


数据库日期类型:

一,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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Caused by: java.sql.SQLException: 无效的列类型: 1111是一个数据库错误,表示在执行数据库操作时,尝试使用了无效的列类型 1111。这个错误通常是由于数据库中的列类型与代码中定义的列类型不匹配导致的。具体来说,可能是数据库中的列类型与代码中的映射类型不一致,或者是数据库中的列类型被修改或删除了。 要解决这个问题,可以尝试以下几种方法: 1. 检查代码中定义的列类型数据库中实际的列类型是否一致。确保它们之间的映射关系正确无误。 2. 检查数据库表结构是否发生了变化。如果数据库中的列类型被修改或删除了,需要相应地更新代码中的映射关系。 3. 检查数据库连接和驱动是否正确。确保使用的数据库连接和驱动与代码中的数据库操作兼容。 4. 如果以上方法都没有解决问题,可以尝试修改代码中的JdbcType设置。根据错误提示,尝试设置不同的JdbcType类型来适配数据库中的列类型。 总之,Caused by: java.sql.SQLException: 无效的列类型: 1111是一个数据库错误,通常是由于数据库中的列类型与代码中的映射关系不匹配导致的。通过检查代码和数据库表结构,以及适配JdbcType类型,可以解决这个问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Cause: java.sql.SQLException: 无效的列类型: 1111解决](https://blog.csdn.net/zhou_438/article/details/83476905)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [java.sql.SQLException: Invalid column type: 1111](https://blog.csdn.net/duzhe1991/article/details/126441988)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值