查询
查询是执行带有结果的SQL语句并获取结果集的操作。
info
- dbVisitor 支持多种参数传递方式,为了便于理解下面执行 SQL 的案例中选择常用的 无参数、位置参数、名称参数 三种。
- 想要了解更多参数传递内容请到 参数传递 页面查看。
下面列出了一些常见用法:
查询结果集
有许多种方式都可以进行查询并获取结果集。下面列出几种常见的形式:
-
返回 List/Map
使用原始 SQLList<Map<String, Object>> result = jdbc.queryForList("select * from users");
使用位置参数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);infoqueryForList 查询返回的 List 结构中使用 LinkedCaseInsensitiveMap 或 LinkedHashMap 类型进行行数据的存储。
- 更加详细信息请参考使用 List/Map 接收数据中的 结果集列名大小写敏感性。
-
使用 RowMapper
使用原始 SQLRowMapper<User> rowMapper = ...
List<User> result = jdbc.queryForList("select * from users", rowMapper);使用位置参数RowMapper<User> rowMapper = ...
Object[] args = new Object[]{ 2 };
List<User> result = jdbc.queryForList("select * from users where id > ?", args, rowMapper);使用名称参数RowMapper<User> rowMapper = ...
Map<String, Object> args = CollectionUtils.asMap("id", 2);
List<User> result = jdbc.queryForList("select * from users where id > :id", args, rowMapper); -
使用原始 SQL
List<User> result = jdbc.queryForList("select * from users", 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
ResultSetExtractor<T> extractor = ...
T result = jdbc.query("select * from users", extractor);使用位置参数ResultSetExtractor<T> extractor = ...
T result = jdbc.query("select * from users where id > ?", args, extractor);使用名称参数ResultSetExtractor<T> extractor = ...
T result = jdbc.query("select * from users where id > :id", args, extractor);
查询一行
当查询结果预期只有一条记录时,可以通过下面几种形式的方法获取映射后的结果。
- 使用 Map
使用原始 SQL
Map<String, Object> user = jdbc.queryForMap("select * from users where name = 'Bob'");
使用位置参数Object[] args = new Object[]{ 2 };
Map<String, Object> user = jdbc.queryForMap("select * from users where name = ?", args);使用名称参数Map<String, Object> args = CollectionUtils.asMap("name", "Bob");
Map<String, Object> user = jdbc.queryForMap("select * from users where name = :name", args);infoqueryForMap 查询结果会使用 LinkedCaseInsensitiveMap 或 LinkedHashMap 类型存储行数据。
- 更加详细信息请参考 使用 List/Map 接收数据。
- 使用 RowMapper
使用原始 SQL
RowMapper<User> rowMapper = ...
List<User> result = jdbc.queryForObject("select * from users where name = 'Bob'", rowMapper);使用位置参数RowMapper<User> rowMapper = ...
Object[] args = new Object[]{ 2 };
List<User> result = jdbc.queryForObject("select * from users where name = ?", args, rowMapper);使用名称参数RowMapper<User> rowMapper = ...
Map<String, Object> args = CollectionUtils.asMap("name", "Bob");
List<User> result = jdbc.queryForObject("select * from users where name = :name", args, rowMapper); - 使用 对象映射
使用原始 SQL
List<User> result = jdbc.queryForObject("select * from users where name = 'Bob'", User.class);
使用位置参数Object[] args = new Object[]{ 2 };
List<User> result = jdbc.queryForObject("select * from users where name = ?", args, User.class);使用名称参数Map<String, Object> args = CollectionUtils.asMap("name", "Bob");
List<User> result = jdbc.queryForObject("select * from users where name = :name", args, User.class);
查询单值
当查询结果预期只是一个值时,可以通过下面几种形式的方式获取查询的值。
- int 类型
使用原始 SQL
int result = jdbc.queryForInt("select count(*) from users where age > 21");
使用位置参数Object[] args = new Object[]{ 21 };
int result = jdbc.queryForInt("select count(*) from users where age > ?", args);使用名称参数Map<String, Object> args = CollectionUtils.asMap("age", 21);
int result = jdbc.queryForInt("select count(*) from users where age > :age", args); - long 类型
使用原始 SQL
int result = jdbc.queryForLong("select count(*) from users where age > 21");
使用位置参数Object[] args = new Object[]{ 21 };
int result = jdbc.queryForLong("select count(*) from users where age > ?", args);使用名称参数Map<String, Object> args = CollectionUtils.asMap("age", 21);
int result = jdbc.queryForLong("select count(*) from users where age > :age", args); - 字符串 类型
使用原始 SQL
String name = jdbc.queryForString("select name from users where id = 2", User.class);
使用位置参数Object[] args = new Object[]{ 2 };
String name = jdbc.queryForString("select name from users where id = ?", args, User.class);使用名称参数Map<String, Object> args = CollectionUtils.asMap("id", 2);
String name = jdbc.queryForString("select name from users where id = :id", args, User.class); - 类型处理器
使用原始 SQL
LocalDateTime result = jdbc.queryForObject("select create_time from users where name = 'Bob'", LocalDateTime.class);
使用位置参数Object[] args = new Object[]{ 2 };
LocalDateTime result = jdbc.queryForObject("select create_time from users where name = ?", args, LocalDateTime.class);使用名称参数Map<String, Object> args = CollectionUtils.asMap("name", "Bob");
LocalDateTime result = jdbc.queryForObject("select create_time from users where name = :name", args, LocalDateTime.class);
查询值列表
值列表方式查询是指查询只返回一个列。被查询的列可以是 TypeHandlerRegistry 注册器中注册的类型。
- 使用方式
使用原始 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);
查询中处理数据
通过 RowCallbackHandler 专注每一行的数据处理,而非获取结果集。
RowCallbackHandler handler = new RowCallbackHandler() {
@Override
public void processRow(ResultSet rs, int rowNum) throws SQLException {
...
}
};
使用原始 SQL
RowCallbackHandler handler = ...
jdbc.query("select * from users", handler);
使用位置参数
RowCallbackHandler handler = ...
Object[] args = new Object[]{ 2 };
jdbc.query("select * from users where id = ?", args, handler);
使用名称参数
RowCallbackHandler handler = ...
Map<String, Object> args = CollectionUtils.asMap("name", "Bob");
jdbc.query("select * from users where name = :name", args, handler);