应用场景:
mysql的t_user表中有1000条数据,这1000条数据中有700条坏数据(坏数据指的是t_user表中的logo字段的值是不正确的)。
需求:找出这些坏数据,使他们变成正确的数据。
处理步骤:
1.运维将t_user表的数据导出来,传给我。
2.我手动的删除t_user表中正确的数据。
3.在java层取出坏数据,循环坏数据,给logo字段赋值正确的值。
4.循环完后,我本地的mysql中t_user表中的数据就是正确的数据。
问题点
这些数据怎么给运维呢?
我从本地t_user表中导出的数据只能是
insert into t_user values(value1,value2,...)
即insert语句。
此处有两种解决方案
方案1:将我生成的正确数据 与 原来手动删除的正确数据 整合在一起,然后将t_user表原封的发给运维。
方案2:直接将更新logo字段的sql发给运维,运维直接执行sql语句就行。
总结:方案1是将数据发给运维;方案2是将sql语句发给运维。
我采用的是第二种方案
上述已经说过了,循环完坏数据后,本地t_user表中的数据是正确的,但是只能导出insert into语句。
因此,只能在执行更新logo字段的时候,将update语句保存下来。
保存起来的原理是:将update字符串写入一个txt文件。将字符串写入txt文件代码如下
//写入文件
public void testFileOutputStream(String sql,File file) throws IOException {
//1.创建文件对象
//输出的物理文件可以不存在,执行过程中,
//若不存在,则会自动创建;若存在,则会将现有文件覆盖
//File file = new File("sql.txt");
//2.创建一个文件输出流,用于写入数据到文件中
FileOutputStream fos = null;
try {
//FileOutputStream的第二个参数设置为true,表示写入某个文件的时候,内容不覆盖原来的
fos = new FileOutputStream(file,true);
//3.写入数据到文件中
fos.write(sql.getBytes());
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally {
if (fos != null) {
//4.关闭输出流
fos.close();
}
}
}
外层调用写入文件方法
public void test(){
//1.创建文件对象
File file = new File("sql.txt");
//2.取出坏数据
select * from t_user;
//3.循环坏数据
for(){
//4.更新logo字段
update t_user set logo=? where id = ?
//将update字符串写入txt文件
String inFileString = "update t_user set logo=? where id = ?"+";"+"\n";
testFileOutputStream(inFileString,file);
}
}
最后在工程下面便会生成sql.txt文件