亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

關于Mybatis插入對象時空值的處理

 更新時間:2022年06月22日 09:53:15   作者:梧桐zhbh  
這篇文章主要介紹了關于Mybatis插入對象時空值的處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Mybatis插入對象時空值

Mybatis中經常會有插入數(shù)據(jù)的情景,有時傳輸?shù)膶ο笞侄尾⒉皇峭暾?,如果不做任何處理則會拋出異常,影響程序執(zhí)行。

如存在對象賦值不完整的情況可以在字段后添加 jdbcType  如:

INSERT INTO student(`uid`,`name`,`class`) VALUES(#{uid,jdbcType=VARCHAR},#{name,jdbcType=VARCHAR},#{class,jdbcType=VARCHAR})

然后再 mybatis-config.xml  中添加配置

<settings>
?? ?<setting name="jdbcTypeForNull" value="NULL" /> ?
</settings>

如若是其它類型也可使用 <if>   標簽

<if test="otherType != null and otherType!= ''" >
? ? otherType = #{otherType}
</if>

這樣在數(shù)據(jù)庫未做限制時,就不會影響到數(shù)據(jù)的添加或修改。

需要注意的點MyBatis插入空值時,需要指定JdbcType

前天遇到一個問題 異常顯示如下: 

Exception in thread "main" org.springframework.jdbc.UncategorizedSQLException: Error setting null for parameter #6 with JdbcType OTHER . Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. Cause: java.sql.SQLException: 無效的列類型: 1111 
; uncategorized SQLException for SQL []; SQL state [99999]; error code [17004]; 無效的列類型: 1111; nested exception is java.sql.SQLException: 無效的列類型: 1111

對應的sqlmap如下: 

<insert id="insertCustomerLog" parameterType="map"> ?
? ? ? insert into customer_log ?
? ? ? ( ?
? ? ? ID, ?
? ? ? CUSTOMER_SERVICE_USER_NAME, ?
? ? ? user_name, ?
? ? ? CONTENT, ?
? ? ? LOG_FIRST_TYPE, ?
? ? ? STATUS, ?
? ? ? LINKED_ID, ?
? ? ? FEE, ?
? ? ? ACCOUNT_FIRST_TYPE, ?
? ? ? ACCOUNT_SECOND_TYPE, ?
? ? ? ACCOUNT_THIRD_TYPE, ?
? ? ? LOG_SECOND_TYPE, ?
? ? ? LOG_IP, ?
? ? ? MEMO ?
? ? ? ) ?
? ? ? values ?
? ? ? ( ?
? ? ? ? ? ? ?seq_customer_log.nextval , ?
? ? ? ? ? ? #{customerServiceUserName} , ?
? ? ? ? ? ? #{username}, ?
? ? ? ? ? ? #{content}, ?
? ? ? ? ? ? #{logFirstType}, ?
? ? ? ? ? ? #{status}, ?
? ? ? ? ? ? #{linkedId}, ?
? ? ? ? ? ? #{fee}, ?
? ? ? ? ? ? #{accountFirstType}, ?
? ? ? ? ? ? #{accountSecondType}, ?
? ? ? ? ? ? #{accountThirdType}, ?
? ? ? ? ? ? #{logSecondType}, ?
? ? ? ? ? ? #{logIp}, ?
? ? ? ? ? ? #{memo} ?
? ? ? ) ?
? </insert>

查詢了一下 一些資料說是 

MyBatis 插入空值時,需要指定JdbcType ,mybatis insert空值報空值異常,但是在pl/sql不會提示錯誤,主要原因是mybatis無法進行轉換。

<insert id="insertCustomerLog1" parameterType="com.diyicai.customer.domain.CustomerLog"> ?
? ? ? ? insert into customer_log ?
? ? ? ? ? ? ? ?( ?
? ? ? ? ? ? ? ?ID, ?
? ? ? ? ? ? ? ?CUSTOMER_SERVICE_USER_NAME, ?
? ? ? ? ? ? ? ?user_name , ?
? ? ? ? ? ? ? ?CONTENT, ?
? ? ? ? ? ? ? ?LOG_FIRST_TYPE, ?
? ? ? ? ? ? ? ?STATUS, ?
? ? ? ? ? ? ? ?LINKED_ID, ?
? ? ? ? ? ? ? ?FEE, ?
? ? ? ? ? ? ? ?ACCOUNT_FIRST_TYPE, ?
? ? ? ? ? ? ? ?ACCOUNT_SECOND_TYPE, ?
? ? ? ? ? ? ? ?ACCOUNT_THIRD_TYPE, ?
? ? ? ? ? ? ? ?LOG_SECOND_TYPE, ?
? ? ? ? ? ? ? ?LOG_IP, ?
? ? ? ? ? ? ? ?MEMO ?
? ? ? ? ? ? ? ?) ?
? ? ? ? ? ? ? ?values ?
? ? ? ? ? ? ? ?( ?
? ? ? ? ? ? ? ?seq_customer_log.nextval , ?
? ? ? ? ? ? ? ?#{customerServiceUserName,jdbcType=VARCHAR} , ?
? ? ? ? ? ? ? ?#{username,jdbcType=VARCHAR}, ?
? ? ? ? ? ? ? ?#{content,jdbcType=VARCHAR}, ?
? ? ? ? ? ? ? ?#{logFirstType,jdbcType=NUMERIC}, ?
? ? ? ? ? ? ? ?#{status,jdbcType=NUMERIC}, ?
? ? ? ? ? ? ? ?#{linkedId,jdbcType=VARCHAR}, ?
? ? ? ? ? ? ? ?#{fee,jdbcType=NUMERIC}, ?
? ? ? ? ? ? ? ?#{accountFirstType,jdbcType=NUMERIC}, ?
? ? ? ? ? ? ? ?#{accountSecondType,jdbcType=NUMERIC}, ?
? ? ? ? ? ? ? ?#{accountThirdType,jdbcType=NUMERIC}, ?
? ? ? ? ? ? ? ?#{logSecondType,jdbcType=NUMERIC}, ?
? ? ? ? ? ? ? ?#{logIp,jdbcType=VARCHAR}, ?
? ? ? ? ? ? ? ?#{memo,jdbcType=VARCHAR} ?
? ? ? ? ? ? ? ?) ?
? ? </insert> ?

錯誤日志是在:org.apache.ibatis.type.BaseTypeHandler這個類的第17行打出的。根據(jù)異常上面的代碼 :

if (parameter == null) { ?
? if (jdbcType == null) { ?
? try { ?
? ps.setNull(i, JdbcType.OTHER.TYPE_CODE); ?
? } catch (SQLException e) { ?
? throw new TypeException("Error setting null parameter. Most JDBC drivers require that the JdbcType must be specified for all nullable parameters. Cause: " + e, e); ?
? } ?
? } else { ?
? ps.setNull(i, jdbcType.TYPE_CODE); ?
? } ?
? } else { ?
? setNonNullParameter(ps, i, parameter, jdbcType); ?
? } ?

可以看出,是因為你傳入的參數(shù)的字段為null對象無法獲取對應的jdbcType類型,而報的錯誤。 你只要在insert語句中insert的對象加上jdbcType就可以了,修改如下: #{menuTitle,jdbcType=VARCHAR} ,這樣就可以解決以上錯誤了。 

但是,如果我們?yōu)槊總€sql都指定jdbc類型,也比較麻煩,可以mybatis-config.xml種全局設置下:

