春季-如何使用JDK8功能重写jdbcTemplate查询?

这是代码.假设数据库中有很多大图像,所以我一次只想保留一个图像.如何使用lambda和stream之类的JDK 8功能编写此代码?

我开始使用它们,但是它一直失败(从https://spring.io/guides/gs/relational-data-access/www.jooq.org/java-8-and-sql开始),并且使用ResultSetExtractor可以按预期工作,但是有没有ResultSetExtractor的方法吗?

 jdbcTemplate.query( 
            "select id,image,mimetype from images",
            new ResultSetExtractor(){  
                @Override  
                public List extractData(ResultSet rs) throws SQLException, DataAccessException {  
                        while(rs.next()){  
                           createThumbnail( new ImageHolder(rs.getInt("id"), rs.getBytes("image"), rs.getString("mimetype") ));
                        }  
                        return null;
                    }  
            }
    );  

这是一个很不错的流/ lambda版本,可以运行,但在内存中包含太多内容,迟早会给OOME.

 jdbcTemplate.query( 
             "select id,image,mimetype from images",
             (rs,rowNum)->new ImageHolder(rs.getInt("id"), rs.getBytes("image"),rs.getString("mimetype"))
    ).stream().forEach(   
                   imageHolder -> createThumbnail(imageHolder)
    ) );

这只是在开始“流式处理”它们之前加载所有行.

解决方法:

一种解决方案是在第一个lambda中移动缩略图的生成,直接翻译您的第一个示例.

jdbcTemplate.query( 
         "select id,image,mimetype from images",
         (rs,rowNum)-> {
             createThumbnail(new ImageHolder(
                rs.getInt("id"),
                rs.getBytes("image"),
                rs.getString("mimetype") ));
         })
)

要拥有与您尝试实现查询方法类似的结构,应返回一个流,这样您就不必在流传输之前收集所有内容.

上一篇:SpringBoot使用JdbcTemplate


下一篇:如何使用Spring jdbctemplate而不是Java中的直接插入查询来调用PostgreSQL函数?