最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

mybatis批量插入,批量更新以及null值問題的解決

 更新時間:2024年01月13日 10:31:11   作者:凌兮~  
這篇文章主要介紹了mybatis批量插入,批量更新以及null值問題的解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

前言

mybatis批量插入、批量更新常規(guī)寫法,及升級寫法

null value in column “xxx” violates not-null constraint mybatis批量操作報錯問題處理。

批量插入

常規(guī)寫法:

<insert id="insertUser" parameterType="com.test.UserEntity">
	insert into t_com_user(user_name, age, gender)
	values
	<foreach collection ="list" item="item" index="index" open="(" close= ")" separator= "),(">
		#{item.userName, jdbcType=VARCHAR},
		#{item.age, jdbcType=INTEGER},
		#{item.gender, jdbcType=INTEGER}
	</foreach>
</insert>

假如我們在批量插入數據的時候,還想做一下關聯查詢,該怎么辦?

如下寫法,免去了先查詢數據,然后遍歷list賦值,再批量插入的操作

<insert id="insertUser" parameterType="com.test.UserEntity">
	insert into t_com_user(user_name, age, gender, dept_name)
	select 
		t1.user_name, t1.age, t1.gender, t2.dept_name
	from (
		VALUES
		<foreach collection ="list" item="item" index="index" open="(" close= ")" separator= "),(">
			#{item.userName, jdbcType=VARCHAR},
			#{item.age, jdbcType=INTEGER},
			#{item.gender, jdbcType=INTEGER},
			#{item.deptId, jdbcType=INTEGER}
		</foreach>
	) as t1 (user_name, age, gender, dept_id)
	left_join t_com_dept t2 on t1.dept_id = t2.id
</insert>

批量更新

常規(guī)寫法

這種寫法實際執(zhí)行過程是單條執(zhí)行,即使使用的是id查找數據,但是效率較差。

<update id="updateUser" parameterType="com.test.UserEntity">
	<foreach collection ="list" item="item" index="index" separator= ";">
		update t_com_user set
			user_name = #{item.userName, jdbcType=VARCHAR},
			age = #{item.age, jdbcType=INTEGER},
			gender = #{item.gender, jdbcType=INTEGER}
		where id = #{item.id, jdbcType=INTEGER}
	</foreach>
</update>

升級寫法:參考批量插入操作,使用連表更新的語法

<update id="updateUser" parameterType="com.test.UserEntity">
	update t_com_user t1 set
		user_name = t2.user_name,
		age = t2.age,
		gender = t2.gender
	from (
		values
		<foreach collection ="list" item="item" index="index" open="(" close= ")" separator= "),(">
			#{item.id, jdbcType=INTEGER},
			#{item.userName, jdbcType=VARCHAR},
			#{item.age, jdbcType=INTEGER},
			#{item.gender, jdbcType=INTEGER}
		</foreach>
	) as t2 (id, user_name, age, gender)
	where t1.id = t2.id
</update>

ERROR: null value in column “user_name” violates not-null constraint mybatis 批量操作報錯問題處理

mybatis的批量操作過程,傳入的list對象集合中,對象的某個屬性難免會為null,如果數據庫表該列恰好有not-null限制,則會報錯;

處理辦法,本文以pgsql的批量更新為例,親測可行:

方法一:使用

