1.业务描述
一次开发中,遇到接收多个表的数据,并批量插入数据库的需求,在此记录 代码逻辑
2.实际开发
因为涉及到的表有很多,差不多4,50个,所以考虑使用泛型和反射来简化代码,提高开发效率
2.1 接收数据bean
样例中会精简部分代码
/**
* 数据同步到保信--请求参数
* Created by Youdmeng on 2019/6/4 0004.
*/
@Data
public class SaveToBaoxin {
private String syncId;
/**
* 审核信息表
*/
@Valid
private List<CheckInfoEO> checkInfoEOList;
/**
* 组织机构表
*/
private List<OrgInfoEO> orgInfoEOList;
}
2.2 取出个属性的列表对象
使用反射依次获取每组数据,
因为每组数据的类型不尽相同,所有使用泛型T来接收
private void dataSave(SaveToBaoxin saveToBaoxin) {
List<SyncSuccessItemEO> successItemEOS = new ArrayList<>();
syncDate = new Date();
Class cls = saveToBaoxin.getClass();
Field[] fields = cls.getDeclaredFields();
for (Field field : fields) {
if (StringUtils.equals(field.getName(), "syncId")) {
continue;
}
field.setAccessible(true);
Object object = ReflectionUtils.getFieldValue(saveToBaoxin, field.getName());
List<T> list = (List<T>) object;
save(list, successItemEOS);
}
try {
baoXinDao.insertSuccessItemList(successItemEOS);
} catch (Exception e) {
logger.error("成功数据记录存储失败", e);
//手动回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}
2.3 核心保存代码
private <T> void save(List<T> list, List<SyncSuccessItemEO> successItemEOS) {
List<String> checkInfoEOKeyList = new ArrayList<>();
String table = null;
String tableDesc = "";
String dataDesc = "";//审核信息表
for (T t : list) {
Class<?> dataBean = t.getClass();
try {
table = SyncTableInfoEnums.getByLowerTableName(t.getClass().getSimpleName()).getTable();
tableDesc = SyncTableInfoEnums.getByLowerTableName(t.getClass().getSimpleName()).getTableDesc();
// dataDesc = t.getService() + "数据主键:" + checkInfoEO.getKeyId();
if (null == ReflectionUtils.getFieldValue(t, "id") || null == ReflectionUtils.getFieldValue(t, "systemId")) {
logger.error("|数据同步失败| " + " [" + table + "] [" + tableDesc + "] [" + dataDesc + "] [缺失数据主键]");
syncLogService.errorLog(t, table, tableDesc, dataDesc, "缺失数据主键");
} else {
ReflectionUtils.setFieldValue(t, "syncFlag", 2);
Class<?> syncDao = Class.forName("com.adc.da.manual.dao.manage.BaoxinSyncDao");
try {
ReflectionUtils
.invokeMethod(sqlSession.getMapper(