最新国产好看的视频,伊人天堂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>

假如我們在批量插入數(shù)據(jù)的時候,還想做一下關(guān)聯(lián)查詢,該怎么辦?

如下寫法,免去了先查詢數(shù)據(jù),然后遍歷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查找數(shù)據(jù),但是效率較差。

<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,如果數(shù)據(jù)庫表該列恰好有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函數(shù) pgsql 使用COALESCE函數(shù)

方法二:

在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í)行失敗

根據(jù)mybatis的官網(wǎng)介紹,此時需要添加對應(yīng)的jdbcType類型映射,以處理null值 ,具體的映射關(guān)系參考:jdbc映射關(guān)系表

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

案例

1.使用union all 來串連每個values,其中jdbcType的設(shè)置可以使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>

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

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連接查詢,結(jié)果不去重 

union做連接查詢結(jié)果去重

總結(jié)

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

相關(guān)文章

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

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

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

    springMVC常見視圖組件與RESTFul編程風(fēng)格詳解

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

    使用Java實現(xiàn)將多聲道音頻轉(zhuǎn)換為單聲道文件的轉(zhuǎn)換方案

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

    SpringBoot使用Spring-Data-Jpa實現(xiàn)CRUD操作

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

    JavaTCP上傳圖片代碼實例

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

    MyBatis配置與CRUD超詳細講解

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

    關(guān)于IDEA2020.1新建項目maven PKIX 報錯問題解決方法

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

    Java實現(xiàn)JWT令牌的示例代碼

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

    Java編寫查看調(diào)用棧信息的工具類

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

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

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

最新評論

都匀市| 三台县| 册亨县| 乡城县| 杭锦后旗| 乐东| 托里县| 乌兰浩特市| 乐亭县| 饶阳县| 孝昌县| 昭觉县| 治县。| 灯塔市| 万山特区| 万年县| 左贡县| 包头市| 红桥区| 新干县| 荥经县| 邵阳县| 泸西县| 乐安县| 铜鼓县| 台北县| 万荣县| 万年县| 宁陕县| 自治县| 宝应县| 普洱| 章丘市| 内丘县| 盘锦市| 酒泉市| 镇沅| 县级市| 馆陶县| 绥宁县| 萨迦县|