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

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

问题说明

最近在工作中有一个业务需求:传入一个时间,和数据库某个时间字段进行运算,返回相差的天数。很简单的一个需求,之前 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

    MyBatis 本是 Apache 软件基金会 的一个开源项目 iBatis,2010 年这个项目由 Apache 软件基金会迁移到了 google code,并且改名为 MyBatis ,2013 年 11 月再次迁移到了 GitHub。

    118 引用 • 394 回帖 • 765 关注
回帖   
请输入回帖内容...