Java – SQL Server サンプルデータの作成 VS Code No.87

自己投資としてチャレンジしている内容を Blog で公開しています。今回は Java による Microsoft  SQL Server 用サンプルデータの作成方法について紹介します。(In English Java – Generating the sample data on SQL Server No.87)

ポイントとしては、Java で sqlcmd コマンドを実行し、クエリを実行している点となります。JDBC ドライバーを使った SQL Server への接続はしていません。

▼1. Java を使ったサンプルデータの作成

以前、Python を使った SQL Server のサンプルデータの作成方法を案内しました。
SQL Server サンプルデータの作成 – Python No.62

その際、データを生成する部分に関して拡張子 .sql のファイルを作成後、sqlcmd の引数に渡して実行していましたが、今回、データ生成に関して .sql のファイル作成せず、 Java の中でクエリを直接渡し sqlcmd を実行しています。


▼2. 準備

2-1. SQL Server on Linux をインストール

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

2-2. JDK のインストール

zulu の Java 8 openjdk x64 をインストールします。

mkdir  -p /usr/lib/jvm/
cd /usr/lib/jvm/
sudo wget https://cdn.azul.com/zulu/bin/zulu8.66.0.15-ca-jdk8.0.352-linux_x64.tar.gz
sudo tar -xzvf zulu8.66.0.15-ca-jdk8.0.352-linux_x64.tar.gz
sudo mv zulu8.66.0.15-ca-jdk8.0.352-linux_x64 java-8-openjdk-linux_x64

環境変数を設定します。Vi などのエディター (vi ~/.bashrc) で ~/.bashrc の末尾に以下を記載します。

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-x64/

JAVA_HOME の環境変数がが正しく設定されたか確認します。

echo $JAVA_HOME

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

sudo snap install --classic code

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

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

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

2-5. データベースおよびテーブルを生成するクエリの作成

データベースおよびテーブルを作成するクエリcreatedbtable.sql を作成します。

// createdbtable.sql の中身
IF NOT EXISTS (SELECT * FROM sys.databases WHERE name = 'sampleDB')
Begin
	Create database sampleDB
End;
use sampleDB;
IF EXISTS (SELECT * FROM sys.tables WHERE name = 'sampletable')
Begin
	drop table sampletable
END;
Create table sampletable(
	id int identity(1,1) not null,
	num int,
	cdatetime datetime,
	note nvarchar(max)
);

この sql 文ではデータベース sampleDB を作成し、その DB の中で sampletable を作成しています。sampletable のスキマは以下のようになっています。

sampletable の Schema

Column_name Type    
----------- --------
id          int     
num         int     
cdatetime   datetime
note        nvarchar

▼3. サンプルデータを生成する Java コード

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

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>
  </dependencies>

3-6. サンプルデータを生成する java ファイル作成

上記 2-5 で作成しテキストに保存したクエリを sqlcmd の引数に指定し実行これにより、データベースおよび、テーブルが作成されます。

その後、ランダムな文字列を含むデータを insert します。今回の例では 10 件ですが、目的に合わせ、件数を増やしたり、テーブルの列を増やすなどで、レコードのサイズを大きくすることも可能です。createtable.sql が存在するパスを “Filename” に指定します。また SQL Server への接続ユーザーおよびパスワードを変更してください。

package org.example.sqlsrv;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class sqlgensample {

    //create table
    public static String sqlgentable() {
        // read the file and put it into a string
        String filename = "/home/xxx/sqlsrvtest/sqlsample/createtable.sql";
        String line = null;
        String sql = "";
        
        try {
            FileReader fileReader = new FileReader(filename);
            BufferedReader bufferedReader = new BufferedReader(fileReader);
            while((line = bufferedReader.readLine()) != null) {
                sql += line;
            }
            bufferedReader.close();
        }
        catch(FileNotFoundException ex1) {
            System.out.println("Unable to open file '" + filename + "'");
        }
        catch(IOException ex2) {
            System.out.println("Error reading file '" + filename + "'");
        }

        return sql;
    }


    // create an insert query and save it to a string
    public static String insertQuery() {
        String query = "INSERT INTO sampletable (num, cdatetime, note) VALUES (0,CURRENT_TIMESTAMP,'init')";     
        
        for (int num=0; num<10; num++) {
            String AlphaNumericString ="ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "0123456789" + "abcdefghijklmnopqrstuvxyz";
            StringBuilder sb = new StringBuilder(10);

            for (int i = 0; i < 10; i++) {
                int index = (int)(AlphaNumericString.length() * Math.random());
                sb.append(AlphaNumericString.charAt(index));
            }
            String randomString = sb.toString();
            query += ",(" + num + ",CURRENT_TIMESTAMP,'" + randomString + "')";
        }
        query += ";";

        return query;
    }

    public static void main(String[] args) {
        //System.out.println(insertQuery());
        //System.out.println(sqlgentable());

        try{
            String[] sqlcommand1= {"sqlcmd", "-S", "localhost", "-U", "sa", "-P", "Password", "-d", "sampledb", "-Q", sqlgentable()};
            Process p1 = Runtime.getRuntime().exec(sqlcommand1);
            p1.waitFor();
            BufferedReader reader1 = new BufferedReader(new InputStreamReader(p1.getInputStream()));
            String line1 = "";
            while ((line1 = reader1.readLine())!= null) {
                System.out.println(line1);
            }
        }catch(Exception e){
            System.out.println(e);
        }

        try{
            String[] sqlcommand2 = {"sqlcmd", "-S", "localhost", "-U", "sa", "-P", "Password", "-d", "sampledb", "-Q", insertQuery()};
            Process p2 = Runtime.getRuntime().exec(sqlcommand2);
            p2.waitFor();
            BufferedReader reader2 = new BufferedReader(new InputStreamReader(p2.getInputStream()));
            String line2 = "";
            while ((line2 = reader2.readLine())!= null) {
                System.out.println(line2);
            }
        }catch(Exception e){
            System.out.println(e);
        }
    }
}

3-7.  クエリの実行結果

Changed database context to 'sampleDB'.

(11 rows affected)

3-8, 生成したデータを確認

SQL Server に接続し、データを確認します。

3> select * from sampletable;
4> go
id          num         cdatetime               note
----------- ----------- ----------------------- ---------------
          1           0 2022-11-29 12:51:13.930 init
          2           0 2022-11-29 12:51:13.930 oUu5REuOBD
          3           1 2022-11-29 12:51:13.930 JUrBJkXeLx
          4           2 2022-11-29 12:51:13.930 TT1JBlRQCU
          5           3 2022-11-29 12:51:13.930 moXq78miPl
          6           4 2022-11-29 12:51:13.930 gLOeDj0gjx
          7           5 2022-11-29 12:51:13.930 NSFOy1ZlAa
          8           6 2022-11-29 12:51:13.930 D9Kyo4XFSd
          9           7 2022-11-29 12:51:13.930 eWFF74pf6H
         10           8 2022-11-29 12:51:13.930 JH65hfBYBs
         11           9 2022-11-29 12:51:13.930 BMa6AZ8Zuc

▼4. 参考情報

  1. SQL Server のインストール https://learn.microsoft.com/ja-jp/sql/linux/quickstart-install-connect-ubuntu?view=sql-server-ver15
  2. SQL Server サンプルデータの作成 – Python No.62

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



コメントを残す

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