MyBatis 处理 MySQL 时间类型 date 、datetime、timestamp

MyBatis 处理 MySQL 时间类型 date 、datetime、timestamp

1、引入问题

近日有群成员提出一个问题:数据库是date类型,MyBatis传入timestamp类型参数,但是查询结果为 0 。如下所示:

 
  • Preparing: select * from t_plan where begin_date = ?
  • Parameters: 2018-06-15 00:00:00.0(Timestamp)
  • Total: 0

可是,通过数据库管理工具可以查出数据,sql 如下所示:

 
  • select * from t_plan where begin_date = date("2018-06-15")

分析如下:

数据库的字段是date类型,前者通过mybatis传入timestamp类型参数,后者的sql语句采用的date类型。类型不同是不能进行等于比较的,2018年6月15日 不等于 2018年6月15日XX小时XX分XX秒,只能是前者包含后者关系。

2、mysql的时间类型与java的时间类型

mysql所支持的日期时间类型有:DATETIME、TIMESTAMP、DATE、TIME、YEAR,如下所示:

java所支持的时间类型为:java.sql.Date、java.sql.Time、java.sql.Timestamp。

3、MyBatis处理日期有两种的jdbcType

(1)jdbcType=DATE
(2)jdbcType=TIMESTAMP

备注:此时的DATE指的是java.sql.Date,不是java.util.Date,要注意两者的区别。同理,TIMESTAMP指的是java.sql.Timestamp。

4、java.util.Date 和 java.sql.Date介绍

Java中有两个Date类,一个是java.util.Date,通常情况下用它获取当前时间,另一个是java.sql.Date,是针对SQL语句使用的,它只包含日期而没有时间部分。两个类型的时间可以相互转化。

当我们使用java.util.Date作为实体的日期类型时,实际上是能够表示MySQL的三种字段类型:

(1)date
(2)datetime
(3)timestamp

5、MyBatis时间处理方式

在实际开发过程中,如果我们将java.util.Date当做参数传递给Mapper的时候,需要指定jdbctype。

(1)假如我们不指定jdbcType,那么这个日期会自动转化会MySQL的timestamp,例子如下:

 
  • Preparing: select * from t_plan where begin_date = ?
  • Parameters: 2018-06-15 00:00:00.0(Timestamp)
  • Total: 0

(2)指定jdbcType=TIMESTAMP结果同上。
(3)指定jdbcType=DATE,那么MyBatis会将传入参数截取为2018-06-15,变成Date类型

6、总结

使用java.util.Date作为参数传递给Mapper时,不管MySQL的日期字段类型是date、datetime或者timestamp中的哪一种,默认缺省情况下,MyBatis都能够自动做出类型转换,可以直接使用 =、>、<、>=、<=符号来进行筛选。

但是,当我们手动指定jdbcType=DATE的时候,MyBatis会自动截取掉时间,只保留日期。如果MySQL的日期字段类型是datetime或者timestamp一定不要这么写,否则属于画蛇添足,自讨没趣。

 

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL中的DateTimeDate是两种不同的数据类型DateTime表示日期和时间,而Date只表示日期部分。 如果你想通过传入格式为Date类型的参数查询DateTime类型的数据,你需要对类型进行转换。可以使用MySQLDATE_FORMAT函数将DateTime类型转换为指定格式的字符串。在你提供的引用\[1\]中的示例中,使用了DATE_FORMAT函数将alter_date字段转换为'%Y-%m-%d'格式的字符串。 另外,引用\[2\]中提到了MySQL中的TIMESTAMP数据类型,它表示格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总毫秒数。与DateTime不同,TIMESTAMP是以时间戳的形式存储的。 如果你想将DateTime类型的数据转换为Date类型,可以使用MySQLDATE函数。DATE函数可以提取DateTime类型的日期部分,返回一个Date类型的结果。 总结起来,如果你想在MySQL中将DateTime类型的数据转换为Date类型,可以使用DATE函数。 #### 引用[.reference_title] - *1* *3* [mybatis中对mysqlDateTime类型转换为Date](https://blog.csdn.net/AntKengElephant/article/details/105954355)[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^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [MySQL实现SQL中datetime类型转换成date类型](https://blog.csdn.net/WY_cat/article/details/102612976)[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^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值