Mybatis中的jdbcType的作用
2019独角兽企业重金招聘Python工程师标准>>>
Mybatis中的jdbcType的作用
使用MyBatis框架做更新操作时,在该字段需要更新的内容为空时,就会出现1111错误,也就是无效的列类型,这个时候你就要使用jdbcType。至于什么时候要使用到javaType我还没遇到过,而且我也没有听说过要使用javaType。
前天遇到一个问题 异常显示如下:
引用
Exception in thread "main" org.springframework.jdbc.UncategorizedSQLException: 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
; uncategorized SQLException for SQL []; SQL state [99999]; error code [17004]; 无效的列类型: 1111; nested exception is java.sql.SQLException: 无效的列类型: 1111
对应的sqlmap如下:
Xml代码
- <insert id="insertCustomerLog" parameterType="map">
- insert into customer_log
- (
- ID,
- CUSTOMER_SERVICE_USER_NAME,
- user_name,
- CONTENT,
- LOG_FIRST_TYPE,
- STATUS,
- LINKED_ID,
- FEE,
- ACCOUNT_FIRST_TYPE,
- ACCOUNT_SECOND_TYPE,
- ACCOUNT_THIRD_TYPE,
- LOG_SECOND_TYPE,
- LOG_IP,
- MEMO
- )
- values
- (
- seq_customer_log.nextval ,
- #{customerServiceUserName} ,
- #{username},
- #{content},
- #{logFirstType},
- #{status},
- #{linkedId},
- #{fee},
- #{accountFirstType},
- #{accountSecondType},
- #{accountThirdType},
- #{logSecondType},
- #{logIp},
- #{memo}
- )
- </insert>
查询了一下 一些资料说是:
引用
MyBatis 插入空值时,需要指定JdbcType
mybatis insert空值报空值异常,但是在pl/sql不会提示错误,主要原因是mybatis无法进行转换,
所以将xml改为:
Xml代码
- <insert id="insertCustomerLog1" parameterType="com.diyicai.customer.domain.CustomerLog">
- insert into customer_log
- (
- ID,
- CUSTOMER_SERVICE_USER_NAME,
- user_name ,
- CONTENT,
- LOG_FIRST_TYPE,
- STATUS,
- LINKED_ID,
- FEE,
- ACCOUNT_FIRST_TYPE,
- ACCOUNT_SECOND_TYPE,
- ACCOUNT_THIRD_TYPE,
- LOG_SECOND_TYPE,
- LOG_IP,
- MEMO
- )
- values
- (
- seq_customer_log.nextval ,
- #{customerServiceUserName,jdbcType=VARCHAR} ,
- #{username,jdbcType=VARCHAR},
- #{content,jdbcType=VARCHAR},
- #{logFirstType,jdbcType=NUMERIC},
- #{status,jdbcType=NUMERIC},
- #{linkedId,jdbcType=VARCHAR},
- #{fee,jdbcType=NUMERIC},
- #{accountFirstType,jdbcType=NUMERIC},
- #{accountSecondType,jdbcType=NUMERIC},
- #{accountThirdType,jdbcType=NUMERIC},
- #{logSecondType,jdbcType=NUMERIC},
- #{logIp,jdbcType=VARCHAR},
- #{memo,jdbcType=VARCHAR}
- )
- </insert>
这个时候 运行正常。
我不甘心 想试试 ibatis2 是否也有同样的问题
xml如下:
Xml代码
- <insert id="BasicUserInfoDaoImpl.testMap" parameterClass="java.util.HashMap">
- insert into customer_log
- (
- ID,
- CUSTOMER_SERVICE_USER_NAME,
- user_name,
- CONTENT,
- LOG_FIRST_TYPE,
- STATUS,
- LINKED_ID,
- FEE,
- ACCOUNT_FIRST_TYPE,
- ACCOUNT_SECOND_TYPE,
- ACCOUNT_THIRD_TYPE,
- LOG_SECOND_TYPE,
- LOG_IP,
- MEMO
- )
- values
- (
- seq_customer_log.nextval ,
- #customerServiceUserName# ,
- #username#,
- #content#,
- #logFirstType#,
- #status#,
- #linkedId#,
- #fee#,
- #accountFirstType#,
- #accountSecondType#,
- #accountThirdType#,
- #logSecondType#,
- #logIp#,
- #memo#
- )
- </insert>
这个时候 发现 ibatis2 可以正常的执行 数据库可以正常的插入数据 。
错误日志是在:org.apache.ibatis.type.BaseTypeHandler这个类的第17行打出的。根据异常上面的代码
Java代码
- if (parameter == null) {
- if (jdbcType == null) {
- try {
- ps.setNull(i, JdbcType.OTHER.TYPE_CODE);
- } catch (SQLException e) {
- throw new TypeException("Error setting null parameter. Most JDBC drivers require that the JdbcType must be specified for all nullable parameters. Cause: " + e, e);
- }
- } else {
- ps.setNull(i, jdbcType.TYPE_CODE);
- }
- } else {
- setNonNullParameter(ps, i, parameter, jdbcType);
- }
可以看出,是因为你传入的参数的字段为null对象无法获取对应的jdbcType类型,而报的错误。
你只要在insert语句中insert的对象加上jdbcType就可以了,修改如下:
#{menuTitle,jdbcType=VARCHAR}
这样就可以解决以上错误了。
看来需要真正的了解mybatis 和ibatis 呀。
希望遇到同样问题的朋友一起交流。
晚上看到了http://wksandy.iteye.com/blog/1443133 感谢 感谢 WKsandy ,他的文字写得很好
引用
还有在向oracle插入数据时,mybatis3报Error setting null parameter. Most JDBC drivers require that the JdbcType must be specified for all nullable parameters,是由于参数出现了null值,对于Mybatis,如果进行操作的时候,没有指定jdbcType类型的参数,mybatis默认jdbcType.OTHER导致,给参数加上jdbcType可解决(注意大小写)
转载于:https://my.oschina.net/architectliuyuanyuan/blog/1806447
Mybatis中的jdbcType的作用相关推荐
- mysql在xml中jdbctype,MyBatis中的JdbcType映射使用详解
Java项目涉及到数据库交互,以往常用的是JDBC,现在则有Hibernate.Mybatis等这些持久化支持. 项目中用到了MyBatis,和JDBC最显著的区别,就是SQL语句配置化,通过xml文 ...
- MyBatis中的jdbcType
MyBatis中常用的jdbcType BIT FLOAT CHAR TIMESTAMP OTHER UNDEFINEDTINYINT REAL VARCHAR BINARY BLOB NVARCHA ...
- MyBatis中的JdbcType映射数据类型对照表
在Mybatisd的映射文件mapper.xml中,会用jdbcType把java类映射数据库表字段,有关映射关系做个笔记,方便查阅. JdbcType Oracle MySql JdbcType A ...
- mybatis 中标签selectkey的作用
<selectKey>标签的作用 https://blog.csdn.net/xueguchen/article/details/108703837
- Mybatis中selectKey 标签的作用,主键回填,找了好多文章没一个解释清楚。。
(1)没有配置selectKey 标签时候插入数据: <insert id="addUser" parameterType="model.User"> ...
- 【Mybatis】中设置 jdbcType
先看mybatis官方文档: http://www.mybatis.org/mybatis-3/apidocs/reference/org/apache/ibatis/type/JdbcType.ht ...
- MyBatis中jdbcType=INTEGER、VARCHAR作用
Mapper.xml中 pid = #{pid,jdbcType=INTEGER} pid = #{pid} 都可以用 Mybatis中什么时候应该声明jdbcType? 当Mybatis不能自动识别 ...
- mybatis jdbcType的作用,无效的列类型错误解决办法
在使用mybatis时,我们可以指定jdbcType,对jdbcType一直有疑惑,有时候可以不加,有时候不加又会报错,网上对于jdbcType的解释也不是很全面,或者可能就是错的,今天专门研究了下, ...
- mybatis中selectKey的作用
selectKey的作用 属性 作用 keyProperty selectKey 语句结果应该被设置的目标属性 resultType mybatis中,返回值类型 order 可以被设置为 BEFOR ...
最新文章
- php where 优先,php – 使用WHERE选择所有内容
- 利用openssh实现chroot监牢
- 简单实现几种常见的前端效果,附代码!
- [LeetCode]: 100: Same Tree
- 【SAM】差异(P4248)
- 升级win10遇到的一些问题
- armbian php ldap,N1刷Armbian后刷Seafile7.1.5做家庭云盘提要
- LuoguP1041 传染病控制
- crm创建启用停用用户
- 使用单例时一定要注意的一个问题
- 黑暗之魂3设置无边窗口化
- 软件的生命周期与特点
- 转载一篇JAVA面试题
- DP转HDMI方案|CS5216方案应用|CS5216设计方案
- 【计算机网络】三传输层--可靠传输原理rdt、GBN、SR
- 英语口语练习三十二之英文口语中生病时该如何陈述症状
- 自媒体人必不可少的多平台同步、一文多发小助手
- 计算机电源功率如何看,小白科普之三分钟教你如何确定电源功率
- 1141E - Superhero Battle(数学思维) Codeforces Round #547 (Div. 3)
- js 动态生成 input 的绑定事件 blur 无效