欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

遇到的問題

公司最近接到項目需要使用SqlServer,在做SQL兼容的時候遇到問題,批量新增數據時只返回的第一條記錄的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

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

SqlServer只能獲取第一個

2.發(fā)現上述步驟的Jdbc3KeyGenerator是有接口的KeyGenerator,查看后發(fā)現有3個實現類了解到SelectKeyGenerator通過selectKeyt標簽可以返回id;

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

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

5.是否可以自己實現KeyGenerator來解決批量返回id的方法呢?

6.最后我沒找到配置自定義的實現類的方式,決定通過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í)行代碼 獲取返回結構集
       List<Object> values = (List)invocation.proceed();
       MappedStatement ms = (MappedStatement) invocation.getArgs()[0];
       // 判斷是否selectKey查詢語句
       if (ms.getId().endsWith(SelectKeyGenerator.SELECT_KEY_SUFFIX)) {
           Configuration configuration = ms.getConfiguration();
           // 處理入參對象
           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"))));
           }
           // 返回假數據防止異常
           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) {

   }

   /** 來源 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對象參數必須放在第一位,攔截器的代碼寫的比較粗糙,給各位提供思路。

總結

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

相關文章

  • java工具類StringUtils使用實例詳解

    java工具類StringUtils使用實例詳解

    這篇文章主要為大家介紹了java工具類StringUtils使用實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • Java的long和bigint長度對比詳解

    Java的long和bigint長度對比詳解

    在本文中小編給大家分享了關于Java的long和bigint長度比較的知識點內容,有興趣的朋友們學習參考下。
    2019-07-07
  • Java數據結構之AC自動機算法的實現

    Java數據結構之AC自動機算法的實現

    AC自動機算法常被認為是Trie樹+KMP算法的結合體,它是一個多模式匹配算法,在模式匹配領域被廣泛應用。本文將詳細為大家介紹AC自動機的原理與實現方法,感興趣的可以了解一下
    2022-12-12
  • Java實現將容器 Map中的內容保存到數組

    Java實現將容器 Map中的內容保存到數組

    這篇文章主要介紹了Java實現將容器 Map中的內容保存到數組,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Java編程簡單應用

    Java編程簡單應用

    本文主要介紹了三個簡單Java小程序———1、HelloWorld(HelloWorld的來源);2、輸出個人信息3、輸出特殊圖案。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • JDK20?+?SpringBoot?3.1.0?+?JdbcTemplate?使用案例詳解

    JDK20?+?SpringBoot?3.1.0?+?JdbcTemplate?使用案例詳解

    通過 JdbcTemplate 直接執(zhí)行 SQL 語句,結合源碼動態(tài)編譯即可方便實現動態(tài)修改代碼邏輯的效果,這篇文章主要介紹了JDK20?+?SpringBoot?3.1.0?+?JdbcTemplate?使用,需要的朋友可以參考下
    2023-09-09
  • JDBC如何通過SSL方式連接MySQL

    JDBC如何通過SSL方式連接MySQL

    文章介紹了如何配置MySQL以支持SSL連接,并通過JDBC進行安全連接,主要內容包括查看MySQL SSL支持、創(chuàng)建SSL連接用戶、配置用戶是否強制使用SSL、JDBC配置導入證書以及使用Go編寫一個簡單的HTTP文件服務器來提供SSL證書
    2025-02-02
  • 詳解spring與shiro集成

    詳解spring與shiro集成

    這篇文章主要介紹了詳解spring與shiro集成,需要的朋友可以參考下
    2017-09-09
  • SpringCloud Gateway動態(tài)轉發(fā)后端服務實現過程講解

    SpringCloud Gateway動態(tài)轉發(fā)后端服務實現過程講解

    這篇文章主要介紹了SpringCloud Gateway動態(tài)轉發(fā)后端服務實現過程,簡單的路由轉發(fā)可以通過SpringCloudGateway的配置文件實現,在一些業(yè)務場景種,會需要動態(tài)替換路由配置中的后端服務地址,單純靠配置文件無法滿足這種需求
    2023-03-03
  • Java中Thread類詳解及常用的方法

    Java中Thread類詳解及常用的方法

    在java中談到線程,必然少不了Thread類,下面這篇文章主要給大家介紹了關于Java中Thread類及常用的方法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-05-05

最新評論