前两篇博客分别讨论了使用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,虽然对删除数据库的过程没有影响,但是会影响判断结果。所以在进行结果判断时去除这个判断,只判断其他三步。