首页 > 数据库 >Mybatis XML文件中,对java.util.Date对象的值到转换为执行SQL进行比较所做的隐式行为分析。

Mybatis XML文件中,对java.util.Date对象的值到转换为执行SQL进行比较所做的隐式行为分析。

时间:2024-06-21 11:09:35浏览次数:25  
标签:XML java Timestamp setTimestamp DATETIME sql com 隐式

本次分析了mybatis的mapper XML文件,sql的where子句中使用java.util.Date进行比较进行分析。

假设使用的是以下sql语句。

select * from xxx where create_time > '2024-06-20 20:38:38'

在mybatis中,会将java.util.Date对象的值转为java.sql.Timestamp,之后在mybatis取值的时候,会调用java.sql.Timestamp.toString()方法获取字符串值(也就是'2024-06-20 20:38:38')。
带有日期对比字符串的sql通过jdbc传到MySQL服务器端,此时,mysql会怎么处理这种对比呢?答案就是**字符串会隐式的转换create_time 值所代表的MySQL类型,之后进行对比。


分析只关注核心位置,不对整个流程进行分析(你断点此位置一般就能看到)。

下面就着重分析**Mybatis的XML文件,对java.util.Date类型的处理方式是怎样的?

首先进入到org.apache.ibatis.type.DateTypeHandler#setNonNullParameter方法,这里没什么说明的。

org.apache.ibatis.logging.jdbc.PreparedStatementLogger#invoke方法中,
我们会看到SET_METHODS方法是个Set集合。
SET_METHODS方法的值列表
核心位置

经过debug,我们会进到org.apache.ibatis.logging.jdbc.BaseJdbcLogger类的位置。

getParameterValueString方法用于打印输出值和值的类型。


这一行是关键语句return method.invoke(statement, params);
接着进入这行代码,会执行到com.alibaba.druid.pool.DruidPooledPreparedStatement#setTimestamp(int, java.sql.Timestamp)

在debug进入 stmt.setTimestamp(parameterIndex, x);


会到com.alibaba.druid.proxy.jdbc.PreparedStatementProxyImpl#setTimestamp(int, java.sql.Timestamp)方法位置处,这里的选中这一行chain.preparedStatement_setTimestamp(this, parameterIndex, x);是核心,


之后会到com.mysql.cj.jdbc.ClientPreparedStatement#setTimestamp(int, java.sql.Timestamp)方法位置处。


最后会到com.mysql.cj.NativeQueryBindings#setTimestamp,这里就是给PreparedStatement对象的sql占位符绑定值得位置了。
可以看到,到最后这个值还是java.sql.Timestamp类型的。

至于PreparedStatement之后怎么处理我觉的就可以不用关注了,因为PreparedStatement配套的提供了setTimestamp方法,就说明内部已有支持的转换方式,而且MySQL驱动本身自身也支持setTimestamp。

MySQL官方文档的对于DATETIME和TIMESTAMP类型进行对比的资料。

https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html

https://dev.mysql.com/doc/refman/8.0/en/type-conversion.html

如果其中一个参数是 TIMESTAMP 或 DATETIME 列,而另一个参数是常量,那么在进行比较之前,会将常量转换为时间戳。这样做是为了对 ODBC 更友好。但 IN() 的参数不会这样做。为了安全起见,在进行比较时应始终使用完整的日期时间、日期或时间字符串。例如,在使用带有日期或时间值的 BETWEEN 时,为了获得最佳结果,应使用 CAST() 将值明确转换为所需的数据类型。

来自一个或多个表的单行子查询不视为常量。例如,如果子查询返回一个要与 DATETIME 值比较的整数,那么比较将以两个整数的形式进行。整数不会转换为时间值。要将操作数作为 DATETIME 值进行比较,请使用 CAST() 将子查询值显式转换为 DATETIME 值。

其他资料

MySQL关于日期格式化的相关函数。
CAST转换类型
The DATE, DATETIME, and TIMESTAMP Types

