项目实训9——对数据库进行操作

  前两篇博客分别讨论了使用JDBC对字段和表的操作,本篇来讨论对数据库的操作。
  由于数据库名是非常重要的信息,更改后不易查找原有信息,而且在 MySQL 5.1.23 之后的版本中,因为安全考虑,删掉了 RENAME DATABASE 重命名数据库的命令。所以项目对数据库的操作仅限于删除数据库。小组成员没有讨论出备份数据库信息的操作如何实现,删除数据库导致数据损失的风险也很大,此操作谨慎使用。
  系统数据库的db表存有所有用户数据库的信息,包括id、英文名、中文名和中文描述。在上一篇博客中我也提到了用户数据库的表都会在系统数据库的DBid_charts表中有记录,而且每个表的字段信息都各自由DBid_Cid_meta表存储。所以删除数据库要做到先删除用户数据库,然后是库中所有表的meta表,接着是库中表信息所存储在的DBid_charts表,最后是db表中库的信息。这个顺序不能打乱,否则会影响下一步的进行。
  删除用户数据库的操作由JDBC实现。连接到用户数据库后,执行sql语句drop database dbName,删除库及所有数据。接下来是库中表的meta表。因为一个用户数据库可能会有很多表,每个表又在系统数据库有对应的字段信息表,所以要想全部删除meta表,就先要获得用户数据库中表的个数。实现代码如下:

    //删除存有表项信息的表
    @Override
    public int deleteSCI(int id){
        List<Chart> lc=chartMapper.findAllCharts(id);
        int da=0;
        int ad=0;
        System.out.println("有几个表:"+lc.size());
        for(int i=1; i<=lc.size(); i++){
            ad=chartMapper.deleteSC(i,id);
            if(ad==0)
                da=1;
        }
        return da;
    }

先根据用户数据库在db表中的DBid获得DBid_charts表中的所有数据,用Chart类型的List对象存储。进行循环,有几项就执行几次删除meta表的操作,有删除就将判断位置为1。删除DBid_charts表和db表中的用户数据库信息就相对来说比较简单了,都是通过mapper操作。其xml文件中的代码如下:

    <!--删除系统数据库中存储表的相关表-->
    <update id="deleteRelevant" parameterType="int">
        drop table if exists #{DBId}_charts
    </update>

    <!--删除数据库-->
    <delete id="deleteDB" parameterType="com.example.server.domain.DB">
        delete from db where id=#{id}
    </delete>

controller文件中的代码如下:

    //删除数据库
    @RequestMapping("/deleteDB/{id}")
    public Map<String, Object> deleteDB(@PathVariable int id) throws Exception {
        Map<String, Object> map = new HashMap<>();
        //注意先后顺序!
        int sd=db.deleteSDB(id);
        System.out.println("删除用户数据库的结果:"+sd);
        //别判断这个了!值有很多种!
        int si=db.deleteSCI(id);
        System.out.println("删除用户数据库的表项表的结果:"+si);
        int sr=db.deleteRelevant(id);
        System.out.println("删除用户数据库所存表的结果:"+sr);
        int info = db.deleteDB(id);
        System.out.println("删除数据库总表数据的结果:"+info);
        if ((sd>0)&&(sr==0)&&(info>0)) {
            map.put("state", true);
            map.put("msg", "删除成功!");
        } else {
            map.put("state", false);
            map.put("msg", "删除失败!");
        }
        return map;
    }

进行测试后我发现如果被删除的用户数据库中没有表,可能是之前已经把表删完了或是根本没有新建表,那么第二步操作的方法返回值为0,虽然对删除数据库的过程没有影响,但是会影响判断结果。所以在进行结果判断时去除这个判断,只判断其他三步。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值