问题说明
最近在工作中有一个业务需求:传入一个时间,和数据库某个时间字段进行运算,返回相差的天数。很简单的一个需求,之前 sql 方面比较菜,都是现将数据查询出来然后在进行计算,刚好最近写了很多的 sql,有所成长,知道可以通过 ceil 函数直接一条 sql 就能查询出我想要的数据,不需要查询出来之后在进行运算。
出现的错误
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'==
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于