最近在复习sqping,选择看spring实战第五版,但是其中总会有不理解的地方,所以选择解决之后并记录
package tacos.data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import tacos.Ingredient;
import java.sql.ResultSet;
import java.sql.SQLException;
@Repository
public class JdbcIngredientRepository implements IngredientRepository {
@Autowired
JdbcTemplate jdbc;
public JdbcIngredientRepository(JdbcTemplate jdbc){
this.jdbc=jdbc;
}
@Override
public Iterable findAll() {
return jdbc.query("select id,name,type from Ingredient",this::mapRowToIngredient);
}
@Override
public Ingredient findOne(String id) {
return jdbc.queryForObject("select * from Ingredient where id=?",this::mapRowToIngredient,id);
}
@Override
public Ingredient save(Ingredient ingredient) {
jdbc.update("insert into Ingredient(id,name,type)value (?,?,?)",ingredient.getId(),
ingredient.getName(),ingredient.getType().toString());
return ingredient;
}
private Ingredient mapRowToIngredient(ResultSet re,int rowNum) throws SQLException {
return new Ingredient(re.getNString("id"),re.getNString("name"),
Ingredient.Type.valueOf(re.getNString("Type")));
}
}
我的疑问是query方法的第二个参数是rowmapper,作用完成数据自动装配到javaBean对象
但是为什么可以用最下面自定义的方法来代替第二个参数
private Ingredient mapRowToIngredient(ResultSet re,int rowNum) throws SQLException {
return new Ingredient(re.getNString("id"),re.getNString("name"),
Ingredient.Type.valueOf(re.getNString("Type")));
}
有人告诉我这种写法是典型的函数式编程,但我确实不太理解
之后经过查询和询问结果就是:ResultSet里存的是查询结果集,this::的意义就是引用下面的方法,把查询到的结果都映射成一个个的java对象,
下面是显示rowmapper写法
@Override
public Iterable findAll() {
// return jdbc.query("select id,name,type from Ingredient",this::mapRowToIngredient);
return jdbc.query("select id,name,type from Ingredient", new RowMapper() {
@Override
public Ingredient mapRow(ResultSet resultSet, int i) throws SQLException {
return new Ingredient(resultSet.getNString("id"),resultSet.getNString("name"),
Ingredient.Type.valueOf(resultSet.getNString("type")));
}
});
}
也许这种更好理解,



