Spring Boot DB連携

各DBのIN句で1000件を超える項目を指定してみた

Oracleデータベースの場合、IN句で1000件を超える項目を指定するとエラーになってしまうが、他のDBではIN句に1001件の項目を指定してもエラーにならない。

今回は、MyBatisフレームワークを利用したSpring Bootアプリケーション内で、Oracle以外のデータベース(MySQL, PostgreSQL, SQL Server)上でIN句に1001件の項目を指定し実行するサンプルプログラムを作成してみたので、共有する。

前提条件

下記記事の実装が完了していること。

OracleのIN句で1000件を超える項目を指定してみたOracleデータベースの場合、IN句で1000件を超える項目を指定するとエラーになってしまうので、注意が必要である。 今回は、S...

また、下記記事の前提条件を満たしていること。

DB上でソートして上位n件のデータを取得してみた前回、Oracle上でソートして上位n件のデータを取得するSQLを作成したが、今回は他のDB上で同様のSQLを作成してみたので、共有する...

ストアドプログラムによるデータ追加

Oracle以外のデータベースについても、ストアドプログラムによってデータ追加が行える。ストアドプログラムによるデータ作成方法については、以下の記事を参照のこと。

各DB上でストアドプログラムを試してみた今回は、Oracle・MySQL・PostgreSQL・SQL Serverの各DB上でストアドプログラムを試してみたので、共有する。ス...

今回データ作成を行うために実行したSQLとSQL実行後のデータ件数はそれぞれ以下の通りで、実行後に各DB上に1001件のデータが作成されていることが確認できる。

●MySQL

<SQL実行後のデータ件数>
MySQLのデータ件数

●PostgreSQL

<SQL実行後のデータ件数>
PostgreSQLのデータ件数

●SQL Server

<SQL実行後のデータ件数>
SQLServerのデータ件数



サンプルプログラムの作成

作成したサンプルプログラムの構成は以下の通り。
サンプルプログラムの構成
なお、上記の赤枠は、前提条件のプログラムから追加/変更したプログラムである。

build.gradleの内容は以下の通りで、各DBに接続するためのJDBCライブラリを追加している。

application.propertiesの内容は以下の通りで、各DBに接続するための接続設定を追加している。なお、Oracleの接続先については、前提条件の記事と同じ内容となっている。

「EaseUS Todo Backup」は様々な形でバックアップ取得が行える便利ツールだったパソコン内のデータを、ファイル/パーティション/ディスク等の様々な単位でバックアップしたり、バックアップのスケジュール設定や暗号化設定も...

また、1つのSpring Bootアプリケーションから、複数DBに接続できるようにするには、Configクラスを作成する必要がある。

OracleのConfigクラスの内容は以下の通りで、DB接続に必要なデータソースプロパティ、データソース、トランザクションマネージャ、セッションファクトリを生成している。

データソースプロパティは、application.propertiesに指定した「spring.datasource」から取得するようにしている。また、1つのDB接続定義には@Primaryアノテーションを付与する必要があるため、OracleのConfigクラスの各メソッドに@Primaryアノテーションを付与している。

Oracle以外のConfigクラスでは、@Primaryアノテーションを付与しない状態で、Oracleの場合と同様に、DB接続に必要なリソースを生成している。以下はMySQLの場合のソースコードであるが、他のDBも同じような内容となる。



Mapperインタフェースは、Configクラスの@MapperScanアノテーション内のbasePackagesで指定したパッケージ内に、それぞれ作成している。以下はOracleとMySQLの場合のソースコードであるが、他のDBも同じような内容となる。

また、Mapperインタフェースから呼ばれるXMLファイルで、IN句を指定したSQLを記載している。以下はOracleとMySQLの場合のソースコードであるが、他のDBも同じような内容となる。

サラリーマン型フリーランスSEという働き方でお金の不安を解消しよう先日、「サラリーマン型フリーランスSE」という働き方を紹介するYouTube動画を視聴しましたので、その内容をご紹介します。 「サ...

さらに、Spring Bootのメインクラスの内容は以下の通りで、各DB上で定義したSQLを実行できるようにしている。

その他のソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/java/tree/master/spring-boot-db-in-over1000/demo



サンプルプログラムの実行結果

Spring Bootのメインクラス(DemoApplication.java)を実行した結果、コンソールログに出力される内容は以下の通り。
サンプルプログラムの実行結果
上記実行結果は、青枠部分が前提条件の記事のOracleの場合の実行結果となっていて、赤枠部分がMySQL, PostgreSQL, SQLServerの実行結果となっている。Oracle以外については、IN句が1001件の場合も正常に実行できることが確認できる。

ただし、以下のサイトの情報を見ると、各DB上でIN句の上限はそれぞれあるようだ。

●MySQL, PostgreSQLの場合
https://workmemo.techblog.jp/archives/36467399.html

●SQL Serverの場合
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14171212004

要点まとめ

  • Oracle以外のデータベース(MySQL, PostgreSQL, SQL Server)では、IN句に1001件の項目を指定してもエラーにならない。ただし上限はある。
  • 1つのSpring Bootアプリケーションから、複数DBに接続できるようにするには、Configクラスを作成し、DB接続に必要なデータソースプロパティ、データソース、トランザクションマネージャ、セッションファクトリを生成する処理を追加する。また、そのうちの1つのDB接続定義には@Primaryアノテーションを付与する必要がある。