From 9fce552f48c898b61fa1cb9be73aa4ae7dfc5bb4 Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期五, 28 三月 2025 14:07:53 +0800
Subject: [PATCH] 设备导入优化
---
basic-server/src/main/resources/mapper/LaboratoryMapper.xml | 8 +
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceServiceImpl.java | 137 ++++++++++++++++++++-------
basic-server/src/main/java/com/ruoyi/basic/mapper/LaboratoryMapper.java | 4
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceDto.java | 10 +
cnas-device/src/main/resources/mapper/DeviceMapper.xml | 16 +++
cnas-device/src/main/java/com/ruoyi/device/excel/upload/DeviceListener.java | 4
ruoyi-system/src/main/resources/mapper/system/UserMapper.xml | 6 +
ruoyi-common/src/main/java/com/ruoyi/common/utils/LocalDateTimeStringConverters.java | 84 ++++++++++++++++
ruoyi-system/src/main/java/com/ruoyi/system/mapper/UserMapper.java | 2
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceController.java | 9 -
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMapper.java | 3
11 files changed, 236 insertions(+), 47 deletions(-)
diff --git a/basic-server/src/main/java/com/ruoyi/basic/mapper/LaboratoryMapper.java b/basic-server/src/main/java/com/ruoyi/basic/mapper/LaboratoryMapper.java
index df6aab9..fe6eea4 100644
--- a/basic-server/src/main/java/com/ruoyi/basic/mapper/LaboratoryMapper.java
+++ b/basic-server/src/main/java/com/ruoyi/basic/mapper/LaboratoryMapper.java
@@ -7,6 +7,9 @@
import com.ruoyi.basic.pojo.Laboratory;
import org.apache.ibatis.annotations.Param;
+import java.util.List;
+import java.util.Set;
+
/**
* 瀹為獙瀹ょ鐞�(Laboratory)琛ㄦ暟鎹簱璁块棶灞�
*/
@@ -16,5 +19,6 @@
Object obtainItemParameterList(@Param("page") Page page, @Param("ew") QueryWrapper<Laboratory> ew);
+ List<Laboratory> selectByName(@Param("names") Set<String> names);
}
diff --git a/basic-server/src/main/resources/mapper/LaboratoryMapper.xml b/basic-server/src/main/resources/mapper/LaboratoryMapper.xml
index c3ab2b4..cf43352 100644
--- a/basic-server/src/main/resources/mapper/LaboratoryMapper.xml
+++ b/basic-server/src/main/resources/mapper/LaboratoryMapper.xml
@@ -39,4 +39,12 @@
left join user u1 on l.create_user = u1.id
) a
</select>
+ <select id="selectByName" resultType="com.ruoyi.basic.pojo.Laboratory">
+ SELECT id, laboratory_name
+ FROM laboratory
+ WHERE laboratory_name IN
+ <foreach collection="names" item="name" open="(" separator="," close=")">
+ #{name}
+ </foreach>
+ </select>
</mapper>
diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceController.java
index 5f0ab10..533c9c7 100644
--- a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceController.java
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceController.java
@@ -3,9 +3,8 @@
import com.alibaba.excel.EasyExcel;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ruoyi.basic.excel.StructureTestObjectData;
-import com.ruoyi.basic.excel.StructureTestObjectListener;
import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.utils.LocalDateTimeStringConverters;
import com.ruoyi.device.dto.DataConfigDto;
import com.ruoyi.device.dto.DeviceCollectionDto;
import com.ruoyi.device.dto.DeviceDto;
@@ -16,7 +15,6 @@
import com.ruoyi.device.service.DeviceService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
-import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
@@ -27,7 +25,6 @@
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
-import java.io.InputStream;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
@@ -209,7 +206,9 @@
@PostMapping("/importDevice")
public Result importDevice(@RequestParam("file") MultipartFile file){
try {
- EasyExcel.read(file.getInputStream(), Device.class, new DeviceListener(deviceService)).sheet().doRead();
+ EasyExcel.read(file.getInputStream(), Device.class, new DeviceListener(deviceService))
+ .registerConverter(new LocalDateTimeStringConverters())
+ .sheet().doRead();
} catch (IOException e) {
// 杩欓噷鍙互鏍规嵁瀹為檯鎯呭喌杩涜鏇村畬鍠勭殑閿欒澶勭悊锛屾瘮濡傝褰曟棩蹇楃瓑
System.err.println("璇诲彇鏂囦欢鏃跺彂鐢熼敊璇�: " + e.getMessage());
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceDto.java
index da16e75..d62a61a 100644
--- a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceDto.java
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceDto.java
@@ -6,7 +6,6 @@
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
-
import java.time.LocalDateTime;
@Data
@@ -39,5 +38,14 @@
@ApiModelProperty(value = "涓嬫鏍″噯鏃ユ湡")
private LocalDateTime nextCalibrationDateTwo;
+ private String deviceName;
+ private String specModel;
+ private String manageNumber;
+ // 鍏ㄥ弬鏋勯�犲嚱鏁�
+ public DeviceDto(String deviceName, String specModel, String manageNumber) {
+ this.deviceName = deviceName;
+ this.specModel = specModel;
+ this.manageNumber = manageNumber;
+ }
}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/excel/upload/DeviceListener.java b/cnas-device/src/main/java/com/ruoyi/device/excel/upload/DeviceListener.java
index 758f317..8f30083 100644
--- a/cnas-device/src/main/java/com/ruoyi/device/excel/upload/DeviceListener.java
+++ b/cnas-device/src/main/java/com/ruoyi/device/excel/upload/DeviceListener.java
@@ -3,12 +3,8 @@
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
-import com.ruoyi.basic.excel.StructureTestObjectData;
-import com.ruoyi.basic.service.ProductService;
import com.ruoyi.device.pojo.Device;
import com.ruoyi.device.service.DeviceService;
-import com.ruoyi.performance.dto.AuxiliaryCorrectionHoursDto;
-import com.ruoyi.performance.service.AuxiliaryCorrectionHoursService;
import java.util.ArrayList;
import java.util.List;
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMapper.java
index 92a8b2d..1637118 100644
--- a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMapper.java
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMapper.java
@@ -10,6 +10,7 @@
import java.util.List;
import java.util.Map;
+import java.util.Set;
/**
* 璁惧(Device)琛ㄦ暟鎹簱璁块棶灞�
@@ -36,5 +37,7 @@
List<Map<String, Object>> treeDevice(@Param("deviceName") String deviceName);
DeviceDto selectDeviceByCode(Integer id);
+
+ List<Device> selectByKeys(@Param("keys") Set<DeviceDto> keys);
}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceServiceImpl.java
index 8285c04..f1aacac 100644
--- a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceServiceImpl.java
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceServiceImpl.java
@@ -1,9 +1,10 @@
package com.ruoyi.device.service.impl;
-import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import com.alibaba.fastjson2.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
@@ -34,16 +35,14 @@
import com.ruoyi.inspect.mapper.InsSampleMapper;
import com.ruoyi.inspect.pojo.InsProduct;
import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
-import com.ruoyi.performance.dto.AuxiliaryCorrectionHoursDto;
-import com.ruoyi.performance.pojo.AuxiliaryCorrectionHours;
import com.ruoyi.system.mapper.SysDictDataMapper;
import com.ruoyi.system.mapper.UserMapper;
import lombok.AllArgsConstructor;
import org.apache.logging.log4j.util.Strings;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;
-import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@@ -54,7 +53,7 @@
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
-import java.util.regex.Pattern;
+import java.util.function.Function;
import java.util.stream.Collectors;
/**
@@ -509,49 +508,113 @@
}
}
-
- //瀵煎叆璁惧
@Override
- public void importExcel(List<Device> list){
- if (CollectionUtil.isEmpty(list)) {
+ @Transactional(isolation = Isolation.READ_COMMITTED, rollbackFor = Exception.class)
+ public void importExcel(List<Device> batch) {
+ if (CollectionUtils.isEmpty(batch)) {
return;
}
- List<Device> deviceList = new ArrayList<>();
- List<Device> devices = new ArrayList<>();
- for (Device device : list) {
- Device device1 = deviceMapper.selectOne(Wrappers.<Device>lambdaQuery()
- .eq(Device::getDeviceName, device.getDeviceName())
- .eq(Device::getSpecificationModel, device.getSpecificationModel())
- .eq(Device::getManagementNumber, device.getManagementNumber()));
- //绠$悊浜�
- if (ObjectUtils.isNotEmpty(device.getEquipmentManagerName())){
- //鏌ュ搴旂鐞嗕汉
- User user = userMapper.selectOne(Wrappers.<User>lambdaQuery()
- .eq(User::getName, device.getEquipmentManagerName()));
- device.setEquipmentManager(user.getId());
- }
- //鎵�灞為儴闂�
- if (ObjectUtils.isNotEmpty(device.getSubordinateDepartments())){
- //鏌ュ搴旀墍灞為儴闂�
- Laboratory laboratory = laboratoryMapper.selectOne(Wrappers.<Laboratory>lambdaQuery()
- .eq(Laboratory::getLaboratoryName,device.getSubordinateDepartments()));
- device.setSubordinateDepartmentsId(laboratory.getId());
- }
+
+ // 1. 鎵归噺鏌ヨ鍏宠仈鏁版嵁锛堢敤鎴枫�佸疄楠屽锛�
+ Map<String, Integer> userMap = queryUserMap(batch);
+ Map<String, Integer> labMap = queryLabMap(batch);
+
+ // 2. 鍐呭瓨澶勭悊锛氳浆鎹㈠叧鑱斿瓧娈靛苟鍘婚噸
+ processBatch(batch, userMap, labMap);
+
+ // 3. 鎵归噺鎿嶄綔鏁版嵁搴�
+ batchOperate(batch);
+ }
+
+ private Map<String, Integer> queryUserMap(List<Device> batch) {
+ Set<String> managerNames = batch.stream()
+ .map(Device::getEquipmentManagerName)
+ .filter(Objects::nonNull)
+ .collect(Collectors.toSet());
+ if (CollUtil.isEmpty(managerNames)) {
+ return Collections.emptyMap();
+ }
+ return userMapper.selectList(
+ new LambdaQueryWrapper<User>().in(User::getName, managerNames)
+ ).stream().collect(Collectors.toMap(User::getName, User::getId));
+ }
+
+ private Map<String, Integer> queryLabMap(List<Device> batch) {
+ Set<String> labNames = batch.stream()
+ .map(Device::getSubordinateDepartments)
+ .filter(Objects::nonNull)
+ .collect(Collectors.toSet());
+ if (CollUtil.isEmpty(labNames)) {
+ return Collections.emptyMap();
+ }
+ return laboratoryMapper.selectList(
+ new LambdaQueryWrapper<Laboratory>().in(Laboratory::getLaboratoryName, labNames)
+ ).stream().collect(Collectors.toMap(Laboratory::getLaboratoryName, Laboratory::getId));
+ }
+
+ private void processBatch(List<Device> batch, Map<String, Integer> userMap, Map<String, Integer> labMap) {
+ // 棰勮绠楀敮涓�閿紙璁惧鍚嶇О+鍨嬪彿+绠$悊缂栧彿锛�
+ Map<String, Device> existDevices = deviceMapper.selectList(
+ new LambdaQueryWrapper<Device>()
+ .in(Device::getDeviceName, batch.stream().map(Device::getDeviceName).collect(Collectors.toSet()))
+ .in(Device::getSpecificationModel, batch.stream().map(Device::getSpecificationModel).collect(Collectors.toSet()))
+ .in(Device::getManagementNumber, batch.stream().map(Device::getManagementNumber).collect(Collectors.toSet()))
+ ).stream().collect(Collectors.toMap(
+ d -> d.getDeviceName() + "|" + d.getSpecificationModel() + "|" + d.getManagementNumber(),
+ Function.identity()
+ ));
+
+ List<Device> toInsert = new ArrayList<>();
+ List<Device> toUpdate = new ArrayList<>();
+
+ for (Device device : batch) {
+ // 杞崲鍏宠仈瀛楁
+ device.setEquipmentManager(userMap.get(device.getEquipmentManagerName()));
+ device.setSubordinateDepartmentsId(labMap.get(device.getSubordinateDepartments()));
+
//璁惧鐘舵��
if (ObjectUtils.isNotEmpty(device.getDeviceStatusName())){
//鏌ュ瓧鍏稿搴旂殑鍊�
String status = sysDictDataMapper.selectDictValue("device_status", device.getDeviceStatusName());
device.setDeviceStatus(Integer.parseInt(status));
}
- if (ObjectUtils.isNotEmpty(device1)) {
- devices.add(device1);
+
+ // 鐢熸垚鍞竴閿�
+ String key = device.getDeviceName() + "|" + device.getSpecificationModel() + "|" + device.getManagementNumber();
+ if (existDevices.containsKey(key)) {
+ Device exist = existDevices.get(key);
+ BeanUtils.copyProperties(device, exist, "id");
+ toUpdate.add(exist);
} else {
- deviceList.add(device);
+ toInsert.add(device);
}
}
- //鎵归噺鏂板
- saveBatch(deviceList);
- //鎵归噺淇敼
- updateBatchById(devices);
+
+ batch.clear();
+ batch.addAll(toInsert);
+ batch.addAll(toUpdate);
+ }
+
+ private void batchOperate(List<Device> batch) {
+ // 鎷嗗垎鎻掑叆鍜屾洿鏂板垪琛�
+ List<Device> toInsert = new ArrayList<>();
+ List<Device> toUpdate = new ArrayList<>();
+ for (Device device : batch) {
+ if (device.getId() == null) {
+ toInsert.add(device);
+ } else {
+ toUpdate.add(device);
+ }
+ }
+
+ // 鎵归噺鎻掑叆锛堜娇鐢∕yBatis-Plus鐨刬nsertBatch锛岄粯璁atchSize=1000锛�
+ if (CollUtil.isNotEmpty(toInsert)) {
+ saveOrUpdateBatch(toInsert);
+ }
+
+ // 鎵归噺鏇存柊锛堜娇鐢∕yBatis-Plus鐨剈pdateBatchById锛岄粯璁atchSize=1000锛�
+ if (CollUtil.isNotEmpty(toUpdate)) {
+ updateBatchById(toUpdate);
+ }
}
}
diff --git a/cnas-device/src/main/resources/mapper/DeviceMapper.xml b/cnas-device/src/main/resources/mapper/DeviceMapper.xml
index 33fd802..a254044 100644
--- a/cnas-device/src/main/resources/mapper/DeviceMapper.xml
+++ b/cnas-device/src/main/resources/mapper/DeviceMapper.xml
@@ -181,4 +181,20 @@
u1.name,
u2.name
</select>
+
+ <select id="selectByKeys" resultType="com.ruoyi.device.pojo.Device">
+ SELECT
+ id, device_name, specification_model, management_number,
+ manufacturer, factory_no, technical_indicators, acquisition_date,
+ activation_date, equipment_manager, storage_point, subordinate_departments_id,
+ calibration_services, last_calibration_date, next_calibration_date, large_category,
+ unit_price, device_status, calibration_date, image_upload, image_name
+ FROM device
+ WHERE
+ <foreach collection="keys" item="key" separator=" OR " open="(" close=")">
+ (device_name = #{key.deviceName}
+ AND specification_model = #{key.specModel}
+ AND management_number = #{key.manageNumber})
+ </foreach>
+ </select>
</mapper>
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/LocalDateTimeStringConverters.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/LocalDateTimeStringConverters.java
new file mode 100644
index 0000000..5b6cad0
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/LocalDateTimeStringConverters.java
@@ -0,0 +1,84 @@
+package com.ruoyi.common.utils;
+
+import com.alibaba.excel.converters.Converter;
+import com.alibaba.excel.enums.CellDataTypeEnum;
+import com.alibaba.excel.metadata.GlobalConfiguration;
+import com.alibaba.excel.metadata.data.ReadCellData;
+import com.alibaba.excel.metadata.property.ExcelContentProperty;
+import com.ruoyi.common.exception.base.BaseException;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+
+public class LocalDateTimeStringConverters implements Converter<LocalDateTime> {
+
+ // 鏀寔鐨勬枃鏈棩鏈熸牸寮忥紙鎸変紭鍏堢骇灏濊瘯锛�
+ private static final List<DateTimeFormatter> STRING_FORMATTERS = Arrays.asList(
+ DateTimeFormatter.ofPattern("yyyy.MM.dd"),
+ DateTimeFormatter.ofPattern("yyyy.M.d"),
+ DateTimeFormatter.ofPattern("yyyy/MM/dd"),
+ DateTimeFormatter.ofPattern("yyyy-MM-dd"),
+ DateTimeFormatter.ofPattern("yyyyMMdd")
+ );
+
+ @Override
+ public Class<LocalDateTime> supportJavaTypeKey() {
+ return LocalDateTime.class; // 鐩爣 Java 绫诲瀷
+ }
+
+ @Override
+ public CellDataTypeEnum supportExcelTypeKey() {
+ return CellDataTypeEnum.STRING; // 榛樿鏀寔鐨� Excel 鍗曞厓鏍肩被鍨�
+ }
+
+ @Override
+ public LocalDateTime convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
+ // 妫�鏌ュ崟鍏冩牸鏄惁涓虹┖鎴栨棤鏁堝��
+ if (cellData == null || cellData.getType() == null ||
+ (cellData.getType() == CellDataTypeEnum.EMPTY)) {
+ return null;
+ }
+
+ // 鏍规嵁鍗曞厓鏍肩被鍨嬭繘琛屽鐞�
+ switch (cellData.getType()) {
+ case STRING: // 瀛楃涓茬被鍨�
+ String dateString = cellData.getStringValue().trim();
+ if (dateString.isEmpty() || "/".equals(dateString)) {
+ return null; // 鐗规畩鍊煎鐞�
+ }
+ // 灏濊瘯鎵�鏈夋敮鎸佺殑鏃ユ湡鏍煎紡
+ for (DateTimeFormatter formatter : STRING_FORMATTERS) {
+ try {
+ LocalDate localDate = LocalDate.parse(dateString, formatter);
+ LocalDateTime localDateTime = localDate.atStartOfDay();
+ return localDateTime; // 璁剧疆榛樿鏃堕棿涓� 00:00:00
+ } catch (DateTimeParseException ignored) {
+ // 蹇界暐鍗曚釜鏍煎紡鐨勮В鏋愬け璐ワ紝缁х画灏濊瘯涓嬩竴涓牸寮�
+ }
+ }
+ // 濡傛灉鎵�鏈夋牸寮忓潎澶辫触锛屽垯鎶涘嚭寮傚父
+ throw new BaseException("鏃犳硶瑙f瀽瀛楃涓叉棩鏈�: " + dateString);
+
+ case NUMBER: // 鏁板�肩被鍨嬶紙Excel 鏃ユ湡鏍煎紡锛�
+ try {
+ double excelNumber = cellData.getNumberValue().doubleValue();
+ Date date = org.apache.poi.ss.usermodel.DateUtil.getJavaDate(excelNumber, false);
+ return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
+ } catch (Exception e) {
+ throw new BaseException("鏃犳硶瑙f瀽鏁板�兼棩鏈�: " + cellData.getNumberValue());
+ }
+
+ case BOOLEAN: // 甯冨皵绫诲瀷
+ throw new BaseException("甯冨皵绫诲瀷涓嶆敮鎸佷綔涓烘棩鏈熷瓧娈�");
+
+ default:
+ throw new BaseException("涓嶆敮鎸佺殑鍗曞厓鏍肩被鍨�: " + cellData.getType());
+ }
+ }
+}
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/UserMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/UserMapper.java
index 210f2f9..d78dcd6 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/UserMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/UserMapper.java
@@ -8,6 +8,7 @@
import java.util.List;
import java.util.Map;
+import java.util.Set;
/**
* 鐢ㄦ埛淇℃伅琛�
@@ -60,5 +61,6 @@
List<User> selectDepartmentLimsUserList(@Param("userId") Integer userId);
+ List<User> selectByNames(@Param("names") Set<String> names);
}
diff --git a/ruoyi-system/src/main/resources/mapper/system/UserMapper.xml b/ruoyi-system/src/main/resources/mapper/system/UserMapper.xml
index f16af39..59a87d0 100644
--- a/ruoyi-system/src/main/resources/mapper/system/UserMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/UserMapper.xml
@@ -94,5 +94,11 @@
from user u2
where u2.id = #{userId})
</select>
+ <select id="selectByNames" resultType="com.ruoyi.common.core.domain.entity.User">
+ SELECT id, name FROM user WHERE name IN
+ <foreach item="name" collection="names" open="(" separator="," close=")">
+ #{name}
+ </foreach>
+ </select>
</mapper>
--
Gitblit v1.9.3