mybatis-oracle-config.xml 复制代码 1 <?xml version="1.0" encoding="UTF-8"?> 2 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 复制代码 user.xml 复制代码 1 <?xml version="1.0" encoding="UTF-8"?> 2 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 4 5 6 insert into users 7 (name,age) 8 values 9 (#{name},#{age}) 10 11 12 复制代码 main()入口方法 复制代码 public static void main(String[] args) throws Exception{ SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder(); SqlSessionFactory sqlSessionFactory=builder.build(Resources.getResourceAsStream("mybatis-oracle-config.xml"),"dev"); SqlSession sqlSession=sqlSessionFactory.openSession(true); IUserMapper userMapper=sqlSession.getMapper(IUserMapper.class); User user=new User(); //user.setName("a");//故意注释,不设置。模拟空值 user.setAge(20); int count=userMapper.insertUser(user); System.out.println(count == 1 ? "插入成功" : "插入失败"); List list=userMapper.getUserList(); for (User user1 : list) { System.out.println(user1.toString()); } sqlSession.close(); } 复制代码 源码分析请参考这篇博客:Mybatis+Oracle搭配insert空值报错之myBatis+mysql驱动+oracle驱动的源码分析 总结一下空值报错的原因: mybatis在build阶段,不知道这个参数的具体jdbcType类型,mybatis会给他一个默认的1111编号; 在mybatis运行阶段,空值 +111编号条件就使得MyBatis去调用了Oracle驱动中预编译器的setNull()方法; 因为oracle不识别1111编号,所以直接就抛出了异常。 方法1:构建时办法 在user.xml的sql中,给参数指明具体的jdbcType类型,让oracle预编译器能够知道以varchar或者NUMERIC方式处理这种空值。 修改后的代码如下红色地方。 复制代码 <?xml version="1.0" encoding="UTF-8"?> insert into users (name,age) values (#{name,jdbcType=VARCHAR},#{age}) 复制代码 方法2:运行时办法 编写自定义的typeHandler。 当MyBatis不知道具体的jdbcType类型时,在自定义typeHandler中指定jdbcType。 数据库中常用的就两种字段,一个VARCHAR字段,一个NUMBERIC字段。所以定义两个typeHandler。 复制代码 public class MyNumberNullTypeHandler extends IntegerTypeHandler { @Override public void setParameter(PreparedStatement ps, int i, Integer parameter, JdbcType jdbcType) throws SQLException { super.setParameter(ps, i, parameter, JdbcType.NUMERIC); } } 复制代码 复制代码 public class MyStringNullTypeHandler extends StringTypeHandler { @Override public void setParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException { super.setParameter(ps,i,parameter,JdbcType.VARCHAR); } } 复制代码 mybatis-oracle-config.xml中的properties后面添加如下配置

龙华大道1号http://kinghill.cn/LongHuaDaDao1Hao/index.html

oracle匿名代码块执行insert,MyBatis+Oracle在执行insert时空值报错之从源码寻找解决办法...相关推荐

  1. oracle安装出现2932,【案例】Oracle报错ORA-19815 fast_recovery_area无剩余空间解决办法...

    天萃荷净 运维DBA反映数据库出现宕机,alert日志报错ORA-19815,分析原因为归档日志满导致日志无法归档,提出fast_recovery_area无剩余空间解决办法 一.打开数据库报错ORA ...

  2. 执行update和delete的SQL语句时,报错:Error Code: 1175. You are using safe update mode and you tried to update a

    执行SQL语句时,报错: 13:36:42 delete from users where username='lisi' Error Code: 1175. You are using safe u ...

  3. Oracle报错:类型长度大于最大值解决办法

    java调用以下存储过程时报错: --1.创建一个包,在该包中定义了一个游标类型yh_cursor1 create or replace package testpackage as type tes ...

  4. Oracle报错:ORA-01034 或者 ORA-27101 终极解决办法(图文)

    前言 当我们的Oracle异常关闭或者其他情况,导致当我们用Plsql登录数据库时报以下错误: ORA-01034: ORACLE not available ORA-27101: shared me ...

  5. Idea单测执行报错“Command line is too long“ 解决办法

    最近在使用idea执行项目的单元测试的时候,会出现如下报错 : Command line is too long. Shorten command line for {className} or al ...

  6. Oracle将某varchar2类型的字段改为blob类型时,报错:ORA-22858: 数据类型的变更无效

    原因:Oracle不允许将字段类型修改为:object.REF.nested table.varchar.clob.blob 解决方法:1.修改该字段的名称.2.新建一个正确的字段.3.将数据同步的到 ...

  7. 类的加载顺序和静态代码块和匿名代码块的区别

    静态代码块和匿名代码块的区别 静态块: static { } 匿名块: { }          静态块只在类第一次被加载的时候执行一次,一般用于进行初始化工作;         匿名块在每一次创建本 ...

  8. java中静态变量,静态代码块,静态方法,实例变量,匿名代码块的加载顺序

    1. java中静态变量,静态代码块,静态方法,实例变量,匿名代码块 在Java中,使用{}括起来的代码称为代码块,代码块可以分为以下四种: (1)普通代码块:就是类中方法的方法体 public vo ...

  9. Static、构造代码块快、构造函数等的执行顺序

    前言 今天分享的是关于在程序中代码的执行顺序,零零散散写了很多随记,总结起来蛮费时间的,希望大家给个关注,多多关注新人哈,废话不多说,还是老规矩,代码穿插注释的总结方式. 1.代码执行顺序 /*** ...

最新文章

  1. C#反射(Reflection)详解
  2. 微型计算机技术6,微型计算机技术课后习题6-8章答案.ppt
  3. fastjson解析JSON数据乱序导致的问题
  4. 任务调度之Timer、TimerTask
  5. js字符串解析与转换成数字
  6. 【QCustomPlot】1.0 - QCustomPlot库添加到自己的工程、创建工程
  7. python deque函数_一个不得不了解的Python库——collections
  8. Lecture 2:马尔可夫决策
  9. Quartz学习(一)
  10. Android Studio下载、安装和配置+SDK+tools下载(无敌超级详细版本)
  11. 服务器wifi模块通讯协议,WiFi模块 TCP/IP协议栈
  12. jsonp跨域请求用法
  13. might和could的区别用法_KET语法:情态动词Can,Could,May和Might
  14. 在网页右下角添加一个卡通动漫人物
  15. 如何判断一个APP页面是原生的还是H5页面
  16. vrf路由泄露原理和简单示例
  17. 透过数字化转型再谈数据中台(三):一文遍历大数据架构变迁史
  18. context.Context
  19. Effective C++ 条款43
  20. Windows使用Nginx配置本地文件代理(查看本地资源或图片)

热门文章

  1. python多进程编程_python并发编程中的多进程(代码实现)
  2. ajax post提交数据_JavaEE学习——为什么get请求方式比post请求方式效率高
  3. hyper-v 安装centos7 后,虚拟机无法访问网络。
  4. php 访问类的属性,PHP OOP如何访问类的父属性范围解析运算符(::)?
  5. linux命令中xargs,在Linux上使用xargs命令的详细教程
  6. .NET Core,PostgreSQL和文档数据库
  7. 如何在ngRepeat中使用Bootstrap Span元素
  8. Google TakeOut图片下载器
  9. 开源软件没你想象中那么安全,Java 开发者尤其要警惕
  10. java 全局代码区_MyEclipse设置全局编码