MyBatis return Map key data Key value sensitive issues

Controller

@RestController
@RequestMapping("/web")
public class MapKeyTest {
    @Autowired
    private InvoicingBuyOrderService invoicingBuyOrderService;

    @GetMapping("/testKey")
    public Map<String,Object> testMayKey(String id){
        Map<String,Object> map = new HashMap<>();
        Map<String,String> result = this.invoicingBuyOrderService.test(id);
        map.put("data",result);
        return map;
    }
}

Service

 Map<String,String> test(String id);

ServiceImpl

    @Override
    public Map<String, String> test(String id) {
          Map<String, String> map = this.invoicingPackageunitMapper.selectPackageNameByCommodityDetailId(id);
          return map;
    }

Mapper

Map<String,String> selectPackageNameByCommodityDetailId(@Param("commodityDetailId") String commodityDetailId);

XML

① We do not set field aliases

<select id="selectPackageNameByCommodityDetailId" 
        parameterType="java.lang.String" resultType="java.util.HashMap">
select * from invoicing_commoditydetailprice icd where icd.COMMODITYDETAILPRICE_ID=#{commodityDetailId}

postMan request:
localhost:8001/FHSHGL/web/testKey?id=15b67d1756134936a6fbc8a5d5007bef
Return Value:

{
    "data": {
        "SMALL_PACKAGE_COUNT": "300",
        "SMALL_PACKAGE_UNIT_ID": "0f899de1f92911e8bb4500ffa0c803da",
        "PHP_ID": 80270,
        "MIDDLE_PACKAGE_UNIT_ID": "0f8995cef92911e8bb4500ffa0c803da",
        "CREATED_TIME": 1570839233000,
        "UPDATED_TIME": 1570839233000,
        "PRODUCTION_TIME": 1522425600000,
        "IN_PRICE": "15.00",
        "MIDDLE_PACKAGE_COUNT": "20",
        "OUT_PRICE": "15.00",
        "INVOICING_COMMODITY_ID": "25422c6135ed497dafa5f6e50fd6abcd",
        "CODE": "11325882056318109808267349261365",
        "BIG_PACKAGE_UNIT_ID": "0f894c61f92911e8bb4500ffa0c803da",
        "COMMODITYDETAILPRICE_ID": "15b67d1756134936a6fbc8a5d5007bef"
    }
}

② alias field set to return

  <select id="selectPackageNameByCommodityDetailId" parameterType="java.lang.String" resultType="java.util.HashMap">
    SELECT
        ips.`NAME` AS smallName,
        ipm.`NAME` AS middleName,
        ipb.`NAME` AS bigName
    FROM
        invoicing_commoditydetailprice icd
    LEFT JOIN invoicing_packageunit ips ON icd.SMALL_PACKAGE_UNIT_ID = ips.PACKAGEUNIT_ID
    LEFT JOIN invoicing_packageunit ipm ON icd.MIDDLE_PACKAGE_UNIT_ID = ipm.PACKAGEUNIT_ID
    LEFT JOIN invoicing_packageunit ipb ON icd.BIG_PACKAGE_UNIT_ID = ipb.PACKAGEUNIT_ID
    WHERE icd.COMMODITYDETAILPRICE_ID=#{commodityDetailId}
  </select>

postMan request:
localhost:8001/FHSHGL/web/testKey?id=15b67d1756134936a6fbc8a5d5007bef
Return Value:

{
    "data": {
        "bigName": "箱",
        "middleName": "瓶",
        "smallName": "克"
    }
}

Case springboot processing key value is returned Map mybatis

In order to unify the different database key value returned inconsistent capitalization issues, special custom ObjectWrapperFactory do uniform treatment

1, the first custom MapWrapper

/**
 * 将Map的key全部转换为小写
 * */
public class MapKeyLowerWrapper extends MapWrapper {

    public MapKeyLowerWrapper(MetaObject metaObject, Map<String, Object> map) {
        super(metaObject, map);
    }
    @Override
    public String findProperty(String name, boolean useCamelCaseMapping) {
        return name==null?"":name.toLowerCase() ;
    }
}

2, custom ObjectWrapperFactory

mybatis default ObjectWrapperFactory

public class DefaultObjectWrapperFactory implements ObjectWrapperFactory {
    public boolean hasWrapperFor(Object object) {
        return false;
    }

    public ObjectWrapper getWrapperFor(MetaObject metaObject, Object object) {
        throw new ReflectionException(
                "The DefaultObjectWrapperFactory should never be called to provide an ObjectWrapper.");
    }
}

Our custom is as follows:

public class MapWrapperFactory implements ObjectWrapperFactory {

    @Override
    public boolean hasWrapperFor(Object object) {
         return object != null && object instanceof Map;
    }

    @Override
    public ObjectWrapper getWrapperFor(MetaObject metaObject, Object object) {
        return new MapKeyLowerWrapper(metaObject, (Map) object);
    }
}

3, is disposed added MapWrapperFactory configuration mybatis

@Bean(name = "sqlSessionFactory")
@ConditionalOnBean(name = "dataSource")
public SqlSessionFactory sqlSessionFactoryBean(@Qualifier("dataSource") DataSource dataSource) {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setObjectWrapperFactory(new MapWrapperFactory());
        bean.setDataSource(dataSource);
        // 添加XML目录
        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        try {
            bean.setMapperLocations(resolver.getResources("classpath*:com/ultrapower/ioss/**/mapper/**/*.xml"));
            return bean.getObject();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
}

@Bean("sqlSessionTemplate")
@ConditionalOnBean(name = "sqlSessionFactory")
public SqlSessionTemplate sqlSessionTemplate(
            @Qualifier("sqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
}

@ConditionalOnBean(name = "dataSource")
@Bean(name = "transactionManager")
public PlatformTransactionManager transactionManager(@Qualifier("dataSource") DataSource dataSource) {
        DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager(dataSource);
        return dataSourceTransactionManager;
}

Personal blog
Tencent cloud community
Nuggets
Jane book
Public number:wx.jpg

Published 19 original articles · won praise 1 · views 384

Guess you like

Origin blog.csdn.net/Devilli0310/article/details/104073993