mybatis 需要注意的点 MyBatis 插入空值时,需要指定JdbcType (201
转自:https://blog.csdn.net/snakemoving/article/details/76052875
前天遇到一个问题 异常显示如下:
; 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 需要注意的点 MyBatis 插入空值时,需要指定JdbcType (201的更多相关文章
- 当需要向数据库插入空值时,sql语句的判断
方法如下: 1.int代表整形. 2.string 代表 字符型. 3.datetime ,日期类型判断如下 if(account.date!=Datetime.MinValue) { Str1.Ap ...
- mybatis 插入空值时报错 TypeException
报错内容:nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ...
- Mybatis${}、#{}及使用#{}时指定jdbcType
一.Mybatis 的Mapper.xml语句中parameterType向SQL语句传参有两种方式:#{}和${} 我们经常使用的是#{},一般解说是因为这种方式可以防止SQL注入,简单的说#{}这 ...
- mybatis指定jdbctype
MyBatis 插入空值时,需要指定JdbcType mybatis insert空值报空值异常,但是在pl/sql不会提示错误,主要原因是mybatis无法进行转换 所以在MyBatis映射文件中要 ...
- (转)MyBatis在插入的数据有空值时,可能为空的字段都要设置jdbcType
1 引言 前面的所有语句中你所见到的都是简单参数的例子,实际上参数是 MyBatis 非常强大的元素,对于简单的做法, 90% 的情况参数都很少,比如: <select id="sel ...
- Mybatis + Mysql 插入数据时中文乱码问题
近日跟朋友一起建立一个项目,用的是spring+mybatis+mysql. 今天碰到一个mybatis向mysql中插入数据时,中文显示为'???'的问题,拿出来说下. 对于数据库操作中出现的中文乱 ...
- mybatis于Date和DateTime现场插入
最近,该公司使用MyBatis3做数据持久层,有在该领域Date和DateTime种类,只有在插入数据时属性设置为一个实体Timestamp将相应mysql的DateTime类型.Date会相应mys ...
- Mybatis+Struts2的结合:实现用户插入和查找
总结一下今天一个成功的小实验:Mybatis+Struts2的结合:实现用户插入和查找.删除和修改如果以后写了,会继续更新. 一 准备工作. 1.新建一个java web项目. 2.在webConte ...
- 在MyBatis中查询数据、涉及多参数的数据访问操作、插入数据时获取数据自增长的id、关联表查询操作、动态SQL、关于配置MyBatis映射没有代码提示的解决方案
1. 单元测试 在单元测试中,每个测试方法都需要执行相同的前置代码和后置代码,则可以自定义2个方法,分别在这2个方法中执行前置代码和后置代码,并为这2个方法添加@Before和@After注解,然后, ...
随机推荐
- Linux命令详解-install
install命令的作用是安装或升级软件或备份数据,它的使用权限是所有用户. 1.命令格式: (1)install [选项]... 来源 目的地 (2)install [选项]... 来源... 目录 ...
- 表统计信息(storge)相关
select t1.NUM_ROWS,t1.BLOCKS,t1.EMPTY_BLOCKS,t1.AVG_SPACE,t1.CHAIN_CNT,t1.AVG_ROW_LEN from user_tab_ ...
- Android数据库升级不丢失数据解决方案
在Android开发中,sqlite至关重要,增删查改不多说,难点在于,1,并发,多个线程同时操作数据库.2,版本升级时,如果数据库表中新加了个字段,如何在不删除表的情况下顺利过渡,从而不丢失数据. ...
- STL中的map
map 容器 提供 1 对 1 的关系 定义方式: map<string,int>mp; 写在前面的是关键字. 数据插入: 1.使用 insert 插入 pair 数据 mp.insert ...
- Netty自定义Encoder/Decoder进行对象传递
转载:http://blog.csdn.net/top_code/article/details/50901623 在上一篇文章中,我们使用Netty4本身自带的ObjectDecoder,Objec ...
- https ddos检测——研究现状
from: https://jyx.jyu.fi/bitstream/handle/123456789/52275/1/URN%3ANBN%3Afi%3Ajyu-201612125051.pdf 相关 ...
- 简话Angular 00 为什么要学Angular
一句话: 现在不学Angular的结局,就和5年前不学JQuery一样! 谁学谁知道,早学早进阶! 1. JQuery vs Javascipt 问两个问题: 1) 你用过JQuery吗?当然! 2) ...
- @pathVariable的作用(二十二)
spring mvc中的@PathVariable是用来获得请求url中的动态参数的,十分方便,复习下: @Controller public class TestController { @Requ ...
- java IO 学习(三)
java IO 学习(一)给了java io 进行分类,这一章学习这些类的常用方法 一.File 1.创建一个新的File的实例: /** * 创建一个新的File实例 */ File f = new ...
- windows下 两个版本的JDK环境变量进行切换 MARK
我们平时在window上做开发的时候,可能需要同时开发两个甚至多个项目,有时不同的项目对JDK的版本要求有区别,为了简化操作,我们可以通过批处理文件来完成环境变量切换的任务.使用方法:阅读代码我们就会 ...