jdbcTemplate使用List<Map<String,Object>> 接收 列名英文成了大写

关于 JdbcTemplate 查询结果中列名变成大写的问题,这是由于数据库和 JDBC 驱动的默认行为导致的。以下是几种解决方案:
问题原因
数据库驱动行为:某些数据库驱动(如 Oracle)默认将列名转换为大写
JDBC 规范:JDBC 规范允许驱动程序以特定方式处理列名大小写
列名引用方式:使用 SELECT column 而不是 SELECT "column" 可能导致大小写处理问题
解决方案

  1. 使用别名保持原始大小写````
    String sql = "SELECT user_id as "userId", user_name as "userName" FROM users";
    List<Map<String, Object>> result = jdbcTemplate.queryForList(sql);

  2. 配置数据源保持列名大小写(以 Oracle 为例)
    // 在连接字符串中添加属性
    String url = "jdbc:oracle:thin:@localhost:1521:xe";
    Properties props = new Properties();
    props.setProperty("user", "username");
    props.setProperty("password", "password");
    props.setProperty("oracle.jdbc.mapNameToUpperCase", "false"); // 保持大小写

  3. 自定义 RowMapper 处理列名
    List<Map<String, Object>> result = jdbcTemplate.query(sql, new RowMapper<Map<String, Object>>() {
    @Override
    public Map<String, Object> mapRow(ResultSet rs, int rowNum) throws SQLException {
    Map<String, Object> row = new LinkedHashMap<>();
    ResultSetMetaData metaData = rs.getMetaData();
    int columnCount = metaData.getColumnCount();

     for (int i = 1; i <= columnCount; i++) {
         String columnName = metaData.getColumnLabel(i); // 使用 getColumnLabel 保持别名
         row.put(columnName, rs.getObject(i));
     }
     return row;
    

    }
    });

  4. 后处理转换列名
    List<Map<String, Object>> originalResult = jdbcTemplate.queryForList(sql);
    List<Map<String, Object>> processedResult = originalResult.stream().map(row -> {
    Map<String, Object> newRow = new LinkedHashMap<>();
    row.forEach((key, value) -> {
    // 根据需要转换列名,例如转为小写或驼峰命名
    String newKey = key.toLowerCase(); // 或其他转换逻辑
    newRow.put(newKey, value);
    });
    return newRow;
    }).collect(Collectors.toList());

  5. 使用 ColumnMapRowMapper 自定义实现
    public class CaseSensitiveColumnMapRowMapper implements RowMapper<Map<String, Object>> {
    @Override
    public Map<String, Object> mapRow(ResultSet rs, int rowNum) throws SQLException {
    Map<String, Object> map = new LinkedHashMap<>();
    ResultSetMetaData rsmd = rs.getMetaData();
    int columnCount = rsmd.getColumnCount();

     for (int index = 1; index <= columnCount; index++) {
         String column = rsmd.getColumnLabel(index); // 使用 label 而非 name
         map.put(column, rs.getObject(index));
     }
     return map;
    

    }
    }

// 使用方式
List<Map<String, Object>> result = jdbcTemplate.query(sql, new CaseSensitiveColumnMapRowMapper());

posted @ 2025-08-18 21:10  eagle88  阅读(66)  评论(0)    收藏  举报