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

mybatis-sqlserver批量新增返回id方式

 更新時(shí)間:2024年05月18日 09:51:52   作者:rong0016  
這篇文章主要介紹了mybatis-sqlserver批量新增返回id方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

遇到的問(wèn)題

公司最近接到項(xiàng)目需要使用SqlServer,在做SQL兼容的時(shí)候遇到問(wèn)題,批量新增數(shù)據(jù)時(shí)只返回的第一條記錄的id

解決思路

1.參考mysql

<insert id="batchInsert" userGeneratedKeys="true" keyProperty="id">
   insert into public_user (name,password)
   values
   <foreach collection="list" separator="," item="item">
   (#{item.name}, #{itme.password})
   </foreach>
</insert>

具體mybatis封裝id的地方在org.apache.ibatis.executor.keygen.Jdbc3KeyGenerator

主要邏輯是通過(guò)Statement.getGeneratedKeys()獲取id結(jié)果集.

SqlServer只能獲取第一個(gè)

2.發(fā)現(xiàn)上述步驟的Jdbc3KeyGenerator是有接口的KeyGenerator,查看后發(fā)現(xiàn)有3個(gè)實(shí)現(xiàn)類了解到SelectKeyGenerator通過(guò)selectKeyt標(biāo)簽可以返回id;

3.查看SelectKeyGenerator源碼了解到只支持返回單個(gè)id;

4.通過(guò)百度了解到SqlServer通過(guò)output inserted.id可以輸出id;

5.是否可以自己實(shí)現(xiàn)KeyGenerator來(lái)解決批量返回id的方法呢?

6.最后我沒(méi)找到配置自定義的實(shí)現(xiàn)類的方式,決定通過(guò)mybatis的攔截器解決

代碼

mybatis攔截器

@Component
@Intercepts(@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class}))
public class SqlServerKeyGeneratorInterceptor implements Interceptor {
   @Override
   public Object intercept(Invocation invocation) throws Throwable {
       // 正常執(zhí)行代碼 獲取返回結(jié)構(gòu)集
       List<Object> values = (List)invocation.proceed();
       MappedStatement ms = (MappedStatement) invocation.getArgs()[0];
       // 判斷是否selectKey查詢語(yǔ)句
       if (ms.getId().endsWith(SelectKeyGenerator.SELECT_KEY_SUFFIX)) {
           Configuration configuration = ms.getConfiguration();
           // 處理入?yún)?duì)象
           Collection<Object> parameters = getParameters(invocation.getArgs()[1]);
           // 封裝id
           for (int i = 0; i < parameters.size(); i++) {
               MetaObject metaObject = configuration.newMetaObject(parameters.toArray()[i]);
               metaObject.setValue("id", Long.valueOf((Integer)(((Map)values.get(i)).get("id"))));
           }
           // 返回假數(shù)據(jù)防止異常
           List<Long> ids = new ArrayList<>();
           ids.add(1L);
           return ids;
       }
       return values;
   }

   @Override
   public Object plugin(Object target) {
       return null;
   }

   @Override
   public void setProperties(Properties properties) {

   }

   /** 來(lái)源 Jdbc3KeyGenerator */
   private Collection<Object> getParameters(Object parameter) {
       Collection<Object> parameters = null;
       if (parameter instanceof Collection) {
           parameters = (Collection) parameter;
       } else if (parameter instanceof Map) {
           Map parameterMap = (Map) parameter;
           if (parameterMap.containsKey("collection")) {
               parameters = (Collection) parameterMap.get("collection");
           } else if (parameterMap.containsKey("list")) {
               parameters = (List) parameterMap.get("list");
           } else if (parameterMap.containsKey("array")) {
               parameters = Arrays.asList((Object[]) parameterMap.get("array"));
           }
       }
       if (parameters == null) {
           parameters = new ArrayList<Object>();
           parameters.add(parameter);
       }
       return parameters;
   }
}

mapper

