JavaからSQL Databaeを操作する方法
Azure SQL DatabaseにJavaから接続する方法とCRUD操作の方法
■開発環境
OS:Windows
Java:Java11
フレームワーク:Spring Boot
DB:Azure SQL Database
IDE:Eclipse(ver:2019-06)
ビルドツール:Gradle
■Azure Portal画面からDB接続文字列を取得
SQL DatabaseリソースのJDBCの接続文字列を取得
■DB接続
public static void main(String[] args) {
SpringApplication.run(SampleApplication.class, args);
// DB接続文字列
String connectionStr = [DB接続文字列];
// DB接続
try (Connection connection = DriverManager.getConnection(connectionStr);) {
}
catch (SQLException e) {
e.printStackTrace();
}
}
■DB接続(トランザクション)
public static void main(String[] args) {
SpringApplication.run(SampleApplication.class, args);
// DB接続文字列
String connectionStr = [DB接続文字列];
// catch句でも使用できるよう、Connectionを外出し
Connection connection = nulll;
try {
// DB接続
connection = DriverManager.getConnection(connectionStr);
// 自動コミットをオフ
connection.setAutoCommit(false);
//コミット
connection.commit();
}
catch (SQLException e) {
try {
// ロールバック
connection.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
}
}
■SELECT
public static void main(String[] args) {
// DB接続文字列
String connectionStr = [DB接続文字列];
// DB接続
try (Connection connection = DriverManager.getConnection(connectionStr);) {
//===========================
//SELECT文(パラメーター無し)
// StatementのexecuteQueryにSELECT文を渡し、ResultSetで受け取る
Statement st = connection.createStatement();
ResultSet rs1 = st.executeQuery("SELECT * FROM test");
while (rs1.next()) {
// int型のカラムidを取得
int id = rs1.getInt("id");
// String型のカラムnameを取得
String name = rs1.getString("name");
System.out.println(id + ":" + name);
}
//===========================
//SELECT文(パラメーター有り)
// connection.prepareStatementにSELECT文をパラメーターにしたい部分を?にして渡し、PreparedStatementで受け取る
PreparedStatement ps = connection.prepareStatement("SELECT * FROM test WHERE ID = ?");
// パラメーターをセット
// ※下記では1つ目のパラメーター(INT型)に5をセットしている
// ※パラメーターが複数の時は「ps.setString(2, "abc");」のように型とカラム名を指定する
// ※Date型はjava.sqlのDate型で指定する
ps.setInt(1, 5);
// PreparedStatementのexecuteQueryでSQLを実行し、ResultSetで受け取る
ResultSet rs2 = ps.executeQuery();
while (rs2.next()) {
int id = rs2.getInt("id");
String name = rs2.getNString("name");
System.out.println(id + ":" + name);
}
}
catch (SQLException e) {
// エラー時の処理
e.printStackTrace();
}
■UPDATE ※INSERT・DELETEも同様
public static void main(String[] args) {
SpringApplication.run(SampleApplication.class, args);
// DB接続文字列
String connectionStr = [DB接続文字列];
// DB接続
try (Connection connection = DriverManager.getConnection(connectionStr);) {
//===========================
//UPDATE文(パラメーター無し)
// StatementのexecuteUpdateにUPDATE文を渡して実行(更新行はINT型で受け取る事が可能)
Statement st = connection.createStatement();
int updateCount1 = st.executeUpdate("UPDATE test SET name = 'hoge'");
System.out.println(updateCount1);
//===========================
//UPDATE文(パラメーター有り)
// connection.prepareStatementにUPDATE文をパラメーターにしたい部分を?にして渡し、PreparedStatementで受け取る
PreparedStatement ps = connection.prepareStatement("UPDATE test SET name = 'fuga' WHERE ID = ?");
// パラメーターをセット
// ※下記では1つ目のパラメーター(INT型)に5をセットしている
// ※パラメーターが複数の時は「ps.setString(2, "abc");」のように型とカラム名を指定する
// ※Date型はjava.sqlのDate型で指定する
ps.setInt(1, 5);
// PreparedStatementのexecuteUpdateにSQLを実行(更新行はINT型で受け取る事が可能)
int updateCount2 = ps.executeUpdate();
System.out.println(updateCount2);
}
catch (SQLException e) {
// エラー時の処理
e.printStackTrace();
}
}
■executeBatchメソッド
1回のクエリで複数のクエリを実行する
更新行が大量にある時に、executeBatchメソッドを使うとパフォーマンスが向上する
public static void main(String[] args) {
SpringApplication.run(SampleApplication.class, args);
// DB接続文字列
String connectionStr = [DB接続文字列];
// DB接続
try (Connection connection = DriverManager.getConnection(connectionStr);) {
//===========================
//UPDATE文(パラメーター無し)
// StatementのaddBatchメソッドでクエリを登録
Statement st = connection.createStatement();
st.addBatch("UPDATE test SET name = 'aaa' where id = 1");
st.addBatch("UPDATE test SET name = 'bbb' where id = 2");
st.addBatch("UPDATE test SET name = 'ccc' where id = 3");
st.addBatch("UPDATE test SET name = 'ddd' where id = 4");
st.addBatch("UPDATE test SET name = 'eee' where id = 5");
st.addBatch("UPDATE test SET name = 'fff' where id = 6");
st.addBatch("UPDATE test SET name = 'ggg' where id = 7");
st.addBatch("UPDATE test SET name = 'hhh' where id = 8");
// executeBatchメソッドでクエリ実行(戻り値はINT型の配列)
int[] updateCount1 = st.executeBatch();
// 更新行をカウント
int resultCount1 = 0;
for (int i : updateCount1) {
resultCount1 += i;
}
System.out.println(resultCount1);
//===========================
//UPDATE文(パラメーター有り)
// connection.prepareStatementにUPDATE文をパラメーターにしたい部分を?にして渡し、PreparedStatementで受け取る
PreparedStatement ps = connection.prepareStatement("UPDATE test SET name = ? WHERE ID = ?");
// パラメーターをセットして、addBatchメソッドでクエリ登録
ps.setString(1, "AAA");
ps.setInt(2, 1);
ps.addBatch();
ps.setString(1, "BBB");
ps.setInt(2, 2);
ps.addBatch();
// executeBatchメソッドでクエリ実行(戻り値はINT型の配列)
int[] updateCount2 = ps.executeBatch();
// 更新行をカウント
int resultCount2 = 0;
for (int i : updateCount2) {
resultCount2 += i;
}
System.out.println(resultCount2);
}
catch (SQLException e) {
// エラー時の処理
e.printStackTrace();
}
}