如何使用java lambda表达式实现RowMapper

时间:2017-01-29 16:46:44

标签: java spring lambda jdbctemplate

我有一个工作的RowMapper代码,它将数据库表行映射到java对象。我想用lambda表达式来改变实现。但是,我总是得到错误;代码段如下;

String queryString = "select * from person where person_id = ? ";
RowMapper rowMapper = (rs, rowNum) -> {

Person p = new Person();

p.setName(rs.getString("personName"));
p.setAddress(rs.getString("address"));
p.setAge(rs.getInt("age"));
}

Person person = getJdbcTemplate().query(queryString, personId, rowMapper);

return person;

有人可以帮我正确实现代码吗? 有想法获得人员名单吗?

4 个答案:

答案 0 :(得分:16)

RowMapper是一个带有单个抽象方法的接口(不是继承自>>> import imageio >>> imageio.plugins.ffmpeg.download() 的方法),所以it can be considered a functional interface。其功能方法采用ObjectResultSet,并返回一个对象。

代码的第一个问题是返回的对象类型是接口的泛型类型。与目前int一起使用时,您使用的是原始类型which you shouldn't do。第二个问题是lambda表达式不返回任何对象,因此它不能符合除了要返回的对象之外的函数方法。

因此,更正的代码将是:

RowMapper

答案 1 :(得分:3)

使用lambda表达式的RowMapper示例:

return jdbcTemplate.query(" select Scale_Point,Scale_Head from TEval_Scale ", new Object[] {},
                (resultSet, rowNum) ->{

                    TEvalScale tEvalScale = new TEvalScale();
                    tEvalScale.setScalePoint(resultSet.getInt("Scale_Point"));
                    tEvalScale.setScaleHead(resultSet.getString("Scale_Head"));
                    return tEvalScale;

                });

答案 2 :(得分:1)

@Tunaki是正确的。这是简写​​版本:

RowMapper<Person> rowMapper = (rs, rowNum) -> new Person(rs.getString("personName"), rs.getString("address"),rs.getInt("age")) ;

不需要括号和返回号,因为它们是隐含的。

答案 3 :(得分:0)

除了@Tunaki答案。

RowMapper<Person> rowMapper = (rs, rowNum) -> {
    Person p = new Person();
    p.setName(rs.getString("personName"));
    p.setAddress(rs.getString("address"));
    p.setAge(rs.getInt("age"));
    return p;
};

Map<String, Object> paramMap = new HashMap<>();
paramMap.put("person_id", personId);

如果您想获得一个人:

Person person = getJdbcTemplate().queryForObject(queryString, paramMap, rowMapper);

如果要获取人员列表:

List<Person> personList = getJdbcTemplate().query(queryString, paramMap, rowMapper);