项目实训记录9--更改规则后对数据进行清洗

目标实现:

更改or重设标准后(当改为F时不做此操作)

1. 对该表已有数据进行清洗

2. 找出不符合规则的数据--展示Dialog 选择是否删除 若删除则对删除前的备份

过程一:触发地:修改的确认键

 await axios({
        method: 'post',
        url: `api/updateMetaZhengze/${id}`,
        data: this.form,
      }).then(
        // console.log(res)

难点:返回什么?

修改时的限定:限定了某个表--可以得到meta

过程二:确定返回形式

@Data
public class qingXiMessage {
    int flag;//是否成功
    List <String>columns;//这是该表的列
    List<Map<String,Object>> objects;//这是查出来的
}

过程三:在修改成功且不是修改为F的时候做

注意:还要与原来的不一样,因此要先找一下原来的正则表达式

 String originZhengze=metaMapper.findZhengzeByMetaName(m.getEN(),DBId,CId);
        System.out.println("原来的正则"+originZhengze);
        int updateMeta= metaMapper.updateMetaZhengze(m,DBId,CId,Zhengze);
//        updateMeta是是否成功修改
        System.out.println(updateMeta);
//        在修改成功后做的事
        if((updateMeta==1)&&(!Zhengze.equals("F"))&&(!Zhengze.equals(originZhengze))){
            System.out.println("需要清洗");
        }

过程四:清洗

目的1:找到与遭修改的表内所有信息--仅仅可以找到对应列的id 先存一下

前序:获取dbname和chartname

 DB db=dbMapper.findDBById(DBId);
            String dbname= db.getDBEN();
            Chart chart=chartMapper.findChartById(CId,DBId);
            String chartname=chart.getEN();

这里是找到该数据库该表该列所有信息,可以先用一个Map<int,String>存起来 

ment stmt = null;
        ResultSet rs = null;
        String driver = "com.mysql.jdbc.Driver";
        String url = "jdbc:mysql://127.0.0.1:3306/"+dbName;
        String user = "root";
        String password = "sherlock2218";
        try {
            //1. 注册驱动
            Class.forName(driver);
            //2.获取连接对象
            conn = DriverManager.getConnection(url, user, password);
            //3.定义sql
            String sql  = "select id,"+men+" from "+chartName;
            //4.获取执行sql对象
            stmt = conn.createStatement();
            //5.执行sql,返回结果集
            rs = stmt.executeQuery(sql);
            //6.处理结果
            //循环判断游标是否是最后一行末尾。
            //一行一行的移动,再逐个列获取数据
            while(rs.next()){

                //获取数据
                //6.2 获取数据
                /*
                boolean next(): 游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),
                            如果是,则返回false,如果不是则返回true
                        * getXxx(参数):获取数据
                        * Xxx:代表数据类型   如: int getInt() ,	String getString()
                        * 参数:
                            1. int:代表列的编号,从1开始   如: getString(1)
                            2. String:代表列名称。 如: getDouble("balance")
                */
                int id = rs.getInt(1);
                String value = rs.getString(men);


                System.out.println(id + "---" + value);
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //7.释放资源

            if(rs != null){
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if(stmt != null){
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if(conn != null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }

根据正则表达式存id

  for (Map.Entry<Integer,String> entry : temp.entrySet()) {
                System.out.println("Key = " + entry.getKey()+"Value = " + entry.getValue() );
                String value=entry.getValue();
                String pattern = Zhengze;
                Pattern r = Pattern.compile(pattern);
                Matcher m1 = r.matcher(value);
                if(!m1.matches()){ids.add(entry.getKey());}
            }
            for(Integer i:ids){
                System.out.println(i);
            }

结果:

 目的2:返回固定type类型的message

1. 找到这个表的metaen --形成list<String>

 <select id="findAllColumns" resultType="java.lang.String" >
        select MEN
        <!--<include refid="Base_Column_List" />-->
        <!--,-->
        <!--<include refid="Blob_Column_List" />-->
        from #{DBId}_#{CId}_meta
    </select>

2. 根据这个men去 做jdbc

public List<Map<String,Object>> findAllQingxiInfo(List<Integer> notId,List<String> columns,String dbName,String chartName) {
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        Map<String,Object> ma = null;
        String driver = "com.mysql.jdbc.Driver";
        String url = "jdbc:mysql://127.0.0.1:3306/" + dbName;
        String user = "root";
        String password = "sherlock2218";
//        查出来的 一行是一个list项  map是每一列相对应的
        List<Map<String,Object>> objects=new ArrayList<>();
        String metas = "";
        for (String i : columns) {
            System.out.println("columns" + i);
            metas += i + ",";
        }
        metas=metas.substring(0, metas.length() - 1);
        for (Integer i : notId) {
            System.out.println(i);
            try {
                //1. 注册驱动
                Class.forName(driver);
                //2.获取连接对象
                conn = DriverManager.getConnection(url, user, password);


//初始化该行的map
                ma=new HashMap<>();
                //3.定义sql
                String sql = "select " + metas + " from " + chartName + " where id =" + i;
                System.out.println(sql);
                //4.获取执行sql对象
                stmt = conn.createStatement();
                //5.执行sql,返回结果集
                rs = stmt.executeQuery(sql);
                //6.处理结果
                //循环判断游标是否是最后一行末尾。
                //一行一行的移动,再逐个列获取数据
                while (rs.next()) {

                    //获取数据
                    //6.2 获取数据
                /*
                boolean next(): 游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),
                            如果是,则返回false,如果不是则返回true
                        * getXxx(参数):获取数据
                        * Xxx:代表数据类型   如: int getInt() ,	String getString()
                        * 参数:
                            1. int:代表列的编号,从1开始   如: getString(1)
                            2. String:代表列名称。 如: getDouble("balance")
                */
//                    每一列
                    for (String i2 : columns) {
                        System.out.println("columns" + 2);
                        String value = rs.getString(i2);
                        ma.put(i2,value);
                    }



                }
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                //7.释放资源

                if (rs != null) {
                    try {
                        rs.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }

                if (stmt != null) {
                    try {
                        stmt.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }

                if (conn != null) {
                    try {
                        conn.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
            }
            objects.add(ma);
        }
        return objects;
    }

前端反馈结果:

 前端需要做的

1. message反馈

2.展示 是否删除 若删除 则先备份

拓展:如果表达式非正则需要反馈

添加try catch 不仅将有反馈,还将改动后的修改回原来的

  try{ Pattern r = Pattern.compile(pattern);
                Matcher m1 = r.matcher(value);
                if(!m1.matches()){ids.add(entry.getKey());}}catch (Exception e){
                    q.setFlagQingXi(0);
                    q.setFlagModify(0);
                   metaMapper.updateMetaZhengze(m,DBId,CId,originZhengze);
                   return q;

               }

 四种message

  if(this.tableData4.flagModify==1&&this.tableData4.flagQingXi==1){
           this.$notify({
            title: '编辑成功且清洗成功',
            message: '编辑成功且清洗成功',
            type: 'success'
            
          });
           this.dialogVisibleQingxi=true}else if(this.tableData4.flagModify==0&&this.tableData4.flagQingXi==0){
             this.$notify({
            title: '请更改正则表达式',
            message: '编辑失败,正则表达式有误',
            type: 'warning'
          });
          }else if(this.tableData4.flagModify==0&&this.tableData4.flagQingXi==1){
             this.$notify.error({
            title: '编辑失败',
            message: '编辑失败',
           
          });
          }else if(this.tableData4.flagModify==1&&this.tableData4.flagQingXi==0){
             this.$notify({
            title: '不需清洗',
            message: '编辑成功',
            type: 'success'
          });
          }


      })

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值