应用场景:
mysql的t_user表中有1000条数据,这1000条数据中有700条坏数据(坏数据指的是t_user表中的logo字段的值是不正确的)。
需求:找出这些坏数据,使他们变成正确的数据。
处理步骤:
1.运维将t_user表的数据导出来,传给我。
2.我手动的删除t_user表中正确的数据。
3.在java层取出坏数据,循环坏数据,给logo字段赋值正确的值。
4.循环完后,我本地的mysql中t_user表中的数据就是正确的数据。
问题点
这些数据怎么给运维呢?
我从本地t_user表中导出的数据只能是java
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文件代码以下mysql
//写入文件 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(); } } }
外层调用写入文件方法sql
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文件
运维