mybatis什么时候必须指定jdbcType

mybatis什么时候必须指定jdbcType 

#{property, jdbcType=VARCHAR}
如果一个列允许 null 值,并且会传递值 null 的参数,就必须要指定 JDBC Type

如果是一个可以为null的字段,在insert的时候,没有给该字段赋值,mybatis就会报下面的错误

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{property='__frch_item_0.defaultValue', mode=IN, javaType=class java.lang.String, jdbcType=null, numericScale=null, resultMapId='null', jdbcTypeName='null', expression='null'}. Cause: org.apache.ibatis.type.TypeException: Error setting null for parameter #6 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:77)

Caused by: org.apache.ibatis.type.TypeException: Error setting null for parameter #6 with JdbcType OTHER . Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. Cause: java.sql.SQLException: 无效的列类型: 1111
	at org.apache.ibatis.type.BaseTypeHandler.setParameter(BaseTypeHandler.java:47)
	at org.apache.ibatis.scripting.defaults.DefaultParameterHandler.setParameters(DefaultParameterHandler.java:87)
	... 54 more
Caused by: java.sql.SQLException: 无效的列类型: 1111

Mybatis中 javaType 和 jdbcType 对应关系

JDBCType            JavaType
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

Mybatis JdbcType与Oracle、MySql数据类型对

MybatisJdbcTypeOracleMySql
JdbcTypeARRAY  
JdbcTypeBIGINT BIGINT
JdbcTypeBINARY  
JdbcTypeBIT BIT
JdbcTypeBLOBBLOBBLOB
JdbcTypeBOOLEAN  
JdbcTypeCHARCHARCHAR
JdbcTypeCLOBCLOBTEXT
JdbcTypeCURSOR  
JdbcTypeDATEDATEDATE
JdbcTypeDECIMALDECIMALDECIMAL
JdbcTypeDOUBLENUMBERDOUBLE
JdbcTypeFLOATFLOATFLOAT
JdbcTypeINTEGERINTEGERINTEGER
JdbcTypeLONGVARBINARY  
JdbcTypeLONGVARCHARLONG VARCHAR 
JdbcTypeNCHARNCHAR 
JdbcTypeNCLOBNCLOB 
JdbcTypeNULL  
JdbcTypeNUMERICNUMERIC/NUMBERNUMERIC/
JdbcTypeNVARCHAR  
JdbcTypeOTHER  
JdbcTypeREALREALREAL
JdbcTypeSMALLINTSMALLINTSMALLINT
JdbcTypeSTRUCT  
JdbcTypeTIME TIME
JdbcTypeTIMESTAMPTIMESTAMPTIMESTAMP/DATETIME
JdbcTypeTINYINT TINYINT
JdbcTypeUNDEFINED  
JdbcTypeVARBINARY  
JdbcTypeVARCHARVARCHARVARCHAR
### MyBatis 中 `JdbcType` 的用法 在 MyBatis 映射文件中,`JdbcType` 是用于指定 Java 类型和数据库 JDBC 类型之间转换的关键属性。当处理可能为空的结果集字段时,设置 `JdbcType` 可以帮助防止潜在的异常。 #### 基本概念 MyBatis 使用 `JdbcType` 来定义如何将 SQL 查询结果中的列映射到 Java 对象的属性上。对于某些特定类型的字段(如日期、布尔值),显式声明 `JdbcType` 能够提高数据一致性和可靠性[^1]。 #### 配置方式 可以通过 XML 或者注解的方式配置 `JdbcType`: - **XML 方式** ```xml <resultMap id="userResultMap" type="User"> <id property="id" column="USER_ID" jdbcType="INTEGER"/> <result property="name" column="USERNAME" jdbcType="VARCHAR"/> </resultMap> ``` 在这个例子中,`jdbcType` 属性指定了每一列对应的 JDBC 数据类型,这有助于确保即使遇到 NULL 值也能正确解析并赋给相应的对象属性。 - **注解方式** ```java @Results({ @Result(property = "id", column = "USER_ID", jdbcType=JdbcType.INTEGER), @Result(property = "name", column = "USERNAME", jdbcType=JdbcType.VARCHAR) }) public List<User> selectUsers(); ``` 这里展示了通过注解来设定 `JdbcType` 的方法,适用于更简洁的应用场景下。 #### 处理空值的情况 为了更好地管理数据库中的 NULL 值,在 resultMap 定义里加入 `nullValue` 和 `typeHandler` 参数是非常有用的实践之一。例如: ```xml <result property="emailVerified" column="EMAIL_VERIFIED" jdbcType="BIT" nullValue="false" typeHandler="org.example.BooleanTypeHandler"/> ``` 这段代码片段说明了怎样利用自定义的 Type Handler 来控制 NULL 到默认值之间的转换逻辑。 #### 批量更新操作注意事项 需要注意的是,当执行批量更新语句时,只有当 ExecutorType 设置为 BATCH 模式时才会生效存储于 JDBC Driver 内部的一系列待提交命令,并可通过调用 flushStatements 方法强制刷新这些缓存的操作[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值