Java – SQL Server 検索結果をAzure Blob Storage に保存 No.75

自己投資としてチャレンジしている内容を Blog で公開しています。

今回は SQL Server に接続し Select した結果を Azure Blob Storage へ出力する Java コードを紹介したいと思います。(In English: Java – Save the results of select query on SQL Server into Azure Blob Storage No.75)

▼1. SQL Server のデータを Azure Blob Storage へ移行する方法

今回お伝えする SQL Server から Azure Blob Storage へのコピーは、Azure が提供している Azure Data Factory で簡単に実行できます。以下のドキュメントが参考になります。今回はあえて Java で実装したいと思います。

(参考) データを SQL Server 間でコピー、および変換する – Azure Data Factory & Azure Synapse | Microsoft Learn


▼2. 事前準備

Ubuntu 上にインストールされた SQL Server に対して Select 文を実行します。

2-1. SQL Server のインストール

クイック スタート:Ubuntu に SQL Server をインストールし、データベースを作成する

2-2. Visual Studio Code のインストール

sudo snap install --classic code

https://code.visualstudio.com/docs/setup/linux

2-3. Maven のインストール

Apache Kafka Word Count 実装 – Java No.442-3. Apache Maven のインストール” の部分

2-4. SQL Server のサンプルデータの作成

SQL Server サンプルデータの作成 – Python No62

2-5. SQL Server で Select 文実行

SQL Server への Select の実行に関わる Java の実装はこちらが参考になります。
Java SQL Server on Linux で select を実行する方法 No8


▼3. SQL Server のデータを Azure Blob Storage にアップロードするコード

3-1. ディレクトリを作成。

アプリケーションを作成するため、ディレクトリを作成します。

mkdir sqlsrvtest
cd sqlsrvtest

3-2. Apache Maven によるプロジェクトを作成。

cd sqlsrvtest
mvn archetype:generate -DinteractiveMode=false -DgroupId=org.example.sqlsrv -DartifactId=sqlSrvOutput -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4
(出力の一部)
xxxx
[INFO] Generating project in Batch mode
[INFO] Archetype repository not defined. Using the one from [org.apache.maven.archetypes:maven-archetype-quickstart:1.4] found in catalog remote
[INFO] -------------------------------------------------------------------
[INFO] Using following parameters for creating project from Archetype: maven-archetype-quickstart:1.4
[INFO] --------------------------------------------------------------------
[INFO] Parameter: groupId, Value: org.example.sqlsrv
[INFO] Parameter: artifactId, Value: sqlSrvOutput
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] Parameter: package, Value: org.example.sqlsrv
[INFO] Parameter: packageInPathFormat, Value: org/example/sqlsrv
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] Parameter: package, Value: org.example.sqlsrv
[INFO] Parameter: groupId, Value: org.example.sqlsrv
[INFO] Parameter: artifactId, Value: sqlSrvOutput
[INFO] Project created from Archetype in dir: /home/xxx/sqlSrvOutput
[INFO] --------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] --------------------------------------------------------------------
[INFO] Total time:  3.858 s
[INFO] Finished at: 2022-11-12T22:35:18+09:00
[INFO] --------------------------------------------------------------------

3-3. デフォルトで作成された App.java および AppTest.java を削除。

rm ./sqlSrvOutput/src/main/java/org/example/sqlsrv/App.java
rm ./sqlSrvOutput/src/test/java/org/example/sqlsrv/AppTest.java

3-4. Visual Studio Code を起動。

cd ./sqlSrvOutput
code .

3-5. pom.xml に、SQL Server および Azure Blob Storage の操作のため library を追記し保存 (Ctrl+S)

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>com.microsoft.sqlserver</groupId>
      <artifactId>mssql-jdbc</artifactId>
      <version>11.2.1.jre8</version>
    </dependency>
    <dependency>
      <groupId>com.azure</groupId>
      <artifactId>azure-storage-blob</artifactId>
      <version>12.13.0</version>
    </dependency>   
  </dependencies>

3-6. copysqlsrvtoblob.java を作成。

package org.example.sqlsrv;

import java.io.FileNotFoundException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import com.azure.storage.blob.*;

public class copysqlsrvtoblob {
    // select data from SQL Server
    public static void main(String[] args) throws SQLException {
        String connectStr = "DefaultEndpointsProtocol=https;AccountName=xxx;AccountKey=yourkey;EndpointSuffix=core.windows.net";
        String containerName = "files";
        String fileName = "sqlSrvOutput.csv";
        String localPath = "/home/xxx/sqlsrvtoblob/sqlSrvOutput/";

        // Get a reference to a container
        BlobServiceClient BlobServiceClient = new BlobServiceClientBuilder().connectionString(connectStr).buildClient();
        BlobContainerClient containerClinet = BlobServiceClient.getBlobContainerClient(containerName);

        String url = "jdbc:sqlserver://localhost:1433;databaseName=sampledb;user=sa;password=yourpassowrd;encrypt=false";
        Connection conn = DriverManager.getConnection(url);
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery("select * from dbo.sampletable");
        List<String> list = new ArrayList<String>();
        while (rs.next()) {
            String ID = rs.getString("id");
            String NUM = rs.getString("num");
            String cdatetime = rs.getString("cdatetime");
            String note = rs.getString("note");
            String str = ID + "," + NUM + "," + cdatetime + "," + note;
            list.add(str);
        }
        rs.close();
        stmt.close();
        conn.close();

        // save local file
        String filename = "/home/xxx/sqlsrvtoblob/sqlSrvOutput/sqlSrvOutput.csv";
        try {
            java.io.PrintWriter output = new java.io.PrintWriter(filename);
            for (int i = 0; i < list.size(); i++) {
                output.println(list.get(i));
            }
            output.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        // Upload a file to the blob
        BlobClient blobClient = containerClinet.getBlobClient(fileName);
        System.out.println("Uploading to Azure Blob storage as blob:\n\t" + blobClient.getBlobUrl());
        blobClient.uploadFromFile(localPath + "/" + fileName);
    }
}

3-7. 実行後 csv ファイルを生成、Azure Blob Storage に保存。

(出力の一部)
----------------------------------------
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Uploading to Azure Blob storage as blob:
	https://xxx.blob.core.windows.net/files/sqlSrvOutput.csv
----------------------------------------

sqlSrvOutput.csv の中身は以下となります。

1,0,2022-10-20 16:13:13.477,init
2,1,2022-10-20 16:12:11.777,a
3,2,2022-10-20 16:12:11.777,ah
4,3,2022-10-20 16:12:11.777,lam
5,4,2022-10-20 16:12:11.777,nddv
6,5,2022-10-20 16:12:11.777,vdhpw
7,6,2022-10-20 16:12:11.777,fdfszy
8,7,2022-10-20 16:12:11.777,rgofcgt
9,8,2022-10-20 16:12:11.777,hezwdqae
10,9,2022-10-20 16:12:11.777,bywqcunva

▼4. 参考情報

1. Java SQL Server on Linux で select を実行する方法 No8
2. クイック スタート:Ubuntu に SQL Server をインストールし、データベースを作成する
3. VS Code のインストール https://code.visualstudio.com/docs/setup/linux
4. Maven のインストール Apache Kafka Word Count 実装 – Java No.44
5. SQL Server サンプルデータの作成 – Python No62
6. Java Azure Blob Storage へファイルのアップロード No.69

以上です。参考になりましたら幸いです。



コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です