mybatis对数据库操作
事情是这样的,今天一不小心接到一个这样的需求,调用远程接口获取数据,每周定时更新全部数据,这不挺好整的嘛!!!!!!!!!
但是,更新之前需要把之前的那个表的数据做备份,把新获取的数据重新创建一张表,插入到新新建的这张表中,后续更新的话就需要把之前备份的那张表删除,把当前的表备份,在次创建新表存数据。我懵逼了。不过下来想想也还好啦。。。。。
假设表结构是这样的
newTable(创建的新表,存取当天获取的新数据)–>tableBack(备份表,上次获取数据)
就这样搞。
实操:哈哈哈哈哈
1.首先是接口层哈,在获取数据后你首先得判断数据库是否存在备份表吧,那就来判断下吧。
/**
* 查询表是否存在tableBack
* */
@Select("select count(*) from information_schema.TABLES where table_name=#{tableName}")
int isExistTable(@Param("tableName")String tableName);//tableName=tableBack
2.如果存在的话是不是要删除呢?对吧
/**
* 删除表(不能防止sql注入)
* */
@Update("DROP TABLE IF EXISTS ${tableName}")
int deleteTable(@Param("tableName")String tableName);
注意哦!mybatis中的 #{} 和 ${} 的区别哦,#{}可以进行SQL的预编译,但是 ${}是不行的呢。
此处要进行删除表的操作就得使用第二个拿到传入表名,因为使用#{}进行操作会报错的。
3.接下来是不是得判断有没有newtable吧!看下面
/**
* 查询表是否存在newtable
* */
@Select("select count(*) from information_schema.TABLES where table_name=#{tableName}")
int isExistTable(@Param("tableName")String tableName);//tableName=newtable
4.如果有的话是不是得把newtable的表名修改成tableBack,没问题吧!
/**
* 通用但是不能防止sql注入
* */
@Update("ALTER TABLE ${tableName} RENAME TO ${newTableName}")
void renameTestTableName(String tableName,String newTableName);
//参数tableName=newtable,newTableName=tableBack
5.修改名字后,是不是数据库就只存在一张表叫做tableBack呢。现在我们就要创建一张表叫做newtable吧!
@Update("CREATE TABLE ${tableName} (\n" +
" `id` varchar(36) NOT NULL COMMENT 'uuid',\n" +
" `name` varchar(255) DEFAULT NULL COMMENT '名字',\n" +
" `age` varchar(255) DEFAULT NULL COMMENT '年龄',\n" +
" `sex` varchar(255) DEFAULT NULL COMMENT '公母',\n" +
" PRIMARY KEY (`id`)\n" +
") ENGINE=InnoDB DEFAULT CHARSET=utf8;")
int createMainTable(String tableName);// tableName=newtable
6.向数据库插入数据
@Insert("<script>" +
"insert into(name,age,sex) " +
"values" +
"<foreach collection =\"list\" item=\"ll\" separator =\",\">\n" +
"(#{ll.name},#{ll.age),#{ll.sex}" +
"</foreach >" +
"</script>")
int insertData(List<PlatformContract> list);
7…在这之后就是要往数据库里面写数据吧。
@ApiOperation("远程调用")
@PostMapping("/getInfo")
public void getContractInformation() {
//获取数据
String receiveData = HttpGetDataInterface.httpGetDataByPostWithJsonParam("", ServiceInterface.getServiceUrl(Constants.MANAGER_PLATFORM_CONTRACT_INFO), 30000);
//空判断
if (!StringUtils.isEmpty(receiveData)) {
JSONArray jsonArray = JSONObject.parseArray(receiveData);
//空判断
//判断数据库是否有备份表(如果存在就删除)
int isExist = managerPlatMapper.isExistTable("tableBack");
if (isExist > 0) {
//存在就删除
managerPlatMapper.deleteTable("tableBack");
}
//判断是否有合用户表(如果有就修改有就修改名字)
int existTable = managerPlatMapper.isExistTable("newtable");
if (existTable > 0) {
//修改表名
managerPlatMapper.renameTestTableName(newtable,tableBack);
}
//创建新的用户表
managerPlatMapper.createMainTable("newtable");
LinkedList<PlatformContract> save = new LinkedList<>();
//数据插入限制(每一千条数据插入一次)
int insertLimit = 1000;
//对接收的数据做处理
for (int i = 0; i < jsonArray.size(); i++) {
String string = JSONObject.toJSONString(jsonArray.get(i));
JSONObject getContinues = JSONObject.parseObject(string);
String continues = (String) getContinues.get("continue");
//将json对象转化为数组
PlatformContract platformContract = JSONObject.parseObject(string, PlatformContract.class);
platformContract.setContinues(continues);
save.add(platformContract);
if (insertLimit == save.size() || i == jsonArray.size() - 1) {
//插入数据
managerPlatMapper.insertData(save);
//移除数据(获取下一次数据进行处理)
save.clear();
}
}
}
}
8.通过httpClient远程调用数据
String receiveData = HttpGetDataInterface.httpGetDataByPostWithJsonParam("", ServiceInterface.getServiceUrl(Constants.MANAGER_PLATFORM_CONTRACT_INFO), 30000);
调用工具
/**
* @Author luobo
* @Date 2021/8/2 15:45
* @description 根据http调用三方接口的通方法
*/
public class HttpGetDataInterface {
private static final Logger logger = LoggerFactory.getLogger(HttpGetDataInterface.class);
private static final String APP_KEY="X-APP-KEY";
private static final String APP_KEY_VALUE="1525dcvf5685";
private static final String APP_ID="X-APP-ID";
private static final String APP_ID_VALUE="xasfadfde";
/**
* 根据url获取数据post
* @param jsonParams http请求参数
* @param url http请求的url
* @param timeOut 请求超时时间
*/
public static String httpGetDataByPostWithJsonParam(String jsonParams, String url, int timeOut) {
Assert.notNull(jsonParams, "jsonParams can not be null");
CloseableHttpClient closeableHttpClient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(url);
//设置超时时间
httpPost.setConfig(setTimeOutConfig(timeOut));
httpPost.setHeader("Content-Type", "application/json");
httpPost.setHeader(APP_KEY,APP_KEY_VALUE);
httpPost.setHeader(APP_ID,APP_ID_VALUE);
CloseableHttpResponse execute = null;
try {
StringEntity entity = new StringEntity(jsonParams, "utf-8");
entity.setContentEncoding("utf-8");
entity.setContentType("application/json");
httpPost.setEntity(entity);
//执行post
execute = closeableHttpClient.execute(httpPost);
String receiveData = "";
if (null != execute && !"".equals(execute)) {
if (execute.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
HttpEntity httpEntity = execute.getEntity();
receiveData = EntityUtils.toString(httpEntity);
} else {
logger.info("请求出错!状态码为{}", execute.getStatusLine().getStatusCode());
}
}
return receiveData;
} catch (ClientProtocolException e) {
e.printStackTrace();
return "协议异常";
} catch (ParseException e) {
e.printStackTrace();
return "解析异常";
} catch (IOException e) {
e.printStackTrace();
return "传输异常";
} finally {
try {
if (execute != null) {
execute.close();
}
if (closeableHttpClient != null) {
closeableHttpClient.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
好啦结束啦!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~