Skip to main content

查询

查询是执行带有结果的SQL语句并获取结果集的操作。

info
  • dbVisitor 支持多种参数传递方式,为了便于理解下面执行 SQL 的案例中选择常用的 无参数位置参数名称参数 三种。
  • 想要了解更多参数传递内容请到 参数传递 页面查看。

下面列出了一些常见用法:

查询结果集

有许多种方式都可以进行查询并获取结果集。下面列出几种常见的形式:

  • 返回 List/Map

    使用原始 SQL
    List<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);
    info

    queryForList 查询返回的 List 结构中使用 LinkedCaseInsensitiveMapLinkedHashMap 类型进行行数据的存储。

  • 使用 RowMapper

    使用原始 SQL
    RowMapper<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);
  • 使用 ResultSetExtractor

    使用原始 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);
    info

    queryForMap 查询结果会使用 LinkedCaseInsensitiveMapLinkedHashMap 类型存储行数据。

  • 使用 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);