COALESCE(#{item.userName, jdbcType=VARCHAR}, ‘默認名稱')

方式二:

user_name = COALESCE(t2.user_name, ‘默認名稱')

二選一即可

<update id="updateUser" parameterType="com.test.UserEntity">
	update t_com_user t1 set
		user_name = COALESCE(t2.user_name, '默認名稱'),
		age = t2.age,
		gender = t2.gender
	from (
		values
		<foreach collection ="list" item="item" index="index" open="(" close= ")" separator= "),(">
			#{item.id, jdbcType=INTEGER},
			COALESCE(#{item.userName, jdbcType=VARCHAR}, '默認名稱'),
			#{item.age, jdbcType=INTEGER},
			#{item.gender, jdbcType=INTEGER}
		</foreach>
	) as t2 (id, user_name, age, gender)
	where t1.id = t2.id
</update>

mysql 使用IFNULL函數 pgsql 使用COALESCE函數

方法二:

在foreach中使用if標簽判斷

<if test= "item.userName != null">
	#{item.userName, jdbcType=VARCHAR}
</if>
<if test= "item.userName == null">
	'默認名稱'
</if>

Oracle mysql下,不支持 from (value (),()) as t 的寫法;可以參考

select * from (
	select 1, '張三' from dual union
	select 2, '李四' from dual 
) t

null 原因

當mybatis做批量插入時,插入的字段可能沒值,此時不做處理的話,mybatis會報異常,執(zhí)行失敗

根據mybatis的官網介紹,此時需要添加對應的jdbcType類型映射,以處理null值 ,具體的映射關系參考:jdbc映射關系表

此時,在所有可能為空的字段取值中添加jdbcType=XXX(一般全部添加即可)

案例

1.使用union all 來串連每個values,其中jdbcType的設置可以使null值也輸入進去

<insert id="saveList" parameterType="java.util.List">
	INSERT INTO DDZHPT.CMS_SCHEDUAL_DETIAL
	(
		DEPT_ID,
		SCHEDUAL_DATE,
		CMS_SCHEDUAL_TYPE_ID,
		CMS_SCHEDUAL_TEAM_ID,
		CMS_SCHEDUAL_TYPE_PERIOD_ID,
		CMS_SCHEDUAL_TIME_ID,
		SYS_POST_ID,
		POINT_ID,
		PERSON_ID
   )
   <foreach collection="list" item="item" index="index" separator="union all">
   			SELECT
   			#{item.deptId,jdbcType=DECIMAL},
   			#{item.schedualDate,jdbcType=TIMESTAMP},
   			#{item.cmsSchedualTypeId,jdbcType=VARCHAR},
   			#{item.cmsSchedualTeamId,jdbcType=VARCHAR},
   			#{item.cmsSchedualTypePeriodId,jdbcType=VARCHAR},
   			#{item.cmsSchedualTimeId,jdbcType=VARCHAR},
   			#{item.sysPostId,jdbcType=VARCHAR},
   			#{item.pointId,jdbcType=VARCHAR},
   			#{item.personId,jdbcType=VARCHAR}
   			FROM DUAL
   </foreach>
</insert>

2.純粹使用foreach

<insert id="saveList" parameterType="java.util.List">
	<foreach collection="list" item="item" index="index" separator="union all">
			INSERT INTO DDZHPT.CMS_SCHEDUAL_DETIAL
			(
				DEPT_ID,
				SCHEDUAL_DATE,
				CMS_SCHEDUAL_TYPE_ID,
				CMS_SCHEDUAL_TEAM_ID,
				CMS_SCHEDUAL_TYPE_PERIOD_ID,
				CMS_SCHEDUAL_TIME_ID,
				SYS_POST_ID,
				POINT_ID,
				PERSON_ID
		   )VALUES(
		   			#{item.deptId,jdbcType=DECIMAL},
		   			#{item.schedualDate,jdbcType=TIMESTAMP},
		   			#{item.cmsSchedualTypeId,jdbcType=VARCHAR},
		   			#{item.cmsSchedualTeamId,jdbcType=VARCHAR},
		   			#{item.cmsSchedualTypePeriodId,jdbcType=VARCHAR},
		   			#{item.cmsSchedualTimeId,jdbcType=VARCHAR},
		   			#{item.sysPostId,jdbcType=VARCHAR},
		   			#{item.pointId,jdbcType=VARCHAR},
		   			#{item.personId,jdbcType=VARCHAR}
		   			)
	</foreach>
</insert>

推薦使用第一種方式,數據庫語句只有一條,減少數據庫執(zhí)行語句的負擔

3.union與union all區(qū)別

 <!--插入所有列清單-->
    <sql id="insertAllCol">
        <trim prefix="(" suffix=")" suffixOverrides=",">
            FPH,
            EFFECTIVE_TAX_AMOUNT,
            PURCHASER_TAXNO,
            INVOICE_STATE,
            DEDUCTIBLE_MODE,
            AMOUNT,
            OVERDUE_CHECK_MARK,
            ABNORMAL_TYPE,
            NSRSBH,
            ANTI_FAKE_CODE,
            UPDATE_TIME,
            DEDUCTIBLE_PERIOD,
            AGENCY_DRAWBACK,
            RESALE_CERTIFICATE_NUMBER,
            INVOICE_NO,
            CREATE_TIME,
            INV_ISSUE_DATE,
            TAX,
            AUDIT_STATE,
            DEDUCTIBLE_TYPE,
            DEDUCTIBLE_DATE,
            MANAGEMENT_STATUS,
            SALES_TAXNAME,
            DEDUCTIBLE_STATE,
            FLOW_ID,
            INVOICE_CATAGORY,
            SALES_TAXNO,
            INVOICE_CODE,
            ORIGINAL_PERIOD,
            INFO_SOURCES,
        </trim>
    </sql>
 
    <sql id="insertAllValueWithItem" databaseId="oracle">
        <trim prefix=" SELECT " suffix=" FROM dual " suffixOverrides=",">
            #{item.fph,jdbcType=VARCHAR},
            #{item.effectiveTaxAmount,jdbcType=NUMERIC},
            #{item.purchaserTaxno,jdbcType=VARCHAR},
            #{item.invoiceState,jdbcType=DATE},
            #{item.deductibleMode,jdbcType=VARCHAR},
            #{item.amount,jdbcType=NUMERIC},
            #{item.overdueCheckMark,jdbcType=VARCHAR},
            #{item.abnormalType,jdbcType=VARCHAR},
            #{item.nsrsbh,jdbcType=VARCHAR},
            #{item.antiFakeCode,jdbcType=VARCHAR},
            #{item.updateTime,jdbcType=DATE},
            #{item.deductiblePeriod,jdbcType=VARCHAR},
            #{item.agencyDrawback,jdbcType=VARCHAR},
            #{item.resaleCertificateNumber,jdbcType=VARCHAR},
            #{item.invoiceNo,jdbcType=VARCHAR},
            #{item.createTime,jdbcType=DATE},
            #{item.invIssueDate,jdbcType=VARCHAR},
            #{item.tax,jdbcType=NUMERIC},
            #{item.auditState,jdbcType=NUMERIC},
            #{item.deductibleType,jdbcType=VARCHAR},
            #{item.deductibleDate,jdbcType=VARCHAR},
            #{item.managementStatus,jdbcType=VARCHAR},
            #{item.salesTaxname,jdbcType=VARCHAR},
            #{item.deductibleState,jdbcType=VARCHAR},
            #{item.flowId,jdbcType=NUMERIC},
            #{item.invoiceCatagory,jdbcType=VARCHAR},
            #{item.salesTaxno,jdbcType=VARCHAR},
            #{item.invoiceCode,jdbcType=VARCHAR},
            #{item.originalPeriod,jdbcType=VARCHAR},
            #{item.infoSources,jdbcType=VARCHAR},
        </trim>
    </sql>

注:union all和union的區(qū)別

union all連接查詢,結果不去重 

union做連接查詢結果去重

總結

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

相關文章

  • 解讀線程池-Executors的newSingleThreadExecutor和newFixedThreadPool(1)區(qū)別

    解讀線程池-Executors的newSingleThreadExecutor和newFixedThreadPool(1

    這篇文章主要介紹了解讀線程池-Executors的newSingleThreadExecutor和newFixedThreadPool(1)區(qū)別,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • springMVC常見視圖組件與RESTFul編程風格詳解

    springMVC常見視圖組件與RESTFul編程風格詳解

    本文給大家介紹springMVC常見視圖組件與RESTFul編程風格,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2026-02-02
  • 使用Java實現將多聲道音頻轉換為單聲道文件的轉換方案

    使用Java實現將多聲道音頻轉換為單聲道文件的轉換方案

    在音頻處理領域,開發(fā)者經常需要對錄音文件進行聲道數調整,例如從雙聲道轉換為單聲道,以便減小文件體積、適配語音識別模型或統(tǒng)一音頻輸入格式,許多項目會直接依賴FFmpeg,但這會引入外部依賴、部署復雜性和跨平臺兼容問題,本文將介紹一種 純Java實現的音頻聲道轉換方案
    2025-11-11
  • SpringBoot使用Spring-Data-Jpa實現CRUD操作

    SpringBoot使用Spring-Data-Jpa實現CRUD操作

    這篇文章主要為大家詳細介紹了SpringBoot使用Spring-Data-Jpa實現CRUD操作,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • JavaTCP上傳圖片代碼實例

    JavaTCP上傳圖片代碼實例

    今天小編就為大家分享一篇關于JavaTCP上傳圖片代碼實例,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • MyBatis配置與CRUD超詳細講解

    MyBatis配置與CRUD超詳細講解

    這篇文章主要介紹了MyBatis配置與CRUD,CRUD是指在做計算處理時的增加(Create)、讀取(Read)、更新(Update)和刪除(Delete)幾個單詞的首字母簡寫。CRUD主要被用在描述軟件系統(tǒng)中數據庫或者持久層的基本操作功能
    2023-02-02
  • 關于IDEA2020.1新建項目maven PKIX 報錯問題解決方法

    關于IDEA2020.1新建項目maven PKIX 報錯問題解決方法

    這篇文章主要介紹了關于IDEA2020.1新建項目maven PKIX 報錯問題解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • Java實現JWT令牌的示例代碼

    Java實現JWT令牌的示例代碼

    JWT是一種無狀態(tài)認證方案,用于前后端分離項目,后端生成包含用戶信息的token,前端保存并隨請求頭攜帶,后端通過驗證token簽名、有效期等確保安全,實現跨服務身份認證,感興趣的可以了解一下
    2025-09-09
  • Java編寫查看調用棧信息的工具類

    Java編寫查看調用棧信息的工具類

    大家在開發(fā)項目的過程中,應該經常會需要分析調用棧信息,所以這里本文主要來和大家分享一個調用棧打印的Java工具類,希望對大家有所幫助
    2025-08-08
  • Java 中間件Dubbo 服務降級以及Mock 機制詳解

    Java 中間件Dubbo 服務降級以及Mock 機制詳解

    本文將深入探討Dubbo的Mock機制,從原理、配置方式、使用場景到實戰(zhàn)案例,全面解析如何利用這一特性構建高可用的微服務系統(tǒng),感興趣的朋友跟隨小編一起看看吧
    2026-02-02

最新評論

南澳县| 乌拉特中旗| 巧家县| 鸡泽县| 武宁县| 江阴市| 原阳县| 宜都市| 黔西| 修文县| 巢湖市| 枞阳县| 中超| 巫山县| 栾川县| 兴安县| 临湘市| 富宁县| 绥芬河市| 永兴县| 芮城县| 桦南县| 宝兴县| 油尖旺区| 德兴市| 克什克腾旗| 昭通市| 浮梁县| 文登市| 方山县| 青岛市| 桂林市| 佳木斯市| 濮阳市| 嵊泗县| 石景山区| 辛集市| 清流县| 海丰县| 墨竹工卡县| 鄂伦春自治旗|