原因:
利用mybatis插入空值給數據庫;mysql能夠正常執行,而Oracle卻拋出異常;
這兩種截然不同的表現給程序員造成了困擾,那么這個拋異常的鍋到底應該是誰來背呢?
當然是mybatis來背鍋嘍。oracle和mysql都根據jdbc接口來提供了自己的實現方法,
而mybatis作為一個封裝了JDBC的框架,沒有封裝到位,出現了相同的方法在不同數據庫的兼容問題。
1、第一種方式,如出錯信息中提到的,需要在每個數據變量那里設置相應的jdbcType,示例如下(加粗加下划線部分的內容):
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配置
<!-- 設置但JDBC類型為空時,某些驅動程序 要指定值,default:OTHER --> <setting name="jdbcTypeForNull" value="NULL"/>
附常見mybatis配置文件
<!-- 配置設置 --> <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>