JdbcTemplate的queryForList的使用

发表于 2020-06-09 15:23:03
阅读 121

介绍

介绍

今天我们来学习如何使用 JdbcTemplate 的 queryForList 方法进行数据的查询操作

教程

queryForList(String sql)

这个方法会将查询结果放入 List<Map<String, Object>> 泛型集合里面

List<Map<String, Object>> results = rs.queryForList("SELECT userId, userName " +
        "FROM USER LIMIT 10");

queryForList(String sql, Object... args)

这个方法和上面的方法用法一样,可以传递参数

List<Map<String, Object>> results = rs.queryForList("SELECT userId, userName " +
        "FROM USER " +
        "WHERE userId > ? AND userFlag = ? LIMIT 10", 100, 6);

queryForList(String sql, Class<T> elementType)

这个方法很坑,看上去很美丽,可以映射结果集数据到 Class<T> 的实例属性上,其实不然

如果直接写下面的语法

List<UserInfo> results = rs.queryForList("SELECT userId, userName " +
        "FROM USER " +
        "WHERE userId > ? AND userFlag = ? LIMIT 10", UserInfo.class, 100, 6);

会报这样的错误

Incorrect column count: expected 1, actual 2

这是因为这个  Class<T> 只支持基础的 String, Integer 之类的类型

query(String sql, RowMapper<T> rowMapper)

我们可以使用 query 方法来完成结果集数据自动映射到

自定义 RowMapper 对象

定义实体 UserInfo

@Data
class UserInfo {
    Integer userId;
    String userName;
}

定义 RowMapper

class UserInfoRowMapper implements RowMapper<UserInfo> {

    @Override
    public UserInfo mapRow(ResultSet rs, int i)
            throws SQLException {
        UserInfo userInfo = new UserInfo();
        userInfo.setUserId(rs.getInt("userId"));
        userInfo.setUserName(rs.getString("userName"));

        return userInfo;
    }
}

调用 RowMapper

List<UserInfo> results = rs.query("SELECT userId, userName " +
        "FROM USER " +
        "WHERE userId > ? AND userFlag = ? LIMIT 10", new UserInfoRowMapper(), 100, 6);

使用 BeanPropertyRowMapper 对象

定义实体 UserInfo

@Data
class UserInfo {
    Integer userId;
    String userName;
}

调用 BeanPropertyRowMapper

List<UserInfo> results = rs.query("SELECT userId, userName " +
        "FROM USER " +
        "WHERE userId > ? AND userFlag = ? LIMIT 10", new BeanPropertyRowMapper<>(UserInfo.class), 100, 6);

总结

  • 使用 queryForList 获取结果集到 List<Map<String, Object>> 是最简单的方法

  • 需要自动映射实体对象的时候,可以考虑通过 BeanPropertyRowMapper 对象将 query 获取到的结果集自动映射到实体对象

  • 如果需要在映射实体对象的时候,进行一些数据转换操作,则需要使用 RowMapper 对象自定义映射逻辑

  • 使用自动映射实体对象的方式执行效率是最快的,因为我们事先给出了对象字段的类型,不需要系统去“try”了