mybatis对数据库的操作,删除表,新建表,修改表。

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();
            }
        }
    }
}

好啦结束啦!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

在这里插入图片描述

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值