<settings>
?? ?<setting name="jdbcTypeForNull" value="NULL"/>
</settings>

另外,再補充一點資料,可能更能讓我們了解問題的真相:

適配oracle數(shù)據(jù)庫的時候,mybatis報了Error setting null parameter,bug發(fā)現(xiàn)是參數(shù)出現(xiàn)了null值,對于Mybatis,如果進行操作的時候,沒有指定jdbcType類型的參數(shù),就可能導致問題。

postgreSQL,MySQL,SQLSERVER都支持JdbcType.NULL類型,Oracle是不支持,適配的時候也因為這個問題導致mybatis報錯。

比如,之前配置#{submitDate},它會在oracle中報錯:Error settingnull parameter

更改成#{submitDate,jdbcType=DATE},注意jdbcType是區(qū)分大小寫的。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Java中的三種代理模式詳解

    Java中的三種代理模式詳解

    這篇文章主要介紹了Java中的三種代理模式詳解,代理模式的關鍵點是:代理對象與目標對象.代理對象是對目標對象的擴展,并會調用目標對象,文中提供了部分代碼,需要的朋友可以參考下
    2023-08-08
  • Java中IO和NIO的區(qū)別詳細解析

    Java中IO和NIO的區(qū)別詳細解析

    這篇文章主要介紹了Java中IO和NIO的區(qū)別詳細解析,IO和NIO有相同的作用和目的,但實現(xiàn)方式不同,NIO主要用到的是塊,所以NIO的效率要比IO快不少,需要的朋友可以參考下
    2023-11-11
  • SpringBoot搭配AOP實現(xiàn)自定義注解

    SpringBoot搭配AOP實現(xiàn)自定義注解

    這篇文章主要為大家詳細介紹了SpringBoot如何搭配AOP實現(xiàn)自定義注解,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2022-12-12
  • Java基礎之反射詳解

    Java基礎之反射詳解

    這篇文章主要介紹了教你怎么通過IDEA設置堆內存空間,文中有非常詳細的代碼示例,對正在使用IDEA的小伙伴們很有幫助喲,需要的朋友可以參考下
    2021-05-05
  • Java中使用Filter過濾器的方法

    Java中使用Filter過濾器的方法

    Filter過濾器是javaWeb層面的,它跟Servlet類似,每次前端請求,首先進入的是過濾器,我們必須實現(xiàn)Filter接口,重寫三個方法,才能使用Filter過濾器,需要的朋友可以參考下
    2021-06-06
  • Java經典面試題匯總:Java Web

    Java經典面試題匯總:Java Web

    本篇總結的是Java Web相關的面試題,后續(xù)會持續(xù)更新,希望我的分享可以幫助到正在備戰(zhàn)面試的實習生或者已經工作的同行,如果發(fā)現(xiàn)錯誤還望大家多多包涵,不吝賜教,謝謝
    2021-07-07
  • SpringCloud Nacos集群搭建過程詳解

    SpringCloud Nacos集群搭建過程詳解

    Nacos集群不僅僅是服務注冊中心,還在微服務架構中發(fā)揮著關鍵的角色,支持多種場景下的服務治理和協(xié)調,本文介紹了如何在SpringCloud環(huán)境中搭建Nacos集群,為讀者提供了一份清晰而詳盡的指南,通過逐步演示每個關鍵步驟,讀者能夠輕松理解并操作整個搭建過程
    2024-02-02
  • Java單例模式實現(xiàn)靜態(tài)內部類方法示例

    Java單例模式實現(xiàn)靜態(tài)內部類方法示例

    這篇文章主要介紹了Java單例模式實現(xiàn)靜態(tài)內部類方法示例,涉及構造函數(shù)私有化等相關內容,需要的朋友可以了解下。
    2017-09-09
  • java實現(xiàn)簡易點菜器

    java實現(xiàn)簡易點菜器

    這篇文章主要為大家詳細介紹了java實現(xiàn)簡易點菜器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • java1.8安裝及環(huán)境變量配置教程

    java1.8安裝及環(huán)境變量配置教程

    這篇文章主要介紹了java1.8安裝及環(huán)境變量配置,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10

最新評論