Oracle資料庫mybatis 插入空值時報錯(with JdbcType OTHER)的兩種解決方案
阿新 • • 發佈:2022-03-18
原因:
利用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>