标签:XML,java,Timestamp,setTimestamp,DATETIME,sql,com,隐式
From: https://www.cnblogs.com/XingXiaoMeng/p/18260161

相关文章

  • 「Java开发指南」如何使用Spring注释器实现Spring控制器?(二)
    本教程将引导您使用SpringAnnotator实现Spring控制器,标准Java类被添加到搭建项目中,SpringAnnotatorSpring启用Java类。虽然本教程的重点是Spring控制器,但是SpringAnnotator也可以用于Spring服务、组件和存储库。在本教程中,您将学习如何:创建一个Java类将类配置为Spring控制......
  • Flink报错 java.lang.IllegalArgumentException: too many arguments
    错误信息/Library/Java/JavaVirtualMachines/zulu-21.jdk/Contents/Home/bin/java-javaagent:/Users/liuyu/Applications/IntelliJIDEAUltimate.app/Contents/lib/idea_rt.jar=51748:/Users/liuyu/Applications/IntelliJIDEAUltimate.app/Contents/bin-Dfile.encoding=UTF-......
  • Java基础入门day68
    day68maven简介maven字面意思是知识的积累,是项目对象模型的一个项目管理工具,可以用来实现项目的构建,打包,编译,运行等功能可以很好的实现项目与代码的分离依赖jar包版本升级也会更加方便新建的maven项目结构:pom.xml:用来设置当前项目的jar包,管理,项目间的继承与依赖下载......
  • Java 消息队列详解
    什么是消息队列?消息队列是一种通过存储消息来实现系统间通信的中间件。消息生产者将消息发送到队列中,消息消费者从队列中取出并处理消息。这种模式实现了生产者和消费者的解耦,即使它们不同时在线,也可以通过消息队列进行通信。消息队列的关键概念消息(Message):传递的数据单......
  • 032java jsp ssm大学生第二课堂成绩单系统学生思想道德技术修养文体活动管理(源码+数据
     项目技术:SSM+Maven等等组成,B/S模式+Maven管理等等。环境需要1.运行环境:最好是javajdk1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;3.tomcat环境:Tomcat7.x,8.x,9.x版本均可4.硬件环境:windows7/8/101G......
  • 026java jsp ssm网络硬盘系统网站系统(源码+数据库+文档)
     项目技术:SSM+Maven等等组成,B/S模式+Maven管理等等。环境需要1.运行环境:最好是javajdk1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;3.tomcat环境:Tomcat7.x,8.x,9.x版本均可4.硬件环境:windows7/8/101G......
  • 027java jsp ssm洗衣店管理系统(源码+数据库+文档)
     项目技术:SSM+Maven等等组成,B/S模式+Maven管理等等。环境需要1.运行环境:最好是javajdk1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;3.tomcat环境:Tomcat7.x,8.x,9.x版本均可4.硬件环境:windows7/8/101G......
  • 023java jsp ssm学校园教室管理系统(源码+数据库+文档)
     项目技术:SSM+Maven等等组成,B/S模式+Maven管理等等。环境需要1.运行环境:最好是javajdk1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;3.tomcat环境:Tomcat7.x,8.x,9.x版本均可4.硬件环境:windows7/8/101G......
  • java httpsession
    bychatgpt=>HttpSessionHttpSession是JavaServletAPI提供的一个接口,用于管理与单个用户相关的会话信息。会话(session)是在服务器端保存的与客户端用户交互的一系列请求和响应之间的状态信息。以下是HttpSession的详细解释:HttpSession的作用HttpSession用于在用户的多......
  • java读取wps嵌入式图片思路
     这个只写了思路具体代码在文章最后,不想了解得直接去拿代码了解Excel数据结构    Excel文件格式后缀xls,xlsx其实是一个压缩文件,是由多个文件夹以及xml文件组合为一个文件,xml文件记录了Excel得内容以及样式等信息。加入在桌面新建一个xlsx文件,然后插入一个嵌入......