我们系统架构采用springboot(springmvc)+mybatis,用mybatis查寻mysql数据后,直接放到List<Map>这样的结构中,这样做非常简单,无需定义实体类,通过springmvc的@ResponseBody注解可以直接将其序列化成json数据,然后返回给前段js来处理。但是,这里遇到了一些问题。
1、强制转换异常:
如果用List<Map<String,String>>这种结构来接受的化,如果sql中带有运算,mybatis会自动按照运算后的结果(sql中没有运算,默认按照数据库类型)放到Map中。所以在service中从map中取数据进行处理时,有的时候会发生类型转换错误,例如:提示Double类型无法转成String...,
如果我们直接String str = map.get("avgNum");如果avgNum是一个mysql计算出的一个double类型数,那么就会报Double无法转成String。所以,我们通常会用String str = String.valueOf(map.get("avgNum"));这么再次强转,但还是会有风险:
for (Map<String,String> map:minuteChartDatas) {
//1.legned
String date = map.get("day");
if (!legend.contains(date)) {
legend.add(date);
}
//2.xAxis
String hour = String.valueOf(map.get("hour"));
String minute = String.valueOf(map.get("minute"));
if (!axisDatas.contains(hour+":"+minute)) {
axisDatas.add(hour+":"+minute);
}
}
解决方法:定义一个实体类,mybatis会自动将运算或者默认数据库类型适配成实体对应属性的类型。
2、返回给前段json,数组带有双引号:
如果List<Map>这种结构中,map又嵌有数组,那么在进行@ResponseBody注解序列化时,会按照字符串处理,将数组加上双引号。这样前段js就无法识别。例如:
{"name":"a","data":"[1,2,3]"}
解决方法:将map换成实体,这样使用@ResponseBody注解序列化时,就不会出现上面的问题。