跳到主要内容

9.2 List/Map

使用 Map 接收查询结果是最通用的方式,每行数据以 Map<String, Object> 表示列名到值的映射,无需预先定义实体类。

单行查询
Map<String, Object> data = jdbc.queryForMap("select * from users where id = 1");

如何使用​

例:编程式 API
List<Map<String, Object>> result = jdbc.queryForList("select * from users");
例:声明式 API
@SimpleMapper
public interface UserMapper {
@Query("select * from users where id > #{id}")
List<Map<String, Object>> listUsers(@Param("id") long searchId);
}
例:构造器 API
List<Map<String, Object>> result = lambda.query(User.class)
.le(User::getId, 100)
.queryForMapList();
例:在 Mapper File 中使用
<select id="queryListByAge" resultType="map">
select * from users where age = #{age}
</select>
resultType 可选值
值对应类型说明
mapLinkedCaseInsensitiveMap(默认)列名大小写不敏感,受全局配置影响
hashmapHashMap无序,列名大小写敏感
linkedmapLinkedHashMap保持插入顺序,列名大小写敏感
caseinsensitivemapLinkedCaseInsensitiveMap列名大小写不敏感

列名大小写敏感​

不同数据库返回的列名大小写可能不同。例如 Oracle 常见返回大写列名,MySQL 常见返回小写列名。为了让 row.get("id")、row.get("ID") 都能工作,dbVisitor 默认使用大小写不敏感的 Map。

默认:列名大小写不敏感
List<Map<String, Object>> rows = jdbc.queryForList("select * from users");
Object id = rows.get(0).get("id");
Object sameId = rows.get(0).get("ID");

如果希望严格保留数据库返回的列名大小写,可以关闭该行为。

严格区分大小写
JdbcTemplate jdbc = ...;
jdbc.setResultsCaseInsensitive(false);

List<Map<String, Object>> rows = jdbc.queryForList("select * from users");

关闭后会使用 LinkedHashMap 保存结果,列名 key 将严格区分大小写。