mybatis 为什么要设置jdbcType
转载自:http://makemyownlife.iteye.com/blog/1610021
前天遇到一个问题 异常显示如下:
; uncategorized SQLException for SQL []; SQL state [99999]; error code [17004]; 无效的列类型: 1111; nested exception is java.sql.SQLException: 无效的列类型: 1111
对应的sqlmap如下:
- <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 insert空值报空值异常,但是在pl/sql不会提示错误,主要原因是mybatis无法进行转换,
所以将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如下:
- <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行打出的。根据异常上面的代码
- 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 ,他的文字写得很好
http://code.google.com/p/mybatis/issues/detail?id=224&q=Error%20setting%20null%20parameter&colspec=ID
mybatis 为什么要设置jdbcType的更多相关文章
- 记自己在mybatis中设置jdbcType的一个坑
项目是用ssm搭建的.主要是为app数据接口.其中有一个需求就app想要查询一段时间内某个用户的测量信息,所以app给我后端传递了3个参数,分别是appuserId(String),startDate ...
- mybatis插入语句空值没有设置jdbcType报错
Exception in thread "main" org.springframework.jdbc.UncategorizedSQLException: Error setti ...
- 161115、MyBatis 通过包含的jdbcType类型
MyBatis常用jdbcType类型 BIT FLOAT CHAR TIMESTAMP OTHER UNDEFINEDTINYI ...
- MyBatis 通过包含的jdbcType类型和java中对应的数据类型
MyBatis 通过包含的jdbcType类型 BIT FLOAT CHAR TIMESTAMP OTHER UNDEFINED ...
- Mybatis使用- Mybatis JdbcType与Oracle、MySql数据类型对应列表 ; Mybatis中javaType和jdbcType对应关系
Mybatis JdbcType与Oracle.MySql数据类型对应列表 Mybatis JdbcType Oracle MySql JdbcType ARRAY JdbcType BIG ...
- (转)MyBatis在插入的数据有空值时,可能为空的字段都要设置jdbcType
1 引言 前面的所有语句中你所见到的都是简单参数的例子,实际上参数是 MyBatis 非常强大的元素,对于简单的做法, 90% 的情况参数都很少,比如: <select id="sel ...
- MyBatis的settings设置描述
settings 中的设置是非常关键的,它们会改变 MyBatis 的运行时行为.下表描述了设置中各项的意图.默认值等. 设置参数 描述 有效值 默认值 cacheEnabled 该配置影响的所有映射 ...
- MyBatis与Spring设置callSettersOnNulls
项目中集成Mybatis与Spring,使用的是Mybatis3.2.7,以及Spring4.0.5,mybatis-spring-1.2.2;由于项目组成员想要偷懒,将数据从DB中查询出来时须要将字 ...
- SpringBoot与Mybatis整合的设置
Mybatis和Spring Boot的整合有两种方式: 第一种:使用mybatis官方提供的Spring Boot整合包实现,地址:https://github.com/mybatis/spring ...
随机推荐
- 原生js实现ajax与jquery的ajax库,及json
这是一篇笔记博客, Ajax: 和服务器进行数据交换(异步) 用js实现复杂的原理:用于发送请求的对象在不同的浏览器中是不同的 同源策略:ajax发送请求的url地址与服务器地址必须是同一域名,协议, ...
- STL::unordered_map/unordered_multimap
unordered_map: 和 unorder_set 相似,该容器内部同样根据 hash value 把键值对存放到相应的 bucket(slot)中,根据单个 key 来访问 value 的速度 ...
- js获取当前网页header头部信息
思路,通过ajax重新请求当前页面,用getAllResponseHeaders方法获取: var req = new XMLHttpRequest();req.open('GET', documen ...
- 发送邮件【文本-html】【图片】【邮件】【附件】
依赖 <!-- https://mvnrepository.com/artifact/javax.mail/mail --> <dependency> <groupId& ...
- jQuery MD5 加密
一 MD5 概述 MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value) ...
- EOJ Monthly 2018.7 B.锐角三角形(数学几何+思维)
描述 是否存在面积为S/2的整点锐角三角形?存在输出Yes并输出三个整点坐标,否则输出No. 注意如果存在输出的坐标必须在long long范围内. Input 第一行一个整数S(1<=S< ...
- 【centos】centos中添加一个新用户,并授权
前言 有时候给root用户不太方便,新建一个用于并赋予权限这个做法相对好些 创建新用户 创建一个用户名为:cmj [root@localhost ~]# adduser cmj 为这个用户初始化密码, ...
- java获取电脑部分信息
获取mac地址与cpu序列号 参考博客:https://www.jb51.net/article/94793.htm 另一篇参考地址没记录下来 package util; import java.io ...
- ScrollView嵌套LinearLayout布局不能撑满全屏的问题
当ScrollView里的元素想填满ScrollView时,使用"fill_parent"或者"match_parent"是不管用的,必需为ScrollView ...
- linq to sql语句中转换数据类型和日期操作
System.Data.Entity.SqlServer.SqlFunctions.StringConvert System.Data.Entity.DbFunctions