應用場景:
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文件
運維