package com.xly.util; import com.xly.exception.sqlexception.SqlExecuteException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; /** * MySQL SQL执行工具(基于Spring JdbcTemplate) */ @Component public class SqlExecuteUtil { private static final Logger log = LoggerFactory.getLogger(SqlExecuteUtil.class); @Resource private JdbcTemplate jdbcTemplate; // Spring自动注入,无需手动配置 /** * 执行MySQL SELECT语句,返回结构化结果 * @param sql 已校验的可执行SQL * @return List 保持列顺序 */ public List> executeSelectSql(String sql) { try { log.info("开始执行MySQL SELECT语句:{}", sql); // 自定义RowMapper,解析结果集为LinkedHashMap(保持列顺序) return jdbcTemplate.query(sql, (RowMapper>) (rs, rowNum) -> { Map rowMap = new LinkedHashMap<>(); ResultSetMetaData metaData = rs.getMetaData(); int columnCount = metaData.getColumnCount(); for (int i = 1; i <= columnCount; i++) { rowMap.put(metaData.getColumnName(i), rs.getObject(i)); } return rowMap; }); } catch (Exception e) { log.error("MySQL SQL执行失败", e); throw new SqlExecuteException("SQL执行失败!错误信息:" + e.getMessage(), e); } } }