由Mybatis的时间类型计算报错引出的jdbcType

Published on with 1,073 views

问题说明

最近在工作中有一个业务需求:传入一个时间,和数据库某个时间字段进行运算,返回相差的天数。很简单的一个需求,之前sql方面比较菜,都是现将数据查询出来然后在进行计算,刚好最近写了很多的sql,有所成长,知道可以通过ceil函数直接一条sql就能查询出我想要的数据,不需要查询出来之后在进行运算。

oracle 两个时间相减

出现的错误

sql和代码都写好之后,测试报错: ==ORA-00932: 数据类型不一致==
然后检查数据库字段类型,检查参数类型,都是Date类型。这个时候有点蒙圈

问题原因

最后一想,既然类型一致,那么在传参的时候传的是什么类型呢?查看mybatis sql日志。sql日志第二行,参数后面的类型显示为:timestamp。就想到了在传参的时候就指定参数类型,也就是jdbcType。设置了jdbcType=DATE之后问题就解决了。

下面是在网上找的jdbcType关系说明

JDBC Type           Java Type  
CHAR                String  
VARCHAR             String  
LONGVARCHAR         String  
NUMERIC             java.math.BigDecimal  
DECIMAL             java.math.BigDecimal  
BIT                 boolean  
BOOLEAN             boolean  
TINYINT             byte  
SMALLINT            short  
INTEGER             int  
BIGINT              long  
REAL                float  
FLOAT               double  
DOUBLE              double  
BINARY              byte[]  
VARBINARY           byte[]  
LONGVARBINARY       byte[]  
DATE                java.sql.Date  
TIME                java.sql.Time  
TIMESTAMP           java.sql.Timestamp  
CLOB                Clob  
BLOB                Blob  
ARRAY               Array  
DISTINCT            mapping of underlying type  
STRUCT              Struct  
REF                 Ref  
DATALINK            java.net.URL[color=red][/color]  

jdbcType的作用

问题解决之后,想着之前基本上没怎么设置过jdbcType,然后抱着学习的想法,在网上查找资料,了解一下具体作用。

MyBatis JdbcType 介绍
记自己在mybatis中设置jdbcType的一个坑
Mybatis中的jdbcType的作用

简单来说就是:当执行mapper文件的时候,参数映射为空,那么无法确定他的具体类型,这个时候就需要jdbcType来确定类型。

一个额外的发现

使用Navicat Premiun12运行sql的时候,如果A字段类型是varchar。下面的sql在Navicat Premiun12是可以成功运行的:
==select * from Table where A =1==
但是该语句如果放在mapper当中的话必须加上引号:
==select * from Table where A ='1'==


标题:由Mybatis的时间类型计算报错引出的jdbcType
作者:hjljy
地址:https://www.aliuying.com/articles/2019/06/04/1559619216198.html

Responses
取消