提示
本文内容结构参考了英文版文档,便于中英文对照。
查询
JdbcTemplate 提供多种只读查询 API。大多数接口接受 SQL 字符串和参数(对象或数组),返回由结果集构建的对象;部分接口支持回调/映射器以自定义处理过程。
查询结果集
查询一个对象或 Map 集合并返回。
- 示例:使用 Bean 映射结果集
- 示例:使用 Map 映射结果集
- 函数签名
// 原始 SQL
List<User> users = jdbc.queryForList(
"select * from users where id > 2", User.class);
// 位置参数
Object[] args = new Object[]{ 2 };
List<User> result = jdbc.queryForList(
"select * from users where id > ?", args, User.class);
// 名称参数
Map<String, Object> args = CollectionUtils.asMap("id", 2);
List<User> result = jdbc.queryForList(
"select * from users where id > :id", args, User.class);
// 原始 SQL
List<Map<String, Object>> users = jdbc.queryForList(
"select * from users where id > 2");
// 位置参数
Object[] args = new Object[]{ 2 };
List<Map<String, Object>> result = jdbc.queryForList(
"select * from users where id > ?", args);
// 名称参数
Map<String, Object> args = CollectionUtils.asMap("id", 2);
List<Map<String, Object>> result = jdbc.queryForList(
"select * from users where id > :id", args);
// 使用 对象映射 或 类型处理器
List<T> queryForList(String sql, Class<T> elementType);
List<T> queryForList(String sql, Object args, Class<T> elementType);
List<T> queryForList(String sql, PreparedStatementSetter pss, Class<T> elementType);
// 使用 RowMapper
List<T> queryForList(String sql, RowMapper<T> rowMapper);
List<T> queryForList(String sql, Object args, RowMapper<T> rowMapper);
List<T> queryForList(String sql, PreparedStatementSetter pss, RowMapper<T> rowMapper);
// 无需映射使用 List/Map 接收结果
List<Map<String, Object>> queryForList(String sql);
List<Map<String, Object>> queryForList(String sql, Object args);
List<Map<String, Object>> queryForList(String sql, PreparedStatementSetter pss);
查询对象
返回映射到指定类型的单行。常见场景:聚合查询、主键查找。若结果为多行会抛出异常。
- 示例:使用 Bean 映射结果集
- 示例:使用 Map 映射结果集
- 函数签名
// 原始 SQL
User user = jdbc.queryForObject(
"select * from users where id = 2", User.class);
// 位置参数
Object[] args = new Object[]{ 2 };
User user = jdbc.queryForObject(
"select * from users where id = ?", args, User.class);
// 名称参数
Map<String, Object> args = CollectionUtils.asMap("id", 2);
User user = jdbc.queryForObject(
"select * from users where id = :id", args, User.class);
// 原始 SQL
Map<String, Object> user = jdbc.queryForMap(
"select * from users where id = 2");
// 位置参数
Object[] args = new Object[]{ 2 };
Map<String, Object> user = jdbc.queryForMap(
"select * from users where id = ?", args);
// 名称参数
Map<String, Object> args = CollectionUtils.asMap("id", 2);
Map<String, Object> user = jdbc.queryForMap(
"select * from users where id = :id", args);
// 使用 对象映射 或 类型处理器
T queryForObject(String sql, Class<T> requiredType);
T queryForObject(String sql, Object args, Class<T> requiredType);
T queryForObject(String sql, PreparedStatementSetter pss, Class<T> requiredType);
// 使用 RowMapper
T queryForObject(String sql, RowMapper<T> rowMapper);
T queryForObject(String sql, Object args, RowMapper<T> rowMapper);
T queryForObject(String sql, PreparedStatementSetter pss, RowMapper<T> rowMapper);
// 无需映射使用 List/Map 接收结果
Map<String, Object> queryForMap(String sql);
Map<String, Object> queryForMap(String sql, Object args);
Map<String, Object> queryForMap(String sql, PreparedStatementSetter pss);
查询键值对
键值对是将查询到的结果集将第一个列和第二个列分别作为 Map 的 Key 和 Value 将整个结果集存储为一个 Map 类型。
- 示例
- 函数签名
// 原始 SQL
Map<Long, String> userMap = jdbc.queryForPairs(
"select uid, name from user where age > 2", Long.class, String.class);
// 位置参数
Object[] args = new Object[]{ 2 };
Map<Long, String> userMap = jdbc.queryForPairs(
"select uid, name from user where age > ?", Long.class, String.class, args);
// 名称参数
Map<String, Object> args = CollectionUtils.asMap("age", 2);
Map<Long, String> userMap = jdbc.queryForPairs(
"select uid, name from user where age > :age", Long.class, String.class, args);
// pairKey 和 pairValue 会使用 对象映射 或 类型处理器来进行映射。
Map<K, V> queryForPairs(String sql,
Class<K> pairKey, Class<V> pairValue);
Map<K, V> queryForPairs(String sql,
Class<K> pairKey, Class<V> pairValue, Object args);
Map<K, V> queryForPairs(String sql,
Class<K> pairKey, Class<V> pairValue, PreparedStatementSetter args);
查询值
查询值区别于查询对象是在于值是可映射的最小类型单元,可以是 TypeHandlerRegistry 注册器中的类型。如:String、Int、Date 等。查询值通常有两种情况:
- 查询值列表,例如获取符合条件的对象 ID 集合。
- 查询聚合汇总信息,例如统计总数,求平均值等。
- 示例:单值
- 示例:值列表
- 函数签名
// 原始 SQL
long count = jdbc.queryForLong(
"select count(*) from user where age > 2");
// 位置参数
Object[] args = new Object[]{ 2 };
long count = jdbc.queryForLong(
"select count(*) from user where age > ?", args);
// 名称参数
Map<String, Object> args = CollectionUtils.asMap("age", 2);
long count = jdbc.queryForLong(
"select count(*) from user where age > :age", args);
提示
- jdbc.queryForObject("select count(*) from users", Integer.class); // 具有等效 能力
// 原始 SQL
List<String> result = jdbc.queryForList(
"select name from users", String.class);
// 位置参数
Object[] args = new Object[]{ 2 };
List<String> result = jdbc.queryForList(
"select name from users where name = ?", args, String.class);
// 名称参数
Map<String, Object> args = CollectionUtils.asMap("name", "Bob");
List<String> result = jdbc.queryForList(
"select name from users where id = :id", args, String.class);
// 查 询 Long 类型值
Long queryForLong(String sql);
Long queryForLong(String sql, Object args);
Long queryForLong(String sql, PreparedStatementSetter args)
// 查询 int 类型值
Integer queryForInt(String sql);
Integer queryForInt(String sql, Object args);
Integer queryForInt(String sql, PreparedStatementSetter args);
// 查询字符串类型值
String queryForString(String sql);
String queryForString(String sql, Object args);
String queryForString(String sql, PreparedStatementSetter args);
使用 ResultSetExtractor
使用 ResultSetExtractor 接口是最灵活处理结果集的方式,用户需要自行实现执行从 ResultSet 中提取结果的实际工作,同时无需担心异常处理。
- 示例
- 函数签名
// 使用 ResultSetExtractor 自定义结果提取
User user = jdbc.query(
"select * from users where id = ?",
new Object[]{ 1 },
(ResultSetExtractor<User>) rs -> {
if (rs.next()) {
User u = new User();
u.setId(rs.getLong("id"));
u.setName(rs.getString("name"));
return u;
}
return null;
}
);
// 使用 ResultSetExtractor
T query(String sql, ResultSetExtractor<T> rse);
T query(String sql, Object args, ResultSetExtractor<T> rse);
T query(String sql, PreparedStatementSetter args, ResultSetExtractor<T> rse);