您的位置:首页 > 其它

Mybatis:使用bean传值,当传入值为Null时,提示“无效的列类型”的解决办法

2017-06-13 00:00 501 查看
摘要: 在使用mybatis对数据库执行更新操作时,parameterType为某个具体的bean,而bean中传入的参数为null时,异常

问题描述:
在使用mybatis对数据库执行更新操作时,parameterType为某个具体的bean,而bean中传入的参数为null时,抛出异常如下:

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: Could not set parameters
for mapping: ParameterMapping{property=‘pxh‘, mode=IN, javaType=class java.lang.Long, jdbcType=null, numericScale=null, resultMapId=‘null‘,
jdbcTypeName=‘null‘, expression=‘null‘}.
Cause: org.apache.ibatis.type.TypeException: Error setting null for parameter #5 with JdbcType OTHER .
Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property.
Cause: java.sql.SQLException: 无效的列类型: 1111
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:76)

mapper文件中代码如下:

<update id="update" parameterType="com.hsoft.mss.xtgl.model.Bean">
update table
<set>
pxh  = #{pxh},    // 当pxh传入null时,抛出上述异常,pxh在bean中的类型为Long
time = sysdate
</set>
where id = #{id}
</update>

解决办法一:

经过对代码分析,是由于未指定传入参数pxh的类型,当mybatis接收到null时,无法将其正确的进行解析,进而导致上述异常。

将mapper中代码修改如下:

<update id="update" parameterType="com.hsoft.mss.xtgl.model.Bean">
update table
<set>
pxh  = #{pxh,jdbcType=NUMERIC}, //将pxh的类型指定为NUMERIC即可
time = sysdate
</set>
where id = #{id,jdbcType=VARCHAR}
</update>

解决办法二:

在配置文件mybatis-config.xml中加入如下代码:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
...
<settings>
<setting name="jdbcTypeForNull" value="NULL" />
</settings>
...
</configuration>

这样,即使传入参数为null,mybatis也能够将其转换成正确的数据类型,并进行存储操作。

附:常见的Jdbc Type 与 Java Type之间的关系

|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|
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  MyBatis
相关文章推荐