特点:
1、单个参数
2、使用 useGeneratedKeys="false"、selectKey
3、通过实体类的 id 接收自增 id 的值(Integer),定义 resultType="java.lang.Integer"
4、useGeneratedKeys="false"、
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
特点:
1、多个参数,Mapper中使用@Param
2、使用 useGeneratedKeys="true" keyProperty="idHolder.generatedId",多个参数的情况下,generatedId前面需要@Param的参数名做为前缀
3、通过 Map 接收自增 id 的值(Integer),Map结构类型为
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);
}
}
}