<insert id="batchInsert">
	<selectKey keyColumn="id" keyProperty="id" order="AFTER" resultType="java.util.Map">
		insert into public_user (name,password)
		output inserted.id
		values
		<foreach collection="list" separator="," item="item">
		(#{item.name}, #{itme.password})
		</foreach>
	<selectKey>
</insert>

PS:

需要注意的是id對(duì)象參數(shù)必須放在第一位,攔截器的代碼寫(xiě)的比較粗糙,給各位提供思路。

總結(jié)

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

相關(guān)文章

  • 使用Java將Excel轉(zhuǎn)換為Text的實(shí)現(xiàn)方法

    使用Java將Excel轉(zhuǎn)換為Text的實(shí)現(xiàn)方法

    在日常的數(shù)據(jù)處理和系統(tǒng)集成中,我們經(jīng)常會(huì)遇到需要將Excel文件中的數(shù)據(jù)提取出來(lái),并以純文本格式進(jìn)行處理的場(chǎng)景,將Excel轉(zhuǎn)換為Text是一項(xiàng)基礎(chǔ)而重要的任務(wù),本文將向您介紹如何利用強(qiáng)大的 Spire.XLS for Java 庫(kù),在Java應(yīng)用程序中輕松實(shí)現(xiàn)Excel到Text的轉(zhuǎn)換
    2025-10-10
  • 詳解Java 中的UnitTest 和 PowerMock

    詳解Java 中的UnitTest 和 PowerMock

    這篇文章主要介紹了Java中的 UnitTest 和 PowerMock,文中講解非常詳細(xì),對(duì)大家學(xué)習(xí)有很大的幫助,感興趣的朋友可以了解下
    2020-06-06
  • java批量下載生成zip壓縮包的思路詳解

    java批量下載生成zip壓縮包的思路詳解

    這篇文章主要介紹了java批量下載生成zip壓縮包的思路詳解,設(shè)計(jì)思路大概是本地先創(chuàng)建一個(gè)zip文件,將批量下載的文件依次放入zip文件中,將zip文件返回給前端,本文結(jié)合實(shí)例代碼講解的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • JavaEE的進(jìn)程,線程和創(chuàng)建線程的5種方式詳解

    JavaEE的進(jìn)程,線程和創(chuàng)建線程的5種方式詳解

    這篇文章主要為大家詳細(xì)介紹了JavaEE的進(jìn)程,線程和創(chuàng)建線程的5種方式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • 解決idea中maven項(xiàng)目無(wú)端顯示404錯(cuò)誤的方法

    解決idea中maven項(xiàng)目無(wú)端顯示404錯(cuò)誤的方法

    這篇文章主要介紹了解決idea中maven項(xiàng)目無(wú)端顯示404錯(cuò)誤的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • SpringBoot兩種方式接入DeepSeek的實(shí)現(xiàn)

    SpringBoot兩種方式接入DeepSeek的實(shí)現(xiàn)

    本文主要介紹了SpringBoot兩種方式接入DeepSeek的實(shí)現(xiàn),包括HttpClient方式和基于spring-ai-openai的方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-03-03
  • Java8中利用stream對(duì)map集合進(jìn)行過(guò)濾的方法

    Java8中利用stream對(duì)map集合進(jìn)行過(guò)濾的方法

    這篇文章主要給大家介紹了關(guān)于Java8中利用stream對(duì)map集合進(jìn)行過(guò)濾的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • SpringBoot項(xiàng)目如何打可執(zhí)行war包

    SpringBoot項(xiàng)目如何打可執(zhí)行war包

    最近小編做了一個(gè)springboot項(xiàng)目,最后需要打成war包在容器中部署,下面小編給大家分享下SpringBoot項(xiàng)目如何打可執(zhí)行war包,感興趣的朋友一起看看吧
    2020-04-04
  • 基于ElasticSearch Analyzer的使用規(guī)則詳解

    基于ElasticSearch Analyzer的使用規(guī)則詳解

    這篇文章主要介紹了基于ElasticSearch Analyzer的使用規(guī)則,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • SpringBoot中的異步任務(wù)解析

    SpringBoot中的異步任務(wù)解析

    這篇文章主要介紹了SpringBoot中的異步任務(wù)解析,SpringBoot 異步任務(wù)是一種在SpringBoot框架中使用的異步處理機(jī)制,可以提高系統(tǒng)的并發(fā)能力和響應(yīng)速度,需要的朋友可以參考下
    2023-10-10

最新評(píng)論

莱州市| 小金县| 焦作市| 湘乡市| 西充县| 阿图什市| 葫芦岛市| 广水市| 临夏市| 会同县| 宜川县| 桂阳县| 榕江县| 赤城县| 松滋市| 左权县| 乐平市| 大竹县| 巴里| 台江县| 康保县| 正蓝旗| 卫辉市| 墨玉县| 石景山区| 江津市| 德格县| 沽源县| 康平县| 南丰县| 南阳市| 页游| 德钦县| 泸西县| 宁安市| 宁明县| 宜州市| 上犹县| 南木林县| 锦屏县| 凤山市|