【问题】
晚上上线,代码更新后,生产环境出问题,订单无法提交。报错如下:
nested exception is org.apache.ibatis.builder.BuilderException: Error resolving JdbcType. Cause: java.lang.IllegalArgumentException: No enum constant org.apache.ibatis.type.JdbcType.LONG 1
错误很明显,mybatis提示没有LONG这个类型,但自己并没有修改过xml文件啊。
找到本次提交的代码文件,发现同事改了一个xml文件,确实加了一段代码,如下:
<if test="uplusCustomerId != null"> and uplus_customer_id = #{uplusCustomerId,jdbcType=LONG} </if> 123
【原因】
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 TypeJAVA TypeCHARStringVARCHARStringLONGVARCHARStringNUMERICjava.math.BigDecimalDECIMALjava.math.BigDecimalBITbooleanBOOLEANbooleanTINYINTbyteSMALLINTshortINTEGERintBIGINTlongREALfloatFLOATdoubleDOUBLEdoubleBINARYbyte[]VARBINARYbyte[]LONGVARBINARYbyte[]DATEjava.sql.DateTIMEjava.sql.TimeTIMESTAMPjava.sql.TimestampCLOBClobBLOBBlob