Oracle数据库mybatis 插入空值时报错(with JdbcType OTHER)的两种解决方案
原因:
利用mybatis插入空值给数据库;mysql能够正常执行,而Oracle却抛出异常;
这两种截然不同的表现给程序员造成了困扰,那么这个抛异常的锅到底应该是谁来背呢?
当然是mybatis来背锅喽。oracle和mysql都根据jdbc接口来提供了自己的实现方法,
而mybatis作为一个封装了JDBC的框架,没有封装到位,出现了相同的方法在不同数据库的兼容问题。
1、第一种方式,如出错信息中提到的,需要在每个数据变量那里设置相应的jdbcType,示例如下(加粗加下划线部分的内容):
1 2 3 4 5 6 7 8 | insert into user ( name ,address,age) values ( #{ name ,jdbcType= VARCHAR }, #{address,jdbcType= VARCHAR }, #{age,jdbcType= NUMERIC }, ) |
2、第二种方式,MyBatis-config.xml 中设置当JDBC类型为空值时,要指定的值得,默认为OTHER,我们指定为NULL就好了(注意是大写的NULL)。
MyBatis-config.xml配置
1 2 | <! -- 设置但JDBC类型为空时,某些驱动程序 要指定值,default:OTHER --> <setting name = "jdbcTypeForNull" value= "NULL" /> |
附常见mybatis配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | <! -- 配置设置 --> <settings> <! -- 配置全局性 cache 的 ( 开 / 关) default:true --> <setting name = "cacheEnabled" value= "true" /> <! -- 是否使用 懒加载 关联对象 同 hibernate中的延迟加载 一样 default:true --> <setting name = "lazyLoadingEnabled" value= "true" /> <! -- [当对象使用延迟加载时 属性的加载取决于能被引用到的那些延迟属性,否则,按需加载(需要的是时候才去加载)] --> <setting name = "aggressiveLazyLoading" value= "true" /> <! -- 是否允许单条sql 返回多个数据集 (取决于驱动的兼容性) default:true --> <setting name = "multipleResultSetsEnabled" value= "true" /> <! -- 是否可以使用列的别名 (取决于驱动的兼容性) default:true--> <setting name = "useColumnLabel" value= "true" /> <! --允许JDBC 生成主键。需要驱动器支持。如果设为了true,这个设置将强制使用被生成的主键,有一些驱动器不兼容不过仍然可以执行。 default:false--> <setting name = "useGeneratedKeys" value= "false" /> <! --指定 MyBatis 如何自动映射 数据基表的列 NONE:不隐射 PARTIAL:部分 FULL:全部--> <setting name = "autoMappingBehavior" value= "PARTIAL" /> <! -- 这是默认的执行类型 SIMPLE :简单 REUSE:执行器可能重复使用prepared statements 语句 BATCH:执行器可以重复执行语句和批量更新 --> <setting name = "defaultExecutorType" value= "SIMPLE" /> <! -- 设置驱动等待数据响应的超时数 默认没有设置--> <setting name = "defaultStatementTimeout" value= "25000″/> <!-- [是否启用 行内嵌套语句 defaut:false] --> <setting name=" safeRowBoundsEnabled " value=" false "/> <!-- [是否 启用 数据中 A_column 自动映射 到 java类中驼峰命名的属性 default:fasle] --> <setting name=" mapUnderscoreToCamelCase " value=" false "/> <!-- 设置本地缓存范围 session:就会有数据的共享 statement:语句范围 (这样就不会有数据的共享 ) defalut:session --> <setting name=" localCacheScope " value=" SESSION "/> <!-- 设置但JDBC类型为空时,某些驱动程序 要指定值,default:OTHER --> <setting name=" jdbcTypeForNull " value=" DEFAULT "/> <!-- 设置触发延迟加载的方法 --> <setting name=" lazyLoadTriggerMethods " value=" equals,clone,hashCode,toString"/> </settings> |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)