首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SQL中使用RowMapper的杰克逊的RowMapper

在SQL中使用RowMapper的杰克逊的RowMapper
EN

Stack Overflow用户
提问于 2022-09-17 06:52:58
回答 2查看 167关注 0票数 4

我们正在使用ObjectMapper。当将ObjectMapper与RowMapper一起使用时,是在每个mapRow (见下文)中声明,还是在mapRow之外作为类公共成员声明?根据本文,我假设它应该作为公共类成员出现在外部。Should I declare Jackson's ObjectMapper as a static field?

目前在Server数据库中使用Spring引导。使用成千上万的sql行来研究线程的安全性。

代码语言:javascript
复制
List<Product> productList =  namedParameterJdbcTemplate.query(sqlQuery,
        parameters,
        new ProductMapper(productRequest));


public class ProductMapper implements RowMapper<Product> {
    
    @Override
    public Product mapRow(ResultSet rs, int rowNum) throws SQLException {

        ObjectMapper objectMapper = new ObjectMapper()

        Product product = new Product();

        product.setProductId(rs.getLong("ProductId"));
        product.setProductType(rs.getString("ProductType"));
        product.setLocations(objectMapper.readValue(rs.getString("Locations"), new TypeReference<List<ServiceLocation>>(){}));
            } catch (Exception e) {
                throw new ServiceException(e);
            }
        }

注意:请不要问为什么我们要用ObjectMapper编写这个手册映射器,我们正在进行遗留编码,架构师也要求这样做。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-19 18:59:37

ObjectMapper实例不是不可变的,但正如文档中所述:

Mapper实例是完全线程安全的,只要实例的所有配置都发生在任何读或写调用之前。

这意味着该代码是完全线程安全的:

代码语言:javascript
复制
public class ProductMapper implements RowMapper<Product> {
    private ObjectMapper mapper;

    public ProductMapper()
    {
        objectMapper = new ObjectMapper();
    }

    @Override
    public Product mapRow(ResultSet rs, int rowNum) throws SQLException {
        Product product = new Product();
        product.setLocations(objectMapper.readValue(rs.getString("Locations"), new TypeReference<List<ServiceLocation>>(){}));
        return product;
    }
}

但是,仍然为每一行创建了TypeReference对象,这并不是非常有效。更好的方法是通过ObjectReader方法创建readerFor()实例:

代码语言:javascript
复制
public class ProductMapper implements RowMapper<Product> {
    private ObjectReader objectReader;

    public ProductMapper()
    {
        ObjectMapper objectMapper = new ObjectMapper();
        objectReader = objectMapper.readerFor(new TypeReference<List<ServiceLocation>>(){});
    }

    @Override
    public Product mapRow(ResultSet rs, int rowNum) throws SQLException {
        Product product = new Product();
        product.setLocations(objectReader.readValue(rs.getString("Locations")));
        return product;
    }
}

ObjectReader实例是不可变的和线程安全的.

票数 1
EN

Stack Overflow用户

发布于 2022-09-17 07:00:49

是的,也许您应该声明它是一个类级别字段。从来不建议创建冗余对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73752793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档