Java + Spring Boot + Mybatis 插入数据后,获取自增 id 的示例代码

示例代码1:

特点:

1、单个参数

2、使用 useGeneratedKeys="false"、selectKey

3、通过实体类的 id 接收自增 id 的值(Integer),定义 resultType="java.lang.Integer"

4、useGeneratedKeys="false"、、select @@IDENTITY as id

ApplySampleServiceImpl.java
    // 增加受理样品,增加NULL值的样品信息,只有outerApplyId、applyId、sampleNo,并返回自增的 id,若样品已经存在,返回 0
    @Override
    public Integer addNullValue(ApplySample applySample) {
        // 通过applyId、sampleNo查询样品
        ApplySample sample = applySampleMapper.selectByApplyIdAndSampleNo(applySample.getApplyId(), applySample.getSampleNo());
        // 样品不存在
        if (sample == null) {
            // 增加样品,并返回自增的 id
            applySampleMapper.insertNullValue(applySample);
            // 返回自增的 id
            return applySample.getId();
        } else {
            // 样品已经存在,返回 0
            return 0;
        }
    }
ApplySampleMapper.java
    // 增加受理样品,增加NULL值的样品信息,只有outerApplyId和applyId,并返回自增的 id
    void insertNullValue(ApplySample applySample);
ApplySampleMapper.xml
    
    
    
    
    
    

    
    
    
    

    
    
        insert into ApplySampleInfoC(as_OuterApplyId, as_ApplyID, as_SampleNo)
        values(#{outerApplyId}, #{applyId}, #{sampleNo})
        
            select @@IDENTITY as id
        
    

示例代码2:

特点:

1、多个参数,Mapper中使用@Param

2、使用 useGeneratedKeys="true" keyProperty="idHolder.generatedId",多个参数的情况下,generatedId前面需要@Param的参数名做为前缀

3、通过 Map 接收自增 id 的值(Integer),Map结构类型为,再通过安全转换为Integer

4、useGeneratedKeys="true" keyProperty="idHolder.generatedId"


ReagentServiceImpl.java

    // 生成试剂
    @Override
    public List generate(List idList) {
        if (!idList.isEmpty()) {
            List reagentIdList = new ArrayList<>();
            idList.forEach(ckDetailId -> {
                // id 接收器,用于接收插入数据时生成的自增 id 值
                Map idHolder = new HashMap<>();
                // 插入数据
                reagentMapper.insertByCkDetailId(ckDetailId, idHolder);
                // 获取插入数据后的自增 id 值(键名 generatedId 与 XML 配置一致  idHolder.get("generatedId")  keyProperty="idHolder.generatedId")
                Object idObj = idHolder.get("generatedId");
                // 类型安全转换 Object -> Long
                Long reagentId = TypeUtils.safeToLong(idObj);
                reagentIdList.add(reagentId.intValue());
            });
            // 返回生成的试剂
            return reagentMapper.selectByIds(reagentIdList);
        } else {
            // 返回空集合
            return new ArrayList<>();
        }
    }
ReagentMapper.java
    // 通过出库明细 id,增加试剂
    void insertByCkDetailId(@Param("ckDetailId") Integer id, @Param("idHolder") Map holder);
ReagentMapper.xml
    
    
        insert into Reagent(
        rea_TypeName, rea_Name,
        rea_Spec, rea_unit, rea_BatchNo,
        rea_ManufacturerName, rea_ProviderName, rea_Amount,
        rea_SubTotal, rea_ProduceDate,
        rea_OverdueDate, rea_DeptID, rea_Location,
        rea_Memo, rea_MaterialID, rea_br, rea_source, rea_State,
        rea_BookerName, rea_PrepareDate)
        select
        null, ckd_MaterialName,
        ckd_Spec, ckd_Unit, ckd_BatchNo,
        null, null, ckd_Amount,
        ckd_SubTotal, null,
        getdate(), ckm_PDDID, null,
        null, ckd_MaterialID, null, ckd_ID, 0,
        '', getdate()
        from CKDetail
        inner join CKMaster on ckm_ID = ckd_MasterID
        where ckd_ID = #{ckDetailId}
    
 TypeUtils.java
package com.weiyu.utils;

/**
 * 类型转换工具
 */
public class TypeUtils {
    /**
     * 安全转换为 Long
     * @param obj 转换对象
     * @return Long
     */
    public static Long safeToLong(Object obj) {
        if (obj == null) return null;
        if (obj instanceof Long) return (Long) obj;
        if (obj instanceof Number) return ((Number) obj).longValue();
        try {
            return Long.parseLong(obj.toString());
        } catch (NumberFormatException e) {
            throw new IllegalArgumentException("无法转换为Long: " + obj);
        }
    }
}

你可能感兴趣的:(Java + Spring Boot + Mybatis 插入数据后,获取自增 id 的示例代码)