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> 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM