使用java生成備份sqlserver數據表的insert語句


針對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語句。預覽一下:

代碼比較長,但邏輯還算清晰。原文作者已經不知道是誰了,在這里表示感謝!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM