【问题】
晚上上线,代码更新后,生产环境出问题,订单无法提交。报错如下:
nested exception is org.apache.ibatis.builder.BuilderException: Error resolving JdbcType. Cause: java.lang.IllegalArgumentException: No enum constant org.apache.ibatis.type.JdbcType.LONG
错误很明显,mybatis提示没有LONG这个类型,但自己并没有修改过xml文件啊。
找到本次提交的代码文件,发现同事改了一个xml文件,确实加了一段代码,如下:
<if test="uplusCustomerId != null">
and uplus_customer_id = #{uplusCustomerId,jdbcType=LONG}
</if>
【原因】
Mybatis所支持的jdbcType类型,是固定的,枚举如下:
BIT、 FLOAT、CHAR、TIMESTAMP、OTHER、 UNDEFINED、TINYINT、REAL、VARCHAR、BINARY、BLOB、 NVARCHAR、SMALLINT、DOUBLE、LONGVARCHAR、VARBINARY、CLOB、NCHAR、INTEGER、NUMERIC、DATE、LONGVARBINARY、BOOLEAN 、NCLOB、BIGINT、DECIMAL、TIME、NULL、CURSOR
其中并没有LONG这个类型,LONG对应的类型应该是BIGINT,所以将上述代码类型改为BIGINT问题就解决了。
注意:在书写jabcType类型的时候,是有严格的大小写的区分的,否则会抛出上面的异常,即mybatis所定义的类型常量枚举不存在。
【总结】
下面附上一张数据库类型与Java类型对应表:
| DB 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 |
本文详细解析了在使用Mybatis框架时遇到的因错误使用JdbcType.LONG导致的异常问题,阐述了正确的类型映射及注意事项。
1752





