自己投資としてチャレンジしている内容を 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_HOME2-3. Visual Studio Code のインストール
sudo snap install --classic codehttps://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 sqlsrvtest3-2. Apache Maven によるプロジェクトを作成。
cd sqlsrvtest
mvn archetype:generate -DinteractiveMode=false -DgroupId=org.example.sqlsrv -DartifactId=sqlSrvOutput -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.43-3. デフォルトで作成された App.java および AppTest.java を削除。
rm ./sqlSrvOutput/src/main/java/org/example/sqlsrv/App.java
rm ./sqlSrvOutput/src/test/java/org/example/sqlsrv/AppTest.java3-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. 参考情報
- SQL Server のインストール https://learn.microsoft.com/ja-jp/sql/linux/quickstart-install-connect-ubuntu?view=sql-server-ver15
- SQL Server サンプルデータの作成 – Python No.62
以上です。参考になりましたら幸いです。