1. 程式人生 > 其它 >Oracle資料庫mybatis 插入空值時報錯(with JdbcType OTHER)的兩種解決方案

Oracle資料庫mybatis 插入空值時報錯(with JdbcType OTHER)的兩種解決方案

原因:

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