如何使用 java lambda 表达式实现 RowMapper
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/41923360/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to implement RowMapper using java lambda expression
提问by nwGCham
I had a working RowMapper code that maps database table row in to a java object. I wanted to change the implementation using lambda expression. However, I am always getting error; Code snippet as follows;
我有一个有效的 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;
Can someone help me to implement code correctly? Any idea to get list of persons?
有人可以帮我正确实现代码吗?任何想法获得人员名单?
回答by Tunaki
RowMapper
is a interface with a single abstract method (not inheriting from a method of Object
), so it can be considered a functional interface. Its functional method takes a ResultSet
and a int
, and returns an object.
RowMapper
是一个具有单个抽象方法的接口(不是从 的方法继承Object
),因此可以认为它是一个函数式接口。它的函数方法接受 aResultSet
和 a int
,并返回一个对象。
The first problem with the code is that the type of the object returned is a generic type of the interface. As currently used with RowMapper
, you're using a raw-type, which you shouldn't do. The second issue is that the lambda expression does not return any object, so it cannot conform to the functional method which except an object to be returned.
代码的第一个问题是返回的对象类型是接口的泛型类型。当前与 一起使用时RowMapper
,您使用的是原始类型,而您不应该这样做。第二个问题是 lambda 表达式不返回任何对象,因此它不符合除了要返回的对象的函数方法。
As such, a corrected code would be:
因此,更正后的代码将是:
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;
};
回答by Ferdous Wahid
RowMapper using lambda expression example:
RowMapper 使用 lambda 表达式示例:
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;
});
回答by NuAlphaMan
@Tunaki is correct. Here is the shorthand version:
@Tunaki 是正确的。这是速记版本:
RowMapper<Person> rowMapper = (rs, rowNum) -> new Person(rs.getString("personName"), rs.getString("address"),rs.getInt("age")) ;
The brackets and the return aren't needed as they are implied.
不需要括号和返回,因为它们是隐含的。
回答by Rahul Chauhan
In addition to @Tunaki answer.
除了@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);
If you want to get single Person :
如果你想获得单身人士:
Person person = getJdbcTemplate().queryForObject(queryString, paramMap, rowMapper);
If you want to get List of Person :
如果您想获取人员列表:
List<Person> personList = getJdbcTemplate().query(queryString, paramMap, rowMapper);