JDBC Template的query方法第二个参数:自定义方法替代rowmapper和lambda表达式使用

JDBC Template的query方法第二个参数:自定义方法替代rowmapper和lambda表达式使用,第1张

JDBC Template的query方法第二个参数:自定义方法替代rowmapper和lambda表达式使用

最近在复习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")));
            }
        });
    }
​

也许这种更好理解,

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5574868.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存