xinshou2017 2017-05-03 08:21 采纳率: 100%
浏览 1570
已结题

mysql过滤条件,怎么添加过滤的表?

package eb.controller.core;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.servlet.UnavailableException;

import com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException;

/**

  • @author Bicashy,fencer911(for Mysql Version)
    */
    public class TableOperate {
    static Statement stmt = null;
    static Connection conn = null;
    static Map map = new HashMap(); //用来保存已经删除了的表的集合
    static Map filterMap = new HashMap(); //用来保存需要过滤的表的集合

    static String schema ;
    /**

    • 获得数据库链接
    • @return / private static Connection getConnection(){ try { Class.forName( "com.mysql.jdbc.Driver").newInstance(); //String url= "jdbc:oracle:thin:@10.45.10.177:1521:highway"; String url= "jdbc:mysql://localhost:3306/eb?useUnicode=true&characterEncoding=utf-8"; String user= "root"; String password= "eryue1818*"; schema = user; conn = DriverManager.getConnection(url,user,password); return conn; } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; }

    /**

    • 获得该用户的所有表,并删除表(除了要过滤的表) */ private static void findDeleteTableSQL(){ if(conn!=null){ try { stmt=conn.createStatement(); String sql = "show TABLES"; //找到该链接用户的所有表 ResultSet rs=stmt.executeQuery(sql); while(rs.next()){ String tabName = rs.getString(1); //getString("table_name"); //如果map中包含了表名,说明已经删除过了 //如果filterMap中包含了表名,则不删除 if(!map.containsKey(tabName)&&!filterMap.containsKey(tabName)){ printDeleteTableSQL(tabName); } } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

    /**

    • 删除表,并将删除表的语句输出到控制台(记录后方便在数据库客户端执行)
    • @param l
    • @param tableName
    • @return
      */
      private static void printDeleteTableSQL(String tableName){
      String sql = "DELETE FROM "+tableName.toUpperCase();
      try {
      stmt=conn.createStatement();
      System.out.println(sql+";");

      stmt.execute(sql);
      stmt.close();
      //将删除语句输出到控制台
      map.put(tableName,null);
      } catch (MySQLIntegrityConstraintViolationException e) {
      // TODO Auto-generated catch block
      String error = e.toString();
      System.out.println(error);

      int p1=error.indexOf("(");
      int p2=error.indexOf("FOREIGN KEY");
      error=error.substring(p1, p2);
      
      int p3=error.indexOf("CONSTRAINT");
      error=error.substring(p3);
      error=error.replaceAll("CONSTRAINT", "").replaceAll(" ", "").replaceAll("`", "");
      
      //截取错误信息得到外键约束名称
      String fk_constraints =error;
      System.out.println("fk_constraints"+fk_constraints);
      
      deleteTableNameFromFK(fk_constraints);
      //删除外键约束表后,就可以将本表删掉
      printDeleteTableSQL(tableName);
      

      }catch (Exception e) {
      System.out.println(e.toString());
      }
      }

    /**

    • 删除通过外键约束找到的有子记录的表
    • @param fk_constraints */ private static void deleteTableNameFromFK(String fk_constraints){ String sql = "select table_name from information_schema.REFERENTIAL_CONSTRAINTS where constraint_schema='laidong8v5' and constraint_name='"+fk_constraints+"'"; try { ResultSet rs=stmt.executeQuery(sql); while(rs.next()){ String tabN = rs.getString("table_name"); printDeleteTableSQL(tabN);//递归 } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } }

    /**

    • 初始化需要过滤表的集合(该表如果是别的表的外键关联表也有可能被删除) */ private static void initFilterMap(){ String[] tables = {"ETC_USER","etc_dic_data","MENU","admin"}; for (int j = 0; j < tables.length; j++) { filterMap.put(tables[j].toUpperCase(),null); } }

    public static void main(String[] args) {
    getConnection();
    //initFilterMap();//初始化不需要删除的表

    //删除该用户下所有表(除了需要过滤的),并获得删除语句
    findDeleteTableSQL();
    
    //删除某一个表(有外键约束的表将先删除),并获得删除语句
    //printDeleteTableSQL("obu_mast");
    

    }
    }
    在外面看到,试了之后发现它把所有的表全都删除了,现在不知道怎么添加过滤的表,该怎么写。

  • 写回答

3条回答 默认 最新

  • lihongbiao0610 2017-05-03 09:33
    关注

    首先:你的filterMap 要不为空,要注意表名大小写是否匹配
    其次:在findDeleteTableSQL方法中删除表的时候,判断表名是否在你的filterMap中存在,存在就不执行删除操作。

    评论

报告相同问题?

悬赏问题

  • ¥15 安装svn网络有问题怎么办
  • ¥15 Python爬取指定微博话题下的内容,保存为txt
  • ¥15 vue2登录调用后端接口如何实现
  • ¥65 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥15 latex怎么处理论文引理引用参考文献