需求:动态获取其他网站的数据,获取得到的数据是json格式数据,数据格式不定,所以得动态生成数据表将数据插入数据库,使用框架为mybatis
列表数据如下
{
"rtnCode": "000000",
"rtnMsg": "success",
"data": {
"totalPage": "1",
"totalSize": "1",
"list": [
{
"name": "xxx",
"idCard": "35xxxxxxxxxxxxxxxx",
"guideNum": "D-3522-001332",
"gender": "女",
"rank": "初级",
"date": "2017-12-08",
"approver": "xxx",
"id": "1886351"
}
]
}
}
详情数据如下
{
"rtnCode": "000000",
"rtnMsg": "success",
"data": {
"name": "xxx",
"gender": "女",
"spell": " ",
"birthday": "1991-05-12",
"idCard": "35xxxxxxxxxxxxxxxxxxxx",
"validDate": "",
"guideNum": "D-3522-001332",
"qualificationCode": "DZG2006JXXXX",
"randAndLanguage": " 普通话--初级 ",
"nation": "汉族",
"tel": "134xxxxxxxx",
"organization": "xx市旅游协会导游工作部门",
"touristAdministration": "xx市旅游发展委员会",
"photo_front": "http://xxx.com/upload_a137919f030f8458761d202c468f2c2c.jpg",
"photo_reverse": "http://xxx.com/upload_f94f8ca17c9078a82180e4f99b4ce854.jpg",
"photo": "http://xxx.com/upload_d790b665898f74c39e8515e645857d3a.jpg",
"result": "通过",
"approver": "xxx",
"company": "xx市旅游发展委员会"
}
}
解析Json(请求到的数据假设最多只有三级,只处理到三级)
String st = Post.sendHtpps("aaaaaa",taskConfig.getTask_api());
if(st!=null) {
JSONObject json1 = JSONObject.parseObject(st);
String code=json1.getString("rtnCode");
if("900003".equals(code)) {
String rtnCode="";
String rtn="";
for(int i=0;i<3;i++) {
rtn=loginConfigService.requestLoginConfig(taskConfig.getLogin_config_id());
if(rtn!=null) {
JSONObject json = JSONObject.parseObject(rtn);
//获取item,得到json数组
rtnCode=json.getString("rtnCode");
System.out.println("正在重新登录。。。"+rtnCode);
if("000000".equals(rtnCode)) {
task(taskConfig);
break;
}
}
}
}
else {
if ("900005".equals(code)) {
System.out.println("未查询到数据");
} else if ("000000".equals(code)) {
JsonUtils t = new JsonUtils();
Map<String, String> p1 = t.jsonToMap(st);
System.out.println("这是获取到的数据:" + st);
String data2 = p1.get("data"); // 获取到data内的内容
Map<String, String> p2 = t.jsonToMap(data2); // 将data内的内容转map集合
if (p2.containsKey("list")) {// 如果json中包含list,则调用sqListService方法
String list = p2.get("list"); // 获取到list内的内容
List<Map<String, String>> p3 = t.jsonToList(list);// 将list内容转换成List<Map>格式数据
String list_id = UUIDUtils.getCode();
p2.put("list_id", list_id);
p2.remove("list");
p2.put("table_name", "SqList_" + taskConfig.getTask_id());
for (Map<String, String> l : p3) {
l.put("list_id", list_id);
l.put("table_name", "SqList_" + taskConfig.getTask_id() + "_list");
}
int row = sqListService.createTable(p2, p3);
if (row == 0) {
sqListService.addList(p2, p3);
}
} else {// 如果json中不包含list,则调用dyinfoService方法
p2.put("table_name", "Dyinfo_" + taskConfig.getTask_id());
int w = dyinfoService.createNewTable(p2);
if (w == 0) {
dyinfoService.insertData(p2);
}
}
}else {
System.out.println("请求超时");
}
}
//Json解析核心内容
public void toJsonData(String str) {
JsonUtils t=new JsonUtils();
Map<String,String> p1= t.jsonToMap(str);
String data2= p1.get("data"); //获取到data内的内容
Map<String,String> p2= t.jsonToMap(data2); //将data内的内容转map集合
if(p2.containsKey("list")) {
String list= p2.get("list"); //获取到data内的内容
List<Map<String, String>> p3= t.jsonToList(list);
}else {
dyinfoService.add(p2);
}
}
列表数据动态建表插入SqList.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hrt.mapper.SqListMapper">
<update id="createTable_data" parameterType="java.util.Map">
CREATE TABLE IF NOT EXISTS ${dataMap.get("table_name")}
<foreach collection="dataMap.keys" separator=" varchar(255)," item="key" open="(" close=" varchar(255))">
<if test="key != 'table_name'">
${key}
</if>
</foreach>
</update>
<update id="createTable_list" parameterType="java.util.List">
CREATE TABLE IF NOT EXISTS ${list.get(0).get("table_name")}
<if test="list.size > 0">
<foreach collection="list.get(0).keys" separator=" varchar(255)," item="key" open="(sid int NOT NULL AUTO_INCREMENT," close=" varchar(255),PRIMARY KEY (sid))">
<if test="key != 'table_name'">
${key}
</if>
</foreach>
</if>
</update>
<insert id="insertData" parameterType="java.util.Map">
insert into ${dataMap.get("table_name")}
<foreach collection="dataMap.keys" separator="," item="key" open="(" close=")">
<if test="key != 'table_name'">
${key}
</if>
</foreach>
values
<foreach collection="dataMap.keys" item="key" separator="," open="(" close=")">
<if test="key != 'table_name'">
#{dataMap[${key}]}
</if>
</foreach>
</insert>
<insert id="addList" parameterType="java.util.List">
insert into ${list.get(0).get("table_name")}
<if test="list.size > 0">
<foreach collection="list.get(0).keys" separator="," item="key" open="(" close=")">
<if test="key != 'table_name'">
${key}
</if>
</foreach>
values
<foreach collection="list" item="sq" index="index" separator=",">
<foreach collection="list.get(index).keys" item="key" separator="," open="(" close=")">
<if test="key != 'table_name'">
#{sq.${key}}
</if>
</foreach>
</foreach>
</if>
</insert>
</mapper>
SqListMapper.java
public interface SqListMapper {
public void add(Map<String, String> map);
int insertData(@Param("dataMap") Map<String, String> dataMap);
int addList(List<Map<String,String>> list);
int createTable_data(@Param("dataMap") Map<String, String> dataMap);
int createTable_list(List<Map<String, String>> list);
}
SqListService.java
public interface SqListService {
/**
*
* @Title: addList
* @Description: TODO
* @param @param list
* @return void
* @throws
*/
int addList(Map<String, String> dataMap,List<Map<String,String>> list);
/**
*
* @Title: createTable
* @Description: TODO 创建数据表
* @param @param dataMap
* @param @param list
* @param @return
* @return int
* @throws
*/
int createTable(Map<String, String> dataMap,List<Map<String, String>> list);
}
SqListServiceImpl.java
@Service("sqListService")
public class SqListServiceImpl implements SqListService{
@Autowired
SqListMapper sqListMapper;
@Override
public int addList(Map<String, String> p2,List<Map<String, String>> list) {
// TODO Auto-generated method stub
int m=sqListMapper.insertData(p2);
int n=sqListMapper.addList(list);
return m+n;
}
public int createTable(Map<String, String> dataMap,List<Map<String, String>> list) {
int m=sqListMapper.createTable_data(dataMap);
int n=sqListMapper.createTable_list(list);
return m+n;
}
}
详情数据动态建表插入Dyinfo.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hrt.mapper.DyinfoMapper">
<update id="createNewTable" parameterType="java.util.Map">
CREATE TABLE IF NOT EXISTS ${dataMap.get("table_name")}
<foreach collection="dataMap.keys" separator=" varchar(255)," item="key" open="(id int(11) NOT NULL AUTO_INCREMENT," close=" varchar(255),PRIMARY KEY (id))">
<if test="key != 'table_name'">
${key}
</if>
</foreach>
</update>
<insert id="insertData" parameterType="java.util.Map">
insert into ${dataMap.get("table_name")}
<foreach collection="dataMap.keys" separator="," item="key" open="(" close=")">
<if test="key != 'table_name'">
${key}
</if>
</foreach>
values
<foreach collection="dataMap.keys" item="key" separator="," open="(" close=")">
<if test="key != 'table_name'">
#{dataMap[${key}]}
</if>
</foreach>
</insert>
</mapper>
DyinfoMapper.java
public interface DyinfoMapper {
int insertData(@Param("dataMap") Map<String, String> dataMap);
int createNewTable(@Param("dataMap") Map<String, String> dataMap);
}
DyinfoServiceImpl.java
public class DyinfoServiceImpl implements DyinfoService{
@Autowired
DyinfoMapper dyinfoMapper;
@Override
public int insertData(Map<String, String> p2) {
// TODO Auto-generated method stub
int n=dyinfoMapper.insertData(p2);
return n;
}
@Override
public int createNewTable(Map<String, String> dataMap) {
// TODO Auto-generated method stub
return dyinfoMapper.createNewTable(dataMap);
}
}
DyinfoService.java
public interface DyinfoService {
/**
* @Title: insertData
* @Description: TODO
* @param @param p2
* @return void
* @throws
*/
int insertData(Map<String, String> p2);
/**
*
* @Title: createNewTable
* @Description: TODO
* @param @param dataMap
* @param @return
* @return int
* @throws
*/
int createNewTable(Map<String, String> dataMap);
}
存储效果
注:为了避免数据回滚,利用spring的特性,将可能会回滚的操作放在一个方法里面,可实现同时回滚。