Java SQLServerBulKCopyによるSQLSqerverデータベースの一括挿入

8785 ワード

これはCodingSirの投稿です(詳細が足りないため、私は今詳細に提供しています.
Microsoft SQL Serverのbcpコマンドは、大規模なファイルをすばやくデータベースにコピーして挿入できます.C#はSqlBulkCopyメソッドでこの機能を実現しますが、javaではSQLServerBulkCopyクラスで同様の機能を実現できます.insert、updateなどのコマンドに比べて、このクラスの効率はずっと高いです.(よく使われるJDBCのBatchよりも方法が高いことが多い).
SQLServerBulkCopyクラスはSQL Severデータベースへの挿入にのみ使用できますが、データソースはSQL Severデータベースではありません.
旧バージョンのMicrosoftSQL Server JDBCドライバはこのクラスを提供していません.MicrosoftSQL Server JDBCドライバ6.0のバージョンをダウンロードする必要があります.https://www.microsoft.com/zh-cn/download/confirmation.aspx?id=11774
MS公式の説明ドキュメントとダウンロードパッケージはこのアドレスにあります.https://docs.microsoft.com/en-us/sql/connect/jdbc/using-bulk-copy-with-the-jdbc-driver
SQLServerBulKCopyクラスは、Java自体が提供するResultSet、RowSet、JDBCが提供するISQLServerBulkRecordインタフェース実装クラスの3種類のパッケージデータをデータベースに挿入します.以下に実装を示します.
BaseDao  :
public class BaseDao {
    //  
    private static String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";

    //     
    private static String url = "jdbc:sqlserver://127.0.0.1:1433;SelectMethod=cursor;DatabaseName=     ;";

    //      
    private static String name = "sa";

    //     
    private static String password = "123456";

    //     ,       ,    
    private Connection con;

    //    ,              ,        ,      
    static{
        try{
            Class.forName(driver);
        }catch (ClassNotFoundException e) {
            //        
            e.printStackTrace();
        }
    }

    //
    public BaseDao () {
        try {
            con=DriverManager.getConnection(url,name,password);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }

    //    ,       ,     
    public ResultSet executeSQL (String sql,Object...object) throws SQLException{
        PreparedStatement ps=con.prepareStatement(sql);

        for(int i=0;i){
            //ps         1  
            ps.setObject(i+1,object[i]);
        }

        //     
        return ps.executeQuery();
    }

    //
    public int executeUpdate(String sql,Object...object) throws SQLException {
        PreparedStatement ps=con.prepareStatement(sql);
        for(int i=0;i){
            ps.setObject(i+1,object[i]);
        }
        //  int      
        return ps.executeUpdate();
    }

    //       
    public void close() throws SQLException{
        con.close();
    }
}

次のコードは、ツールクラスにもカプセル化できます.
public static void main(String[] args) {
    String url = "jdbc:sqlserver://127.0.0.1:1433;SelectMethod=cursor;DatabaseName=     "
                + ";user=sa;password=123456";
        //         CachedRowSetImpl           
        BaseDao baseDao=new BaseDao();
        ResultSet rs = baseDao.executeSQL("select * from curr where 1=0");
        CachedRowSetImpl crs = new CachedRowSetImpl();
        crs.populate(rs);

     //
     for(int i=0;i// “ ”,   crs.moveToInsertRow();   // ( , )
                 // ,
  crs.updateString("monetary_code", "014");//string   crs.updateString("curr_code", "CNY");   crs.updateString("name", " ");
       // , api, crs.update***   //crs.updateInt("curr_code", 2);//int
  
//   crs.insertRow();   //   crs.moveToCurrentRow();
     }
     // SQLServerBulkCopyOptions copyOptions
= new SQLServerBulkCopyOptions(); copyOptions.setKeepIdentity(true); copyOptions.setBatchSize(8000); copyOptions.setUseInternalTransaction(true); SQLServerBulkCopy bulkCopy = new SQLServerBulkCopy(url); bulkCopy.setBulkCopyOptions(copyOptions); bulkCopy.setDestinationTableName("curr"); bulkCopy.writeToServer(crs); crs.close(); bulkCopy.close();
}

 
感想:大牛は白さんに細かい世話をしていないので、詳しく書いてあげることにしました.みんなの時間を節約します.気に入らなければ噴き出さない