針對sqlserver數據表的備份工具很多,有時候條件限制需要我們自己生成insert語句,以便后期直接執行這些插入語句。下面提供了一個簡單的思路,針對mysql或oracle有興趣的以后可以試着修改。
public class GenInsertSql { private static Connection conn =null; private static Statement sm=null; private static String schema="dbo";//模式名 private static String select="SELECT * FROM";//查詢sql(針對一個表的時候,可以將*換成相應的列名) private static String where="WHERE 1=1 ";//where子句(慎用,最好針對一個表的時候用,注意修改createSQL方法) private static String insert="INSERT INTO";//插入sql private static String values="VALUES";//values關鍵字 private static List <String> insertList=new ArrayList <String>();//全局insertsql文件的數據 //存儲路徑 private static String sqlfilePath ="D:/platform/new/backinsertsql/";//絕對路徑,還未到最后一層 private static String xmname = "xxx";// 哪個項目 private static Boolean isOneFile = false; //是否寫到一個文件中取,如果為true,將寫到filePath中,否則寫到singleFilePath+表名中 private static String filePath = sqlfilePath+xmname+"/1.txt"; private static String singleFilePath = sqlfilePath+xmname; //備份哪些表 private static String [] table={"BA_CK_KCPD","SA_RY_GROUP"};//table數組 ,后期可以修改成list // 數據庫連 private static final String URL = "jdbc:jtds:sqlserver://11.11.11.11:1433;databaseName=xxx"; private static final String NAME = "sa"; private static final String PASS = "111111"; private static final String DRIVER = "net.sourceforge.jtds.jdbc.Driver"; /** * 導出數據庫表 * @param args * @throws SQLException */ //所有sql寫到一個文件中 private static void createFile() { File file= new File( filePath ); if (!file.exists()){ try { file.createNewFile(); } catch (IOException e) { System. out .println( " 創建文件名失敗!! " ); e.printStackTrace(); } } FileWriter fw= null ; BufferedWriter bw= null ; try { fw = new FileWriter(file); bw = new BufferedWriter(fw); if ( insertList .size()>0){ for ( int i=0;i< insertList .size();i++){ bw.append( insertList .get(i)); bw.append( "\n" ); } } } catch (IOException e) { e.printStackTrace(); } finally { try { bw.close(); fw.close(); } catch (IOException e) { e.printStackTrace(); } } } //sql分別寫到對應表名的文件中 private static void createFile(String filename,List <String> insertSqls) { File file= new File( singleFilePath+"/"+filename+".txt" ); if (!file.exists()){ try { file.createNewFile(); } catch (IOException e) { System. out .println( " 創建文件名失敗!! " ); e.printStackTrace(); } } FileWriter fw= null ; BufferedWriter bw= null ; try { fw = new FileWriter(file); bw = new BufferedWriter(fw); if ( insertSqls .size()>0){ for ( int i=0;i< insertSqls .size();i++){ bw.append( insertSqls .get(i)); bw.append( "\n" ); } } insertList.clear(); } catch (IOException e) { e.printStackTrace(); } finally { try { bw.close(); fw.close(); } catch (IOException e) { e.printStackTrace(); } } } /** * 拼裝查詢語句 * @return 返回select 集合 */ private static List<String> createSQL() { List<String> listSQL= new ArrayList<String>(); for ( int i=0;i< table . length ;i++){ StringBuffer sb= new StringBuffer(); sb.append( select ).append( " " ).append( schema ).append( "." ).append( table [i]) ; // .append( " " ).append(where) listSQL.add(sb.toString()); } return listSQL; } /** * 連接數據庫創建statement 對象 * @param driver * @param url * @param UserName * @param Password */ public static void connectSQL(String driver,String url,String UserName,String Password){ try { Class. forName (driver).newInstance(); conn = DriverManager. getConnection (url, UserName, Password); sm=conn .createStatement(); } catch (Exception e){ e.printStackTrace(); } } /** * 執行sql 並返回插入sql * @param conn * @param sm * @param listSQL * @throws SQLException */ @SuppressWarnings({ "unused", "rawtypes" }) public static void executeSQL(Connection conn,Statement sm,List listSQL)throws SQLException{ List<String> insertSQL= new ArrayList<String>(); ResultSet rs= null ; try { rs = getColumnNameAndColumeValue (sm, listSQL, rs); } catch (SQLException e) { e.printStackTrace(); } finally { rs.close(); sm.close(); conn.close(); } } /** * 獲取列名和列值 * @param sm * @param listSQL * @param rs * @return * @throws SQLException */ @SuppressWarnings("rawtypes") private static ResultSet getColumnNameAndColumeValue(Statement sm,List listSQL, ResultSet rs) throws SQLException { for (int j = 0; j < listSQL.size(); j++) { String sql = String.valueOf(listSQL.get(j)); rs = sm.executeQuery(sql); ResultSetMetaData rsmd = rs.getMetaData(); int columnCount = rsmd.getColumnCount(); while (rs.next()) { StringBuffer ColumnName = new StringBuffer(); StringBuffer ColumnValue = new StringBuffer(); for (int i = 1; i <= columnCount; i++) { String value = rs.getString(i); if (i == columnCount) { ColumnName.append(rsmd.getColumnName(i)); if (Types.CHAR == rsmd.getColumnType(i) || Types.VARCHAR == rsmd.getColumnType(i) || Types.LONGVARCHAR == rsmd.getColumnType(i)) { if (value == null) { ColumnValue.append("null"); } else { ColumnValue.append("'").append(value).append("'"); } } else if (Types.SMALLINT == rsmd.getColumnType(i) || Types.INTEGER == rsmd.getColumnType(i) || Types.BIGINT == rsmd.getColumnType(i) || Types.FLOAT == rsmd.getColumnType(i) || Types.DOUBLE == rsmd.getColumnType(i) || Types.NUMERIC == rsmd.getColumnType(i) || Types.DECIMAL == rsmd.getColumnType(i)) { if (value == null) { ColumnValue.append("null"); } else { ColumnValue.append(value); } } else if (Types.DATE == rsmd.getColumnType(i) || Types.TIME == rsmd.getColumnType(i) || Types.TIMESTAMP == rsmd.getColumnType(i)) { if (value == null) { ColumnValue.append("null"); } else { // ColumnValue.append("timestamp'").append(value).append("'"); //對於mysql可能需要timestamp,未測試 ColumnValue.append("'").append(value).append("'"); //對於sqlserver來說去掉timestamp } } else { if (value == null) { ColumnValue.append("null"); } else { ColumnValue.append(value); } } } else { ColumnName.append(rsmd.getColumnName(i) + ","); if (Types.CHAR == rsmd.getColumnType(i) || Types.VARCHAR == rsmd.getColumnType(i) || Types.LONGVARCHAR == rsmd.getColumnType(i)) { if (value == null) { ColumnValue.append("null,"); } else { ColumnValue.append("'").append(value).append("',"); } } else if (Types.SMALLINT == rsmd.getColumnType(i) || Types.INTEGER == rsmd.getColumnType(i) || Types.BIGINT == rsmd.getColumnType(i) || Types.FLOAT == rsmd.getColumnType(i) || Types.DOUBLE == rsmd.getColumnType(i) || Types.NUMERIC == rsmd.getColumnType(i) || Types.DECIMAL == rsmd.getColumnType(i)) { if (value == null) { ColumnValue.append("null,"); } else { ColumnValue.append(value).append(","); } } else if (Types.DATE == rsmd.getColumnType(i) || Types.TIME == rsmd.getColumnType(i) || Types.TIMESTAMP == rsmd.getColumnType(i)) { if (value == null) { ColumnValue.append("null,"); } else { // ColumnValue.append("timestamp'").append(value).append("',"); //對於mysql可能需要timestamp,未測試 ColumnValue.append("'").append(value).append("',"); //對於sqlserver來說去掉timestamp } } else { if (value == null) { ColumnValue.append("null,"); } else { ColumnValue.append(value).append(","); } } } } insertSQL( ColumnName, ColumnValue,j,rs.isLast());//j表示當前正在處理的表的順序 } } return rs; } /** * 拼裝insertsql 放到全局list 里面 * @param ColumnName * @param ColumnValue */ private static void insertSQL(StringBuffer ColumnName,StringBuffer ColumnValue,int order,Boolean isLast) { StringBuffer insertSQL= new StringBuffer(); insertSQL.append( insert ).append( " " ).append( schema ).append( "." ) .append( table [order]).append( " (" ).append(ColumnName.toString()) .append( ") " ).append( values ).append( " (" ).append(ColumnValue.toString()).append( ");" ); if(isOneFile){ insertList .add(insertSQL.toString()); if(order ==table.length -1 ) createFile(); //最后一個表完成時,創建文件 }else { insertList .add(insertSQL.toString()); if(isLast){ createFile(table [order],insertList); } } } //入口 public static void executeSelectSQLFile() throws Exception { List<String> listSQL= new ArrayList<String>(); connectSQL ( DRIVER , URL , NAME ,PASS ); // 連接數據庫 listSQL= createSQL (); // 創建查詢語句 executeSQL ( conn , sm,listSQL); // 執行sql 並拼裝 System.out.println("^^^^^^^^^^^^^^^^^^^^^^創建完畢!"); } public static void main(String[] args) throws Exception { executeSelectSQLFile(); } }
直接運行,即可生成txt文件,里面是insert語句。預覽一下:
代碼比較長,但邏輯還算清晰。原文作者已經不知道是誰了,在這里表示感謝!