介绍
介绍
今天我们来学习如何使用 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”了