鉴于本人外键关联学得跟shi一样并且很讨厌写联表查和能力问题,我对每个数据都采用单表查询
当然这是建立在数据里真的很小的情况下
现在有一种情况就是我前端传来的JSON包含我需要的bean,和数组[],数组里也有bean...
这样传过来只能后端自己裁剪了,因为是数组,mybatis是不支持数组的,只能靠变通了,
目录
形如传值的是这样一组JSON
我的resume是一个bean,workExps是一个数组,数组里有bean
现在先说原理,
JSON实质上是一个map<string,obj>类型,而数组[{对象1},{对象2},....]是一个ArrList<map<string,obj>>
知道原理不难进行转换,但是还是需要借助一个dependent,就是fastjson
所以添加依赖
<!--把bean隐射为json-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.56</version>
</dependency>
添加一个工具类用于转换controller里传来的requesbody的JSON,
package yiki.mybatis.util;
import com.alibaba.fastjson.JSON;
import java.util.Map;
public class JsonUtil {
public static String obj2json(Object obj) throws Exception {
return JSON.toJSONString(obj);
}
public static <T> T json2obj(String jsonStr, Class<T> clazz) throws Exception {
return JSON.parseObject(jsonStr, clazz);
}
public static <T> Map<String, Object> json2map(String jsonStr) throws Exception {
return JSON.parseObject(jsonStr, Map.class);
}
public static <T> T map2obj(Map<?, ?> map, Class<T> clazz) throws Exception {
return JSON.parseObject(JSON.toJSONString(map), clazz);
}
}
插入的时候
接收器这样写(我嵌套了两层,这一层的实质是service,如果是controller也是一样的,只不过记得加reqbody注解
public boolean AddResume(Map<String, Object> models) {
try {
Map<String, Object> resumeobj =
(Map<String, Object>) models.get("resume");
ArrayList<Map<String, Object>> workExpList =
(ArrayList<Map<String, Object>>) models.get("workExps");
Resume resume = JsonUtil.map2obj(resumeobj, Resume.class);
Resume checkRept = resumeMapper.getResumeByuid(resume.getUid());
if (checkRept != null) {
return false;
}
resumeMapper.insertResume(resume);
for (Map<String, Object> item : workExpList) {
WorkExp workExp = JsonUtil.map2obj(item, WorkExp.class);
workExpMapper.insertWorkExp(workExp);
}
return true;
} catch (Exception e) {
System.out.println(e);
}
return false;
}
你可以看到我把JSON分解然后分别写入mapper,就是真的单表操作了- -,性能对于数据大其实不友好,但是也是个好参考
查询的时候
查出来的的多条数据组装成map
<select id="getWorkExpByUid"
parameterType="map"
resultType="map">
SELECT * FROM workExp WHERE uid= #{uid}
</select>
service拼装同理而且不需要工具转换了,只需要交给springboot框架返回你json即可
public Map<String, Object> getResume(Integer uid) {
Map<String, Object> map = new HashMap<>();
List<Map> wlist = workExpMapper.getWorkExpByUid(uid);
Resume resume = resumeMapper.getResumeByuid(uid);
map.put("workExps",wlist);
map.put("resume",resume);
return map;
}
这样查出来是封装好的一个map