我的编程空间,编程开发者的网络收藏夹
学习永远不晚

关于Mybatis插入对象时空值的处理

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

关于Mybatis插入对象时空值的处理

Mybatis插入对象时空值

Mybatis中经常会有插入数据的情景,有时传输的对象字段并不是完整的,如果不做任何处理则会抛出异常,影响程序执行。

如存在对象赋值不完整的情况可以在字段后添加 jdbcType  如:

INSERT INTO student(`uid`,`name`,`class`) VALUES(#{uid,jdbcType=VARCHAR},#{name,jdbcType=VARCHAR},#{class,jdbcType=VARCHAR})

然后再 mybatis-config.xml  中添加配置

<settings>
    <setting name="jdbcTypeForNull" value="NULL" />  
</settings>

如若是其它类型也可使用 <if>   标签

<if test="otherType != null and otherType!= ''" >
    otherType = #{otherType}
</if>

这样在数据库未做限制时,就不会影响到数据的添加或修改。

需要注意的点MyBatis插入空值时,需要指定JdbcType

前天遇到一个问题 异常显示如下: 

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如下: 

<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无法进行转换。

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

错误日志是在: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} ,这样就可以解决以上错误了。 

但是,如果我们为每个sql都指定jdbc类型,也比较麻烦,可以mybatis-config.xml种全局设置下:

<settings>
    <setting name="jdbcTypeForNull" value="NULL"/>
</settings>

另外,再补充一点资料,可能更能让我们了解问题的真相:

适配oracle数据库的时候,mybatis报了Error setting null parameter,bug发现是参数出现了null值,对于Mybatis,如果进行操作的时候,没有指定jdbcType类型的参数,就可能导致问题。

postgreSQL,MySQL,SQLSERVER都支持JdbcType.NULL类型,Oracle是不支持,适配的时候也因为这个问题导致mybatis报错。

比如,之前配置#{submitDate},它会在oracle中报错:Error settingnull parameter

更改成#{submitDate,jdbcType=DATE},注意jdbcType是区分大小写的。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

关于Mybatis插入对象时空值的处理

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

关于thymeleaf判断对象是否为空的相关逻辑处理

这篇文章主要介绍了关于thymeleaf判断对象是否为空的相关逻辑处理,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-11-13

当关系的一侧已存在于数据库中时,使用 SQLModel 插入多对多关系对象

问题内容我正在尝试使用 sqlmodel 在数据库中插入记录,其中数据如下所示。一个 house 对象,它有颜色和许多位置。地点也将与许多房屋相关联。输入为:[{"color": "red","locations": [{"type
当关系的一侧已存在于数据库中时,使用 SQLModel 插入多对多关系对象
2024-02-06

基于mybatis查询结果映射不到对象的处理

目录mybatis查询结果映射不到对象项目场景问题描述原因分析解决方案mybatis结果映射遇到的问题错误如下解决方案mybatis查询结果映射不到对象项目场景使用mybatis+springboot 进行数据库的数据查询操作,一直拿不到返回结果。问题描述后端
2019-07-01

关于JAVA中stream流的基础处理(获取对象字段和对象批量处理等)

这篇文章主要介绍了关于JAVA中stream流的基础处理,包含获取对象字段、按字段排序、按字段去重、对象批量处理、指定字段转数组等内容,需要的朋友可以参考下
2023-03-24

Excel数据导入Mysql常见问题汇总:如何处理导入时遇到的空值问题?

Excel数据导入Mysql常见问题汇总:如何处理导入时遇到的空值问题?导入Excel数据到Mysql是日常数据处理中常见的任务,在导入过程中经常会遇到空值的情况。本文将介绍导入Excel数据时常见的空值问题,并给出相应的解决方法。空值如何
2023-10-22

SQLServer 错误 5245 对象 ID O_ID (对象“NAME”):由于超过了锁请求超时期限,DBCC 无法获取该对象的锁。 已跳过此对象,不会处理它。 故障 处理 修复 支持远程

详细信息 Attribute 值 产品名称 SQL Server 事件 ID 5245 事件源 MSSQLSERVER 组件 SQLEngine 符号名称 DBCC4_TABLE_LOCK_TIMEOUT_EXCEEDED ...
SQLServer 错误 5245 对象 ID O_ID (对象“NAME”):由于超过了锁请求超时期限,DBCC 无法获取该对象的锁。 已跳过此对象,不会处理它。 故障 处理 修复 支持远程
2023-11-05

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录