package com.common.service;
import org.springframework.jdbc.core.ConnectionCallback;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
/**
* 使用一个固定 {@link PreparedStatement} 写入一批标准化事实。
*
*
字段白名单和 NULL 的 JDBC 类型从目标表元数据读取并缓存。每个批次只根据字段并集生成
* 一次 INSERT,后续每行只绑定参数和 {@code addBatch()},避免 MyBatis 动态 XML 为每行执行
* 数百次 OGNL 表达式和反射方法查找。
*/
@Component
public class DmPreparedBatchInserter {
static final String NORMAL_TABLE = "syslog_normal_data";
static final String ALARM_TABLE = "syslog_normal_alarm";
private final JdbcTemplate jdbcTemplate;
private final ConcurrentMap metadataCache = new ConcurrentHashMap<>();
public DmPreparedBatchInserter(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public BatchExecution insert(boolean alarmTable, List