目标实现:
更改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'
});
}
})