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: