プログラミング逆引き辞典

~ 多言語対応のプログラミングレシピ ~

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();
    }
}