本ドキュメントでは、DBCPコネクションプール、MySQL Connector/J、およびOceanBaseデータベースを使用してアプリケーションを構築し、テーブルの作成、データの挿入、削除、更新、クエリなどの基本的なデータベース操作を実装する方法について説明します。
前提条件
-
OceanBase Cloudアカウントを登録し、クラスタインスタンスとOceanBase Cloud MySQLテナントを作成していること。詳細は、クラスタインスタンスの作成およびテナントの作成をご参照ください。
対象のMySQL互換モードテナントの接続文字列を取得していること。詳細な操作については、接続文字列の取得をご参照ください。
JDK 1.8およびMavenをインストールしていること。
Eclipseをインストールしていること。
説明
本ドキュメントでコードを実行するために使用するツールはEclipse IDE for Java Developers 2022-03バージョンですが、好みに応じて適切なツールを選択してサンプルコードを実行することもできます。
操作手順
<main id="notice" type='explain'>
<h4>説明</h4>
<p>本ドキュメントに記載されている手順は、Windows環境でEclipse IDE for Java Developers 2022-03を使用してプロジェクトをコンパイルおよび実行する手順です。他のオペレーティングシステム環境やコンパイラを使用している場合、手順が若干異なる場合があります。</p>
</main>
操作手順1:dbcp-mysql-clientプロジェクトをEclipseにインポートする
Eclipseを開き、メニューバーから File -> Open Projects from File System を選択します。
ポップアップダイアログで、Directory ボタンをクリックしてプロジェクトのディレクトリを選択し、Finish をクリックしてインポートを完了します。
説明
Eclipseを使用してMavenプロジェクトをインポートすると、Eclipseはプロジェクト内の
pom.xmlファイルを自動的に検出し、ファイルに記述された依存関係に基づいて必要な依存ライブラリを自動的にダウンロードしてプロジェクトに追加します。プロジェクトの状況を確認します。
操作手順2:dbcp-mysql-clientプロジェクトのデータベース接続情報を変更する
前提条件で取得した接続文字列情報に基づいて、ファイル dbcp-mysql-client/src/main/resources/db.properties 内のデータベース接続情報を変更します。
例は以下の通りです:
- 接続アドレスは
t5******.********.oceanbase.cloudです。 - アクセスポートは 3306 を使用します。
- アクセスするデータベース名は
testです。 - テナントの接続アカウントは
test_user001です。 - パスワードは
******です。
コードは以下の通りです:
...
url=jdbc:mysql://t5******.********.oceanbase.cloud:3306/test
username=test_user001
password=******
...
操作手順3:dbcp-mysql-clientプロジェクトを実行する
プロジェクトナビゲータービューで、src/main/java ディレクトリを見つけて展開します。
Main.java ファイルを右クリックし、Run As -> Java Application を選択します。
Eclipseのコンソールウィンドウでプロジェクトのログ情報と出力結果を確認します。
OceanBaseクライアント(OBClient)で以下のSQL文を実行して結果を確認することもできます。
obclient [test]> SELECT * FROM test_tbl1;表示される結果は以下の通りです:
+------+--------------+ | id | name | +------+--------------+ | 5 | test_update | | 6 | test_insert6 | | 7 | test_insert7 | | 8 | test_insert8 | | 9 | test_insert9 | +------+--------------+ 5 rows in set
プロジェクトコードの紹介
dbcp-mysql-client をクリックしてプロジェクトコードをダウンロードします。これは dbcp-mysql-client.zip という名称の圧縮パッケージです。
解凍すると、dbcp-mysql-client という名称のフォルダが作成されます。ディレクトリ構造は以下の通りです:
dbcp-mysql-client
├── src
│ └── main
│ ├── java
│ │ └── com
│ │ └── example
│ │ └── Main.java
│ └── resources
│ └── db.properties
└── pom.xml
ファイルの説明:
src:ソースコードのルートディレクトリ。main:メインコードディレクトリ。アプリケーションの主要なロジックが含まれます。java:Javaソースコードディレクトリ。com:Javaパッケージディレクトリ。example:サンプルプロジェクトのパッケージディレクトリ。Main.java:メインクラスプログラムのサンプルファイル。テーブルの作成、データの挿入、削除、更新、クエリなどのロジックが含まれます。resources:リソースファイルディレクトリ。設定ファイルなどが含まれます。db.properties:コネクションプールの設定ファイル。データベース接続に関連するパラメータが含まれます。pom.xml:Mavenプロジェクトの設定ファイル。プロジェクトの依存関係とビルド設定を管理するために使用されます。
pom.xml コードの紹介
pom.xml ファイルはMavenプロジェクトの設定ファイルであり、プロジェクトの依存関係、プラグイン、ビルドルールなどの情報を定義します。MavenはJavaプロジェクト管理ツールであり、依存関係の自動ダウンロード、プロジェクトのコンパイル、パッケージ化などの操作を行うことができます。
本ドキュメントの pom.xml ファイルのコードは、主に以下で構成されています:
ファイル宣言文。
このファイルがXMLファイルであることを宣言し、使用するXMLバージョンは
1.0、文字エンコーディングはUTF-8です。コードは以下の通りです:
<?xml version="1.0" encoding="UTF-8"?>POMの名前空間とPOMモデルバージョンの設定。
xmlnsを使用して、POMの名前空間をhttp://maven.apache.org/POM/4.0.0。`と指定します。 に指定します。xmlns:xsiを使用して、XMLの名前空間をhttp://www.w3.org/2001/XMLSchema-instance。`と指定します。 に指定します。xsi:schemaLocationを使用して、POMの名前空間をhttp://maven.apache.org/POM/4.0.0に、POMのXSDファイルの場所をhttp://maven.apache.org/xsd/maven-4.0.0.xsdに指定します。<modelVersion>要素を使用して、このPOMファイルで使用されるPOMモデルバージョンを4.0.0に指定します。
コードは以下の通りです:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!-- その他の設定 --> </project>基本情報の設定。
<groupId>を使用して、プロジェクトが属する組織をcom.exampleに指定します。<artifactId>を使用して、プロジェクト名をdbcp-mysql-clientに指定します。<version>を使用して、プロジェクトのバージョン番号を1.0-SNAPSHOTに指定します。
コードは以下の通りです:
<groupId>com.example</groupId> <artifactId>dbcp-mysql-client</artifactId> <version>1.0-SNAPSHOT</version>プロジェクトソースファイルのプロパティの設定。
Mavenのコンパイラプラグインを
maven-compiler-pluginに指定し、ソースコードとターゲットのJavaバージョンを両方とも8に設定します。これは、プロジェクトのソースコードがJava 8の機能を使用して記述され、コンパイルされたバイトコードもJava 8ランタイム環境と互換性があることを意味します。この設定により、プロジェクトのコンパイルおよび実行時にJava 8の構文と機能が正しく処理されることが保証されます。説明
Java 1.8とJava 8は、同じバージョンの異なる命名方式を採用しています。
コードは以下の通りです:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>8</source> <target>8</target> </configuration> </plugin> </plugins> </build>プロジェクトが依存するコンポーネントの設定。
<dependency>を使用して依存関係を定義します:MySQL JDBCの依存関係:
<groupId>を使用して、依存関係が属する組織をmysqlに指定します。<artifactId>を使用して、依存関係の名称をmysql-connector-javaに指定します。<version>を使用して、依存関係のバージョン番号を5.1.47に指定します。
dbcpの依存関係:
<groupId>を使用して、依存関係が属する組織をorg.apache.commonsに指定します。<artifactId>を使用して、依存関係の名称をcommons-dbcp2に指定します。<version>を使用して、依存関係のバージョン番号を2.9.0に指定します。
コードは以下の通りです:
<dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-dbcp2</artifactId> <version>2.9.0</version> </dependency> </dependencies>
db.properties コードの紹介
db.properties は本ドキュメントのサンプルのコネクションプール設定ファイルであり、コネクションプールの設定プロパティが含まれています。これらのプロパティには、ドライバのクラス名、データベースURL、ユーザー名、パスワード、コネクションプールのサイズと制限、接続のタイムアウト時間、および放棄された接続を処理するオプションが含まれます。
本ドキュメントの db.properties ファイルのコードは、主に以下で構成されています:
データベース接続パラメータの設定。
- ドライバのクラス名を設定します。ここではMySQL JDBCドライバのクラス名
com.mysql.jdbc.Driverです。 - データベース接続のURLを設定します。これには、ホストIP、ポート番号、アクセスするデータベースなどの情報が含まれます。
- データベースのユーザー名を設定します。
- データベースのパスワードを設定します。
- 接続プロパティを設定します。ここで
useSSL=falseはSSL暗号化接続を使用しないことを示し、characterEncoding=UTF-8はデータ転送にUTF-8エンコーディングを使用することを示します。
コードは以下の通りです:
driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://$host:$port/$database_name username=$user_name password=$password connectionProperties=useSSL=false;characterEncoding=UTF-8パラメータの説明:
$host:接続文字列の-hパラメータから取得した、OceanBase Cloudの接続アドレス。$port:接続文字列の-Pパラメータから取得した、OceanBase Cloudの接続ポート。$database_name:接続文字列の-Dパラメータから取得した、アクセスするデータベース名。$user_name:接続文字列の-uパラメータから取得した、アカウント名。$password:接続文字列の-pパラメータから取得した、アカウントのパスワード。
- ドライバのクラス名を設定します。ここではMySQL JDBCドライバのクラス名
その他のDBCPコネクションプールパラメータの設定。
- コネクションプールの初期サイズを
30に設定します。これは、コネクションプールで最初に作成される接続数です。 - コネクションプールの最大接続数を
30に設定します。これは、コネクションプールに存在できる最大接続数です。 - コネクションプールでアイドル状態を維持できる最大接続数を
10に設定します。 - コネクションプールでアイドル状態を維持する最小接続数を
5に設定します。アイドル接続数がこの値を下回ると、コネクションプールは新しい接続を作成します。 - コネクションプールから接続を取得する際の最大待機時間(ミリ秒単位)を
1000に設定します。コネクションプール内のすべての接続が使用中で、利用可能な接続がない場合、接続を取得するための操作は、利用可能な接続ができるか、最大待機時間を超えるまで待機します。 - 放棄された接続を削除する前のタイムアウト時間(秒単位)を
1に設定します。
説明
removeAbandonedTimeoutのデフォルト値は300秒ですが、本サンプルではプログラムのテストのために1秒で設定しています。なお、実際の状況に応じてこの値を適切に調整し、アプリケーションの要件を満たすことができます。プログラム内の接続が使用されなくなった後、コネクションプールによって回収されるかどうか:
- メンテナンスプロセス中に放棄された接続を検出してクリアするかどうかを設定します。
trueに設定します。 - コネクションプールから接続を借用する際に放棄された接続を検出してクリアするかどうかを設定します。
trueに設定します。
- メンテナンスプロセス中に放棄された接続を検出してクリアするかどうかを設定します。
コードは以下の通りです:
initialSize=30 maxTotal=30 maxIdle=10 minIdle=5 maxWaitMillis=1000 removeAbandonedTimeout=1 removeAbandonedOnMaintenance=true removeAbandonedOnBorrow=true- コネクションプールの初期サイズを
注意
具体的なプロパティ(パラメータ)の設定は、プロジェクトの要件とデータベースの特性に依存するため、実際の状況に応じて調整および設定することをお勧めします。DBCPコネクションプールパラメータの詳細については、BasicDataSource Configuration Parametersをご参照ください。
DBCPコネクションプールの基本データソース設定パラメータ:
分類 |
プロパティ |
デフォルト値 |
説明 |
|---|---|---|---|
| 必須パラメータ | driverClass | N/A | データベースドライバのクラス名を指定します。 |
| url | N/A | データベース接続時に使用するURLを指定します。 | |
| username | N/A | データベース接続時に使用するユーザー名を指定します。 | |
| password | N/A | データベース接続時に使用するパスワードを指定します。 | |
| 推奨設定パラメータ | initialSize | 0 | コネクションプールの初期サイズ、つまりコネクションプール起動時に作成される初期接続数を指定します。これを0より大きい値に設定すると、コネクションプールの初期化時に指定された数の接続が作成されます。これにより、事前に接続を作成し、クライアントが初めて接続を要求した際の遅延を減らすことができます。 |
| maxTotal | 8 | コネクションプールの最大接続数、つまりコネクションプールに存在できる最大接続数を指定します。負の数に設定した場合、制限がないことを意味します。 | |
| maxIdle | 8 | 追加の接続を解放せずに、コネクションプールでアイドル状態を維持できる最大接続数を指定します。負の数に設定した場合、制限がないことを意味します。 | |
| minIdle | 0 | 追加の接続を解放せずに、コネクションプールでアイドル状態を維持する最小接続数を指定します。負の数に設定した場合、制限がないことを意味します。 | |
| maxWaitMillis | indefinitely | コネクションプールから接続を取得する際の最大待機時間(ミリ秒単位)を指定します。-1に設定すると、無限に待機することを意味します。正の数に設定した場合、コネクションプール内の接続がすべて使用中のとき、接続を取得する操作は指定された時間待機し、時間を超えると例外がスローされます。 | |
| validationQuery | N/A | 接続が有効かどうかを検証するために使用するSQLクエリ文を指定します。指定する場合、このクエリは少なくとも1行を返す SQL SELECT 文である必要があります。指定しない場合、接続は isValid() メソッドを呼び出すことで検証されます。 |
|
| testOnBorrow | true | コネクションプールからオブジェクトを借用する際に検証を行うかどうかを指定します。オブジェクトが検証できない場合、コネクションプールから削除され、別のオブジェクトの借用が試行されます。 | |
| testWhileIdle | false | コネクションプールがアイドル時に検証を行うかどうかを指定します。true に設定すると、コネクションプールは定期的に検証クエリを実行してアイドル接続の有効性を確認します。オブジェクトが検証に合格しない場合、コネクションプールから削除されます。 |
|
| オプションパラメータ | connectionProperties | N/A | キーと値のペアの形式で追加の接続プロパティを指定します。これらのプロパティは、データベース接続を取得する際に基盤となるJDBCドライバに渡されるため、文字列の形式は propertyName=property; である必要があります。
注意
|
|
false | これら2つのパラメータは、接続が放棄されたと見なされるときの削除動作を制御するために使用されます。
true に設定することで、コネクションプールは放棄された接続を自動的に検出して削除します。放棄された接続とは、長時間使用されていない接続のことであり、アプリケーションが接続を正しく閉じていないことが原因である可能性があります。これらの放棄された接続を削除することで、データベースリソースを解放し、コネクションプールのパフォーマンスと効率を向上させることができます。 |
Main.java コードの紹介
Main.java ファイルはサンプルプログラムの一部であり、DBCPコネクションプールを介してデータベース接続を取得し、テーブルの作成、データの挿入、データの削除、データの更新、データのクエリなどの一連のデータベース操作を実行し、クエリ結果を出力します。
本ドキュメントの Main.java ファイルのコードは、主に以下で構成されています:
必要なクラスとインターフェースのインポート。
ファイルの読み取り、データベース操作、およびデータベースコネクションプールに関連するクラスとインターフェースを含む、必要なクラスとインターフェースをインポートします。これらのクラスとインターフェースは、後続のコードで使用されます。
- 現在のJavaクラスを格納するために使用される
com.exampleという名称のパッケージを宣言します。 - ファイルを読み取るために使用される
java.io.FileInputStreamクラスをインポートします。 - データベースとの接続を表す
java.sql.Connectionインターフェースをインポートします。 - プリコンパイルされたSQL文を表す
java.sql.PreparedStatementインターフェースをインポートします。 - データベースクエリの結果セットを表す
java.sql.ResultSetインターフェースをインポートします。 - SQL操作の例外を表す
java.sql.SQLException例外クラスをインポートします。 - 設定ファイルをロードするために使用される
java.util.Propertiesクラスをインポートします。 - データベースコネクションプールを表す
org.apache.commons.dbcp2.BasicDataSourceクラスをインポートします。 - データベースコネクションプールを作成するために使用される
org.apache.commons.dbcp2.BasicDataSourceFactoryクラスをインポートします。
コードは以下の通りです:
package com.example; import java.io.FileInputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Properties; import org.apache.commons.dbcp2.BasicDataSource; import org.apache.commons.dbcp2.BasicDataSourceFactory;- 現在のJavaクラスを格納するために使用される
クラス名とメソッドの定義。
- Mainクラスを作成し、プログラムのエントリポイントとして
mainメソッドを定義します。 mainメソッドで、まずcreateDataSource()メソッドを呼び出してコネクションプールオブジェクトdataSourceを作成します。try-with-resources文を使用して、コネクションプールオブジェクトのライフサイクルが終了したときにリソースを自動的に閉じます。tryコードブロックで、getConnection()メソッドを呼び出してコネクションプールからデータベース接続オブジェクトconnを取得します。createTable()、insertData()、deleteData()、updateData()、およびqueryData()メソッドを順に呼び出して、対応するデータベース操作を実行します。- 例外が発生した場合、
catchブロックを介して例外情報を出力します。
コードは以下の通りです:
public class Main { public static void main(String[] args) { try (BasicDataSource dataSource = createDataSource()) { try (Connection conn = dataSource.getConnection()) { createTable(conn); insertData(conn); deleteData(conn); updateData(conn); queryData(conn); } } catch (Exception e) { e.printStackTrace(); } } // コネクションプールの作成 // テーブル作成用メソッドの定義 // データ挿入用メソッドの定義 // データ削除用メソッドの定義 // データ更新用メソッドの定義 // データクエリ用メソッドの定義 }- Mainクラスを作成し、プログラムのエントリポイントとして
コネクションプールの作成。
データベースコネクションプールを簡単に作成するメソッドを提供し、設定ファイル内のパラメータを読み取ることでコネクションプールオブジェクトを初期化します。具体的な手順は以下の通りです:
- 戻り値の型が
BasicDataSourceであるプライベート静的メソッドcreateDataSource()を定義します。このメソッドはException例外をスローする可能性があります。 - データベース接続の設定情報を格納するために使用される
Propertiesオブジェクトpropsを作成します。 src/main/resourcesディレクトリにあるdb.propertiesファイルを読み取るために使用されるFileInputStreamオブジェクトisを作成します。load()メソッドを使用して、db.propertiesファイル内のキーと値のペアをpropsオブジェクトにロードします。 5.BasicDataSourceFactory.createDataSource(props)メソッドを呼び出し、propsオブジェクトをパラメータとして使用してBasicDataSourceオブジェクトを作成して返します。
コードは以下の通りです:
private static BasicDataSource createDataSource() throws Exception { Properties props = new Properties(); FileInputStream is = new FileInputStream("src/main/resources/db.properties"); props.load(is); return BasicDataSourceFactory.createDataSource(props); }- 戻り値の型が
テーブル作成用メソッドの定義。
データベースに指定されたテーブルを作成するメソッドを提供します。接続オブジェクトをパラメータとして受け取り、プリコンパイル方式を使用してテーブル作成のSQL文を実行します。具体的な手順は以下の通りです:
Connectionオブジェクトをパラメータとして受け取るプライベート静的メソッドcreateTable()を定義します。このメソッドはSQLException例外をスローする可能性があります。- テーブル作成のSQL文を格納するために使用される文字列変数
createTableSqlを定義します。SQL文ではテーブル名をtest_tbl1に指定し、idという名前のINT型の列と、nameという名前のVARCHAR(32)型の列の2つの列を定義します。 conn.prepareStatement(createTableSql)メソッドを使用して、プリコンパイルされたSQL文を実行するために使用されるPreparedStatementオブジェクトcreateTableStmtを作成します。execute()メソッドを呼び出してSQL文を実行し、テーブルを作成します。
コードは以下の通りです:
private static void createTable(Connection conn) throws SQLException { String createTableSql = "CREATE TABLE test_tbl1 (id INT, name VARCHAR(32))"; try (PreparedStatement createTableStmt = conn.prepareStatement(createTableSql)) { createTableStmt.execute(); } }データ挿入用メソッドの定義。
データベース内のテーブルに指定されたデータを挿入するメソッドを提供します。接続オブジェクトをパラメータとして受け取り、プリコンパイル方式を使用してデータ挿入のSQL文を実行します。具体的な手順は以下の通りです:
Connectionオブジェクトをパラメータとして受け取るプライベート静的メソッドinsertData()を定義します。このメソッドはSQLException例外をスローする可能性があります。データ挿入のSQL文を格納するために使用される文字列変数
insertDataSqlを定義します。conn.prepareStatement(insertDataSql)メソッドを使用して、プリコンパイルされたSQL文を実行するために使用されるPreparedStatementオブジェクトinsertDataStmtを作成します。forループを使用してテーブルにデータを挿入します:10回ループし、各ループで1件のデータを挿入します。setInt()メソッドを使用して、ループ変数iの値をSQL文の最初のパラメータ値として設定します。setString()メソッドを使用して、文字列test_insert + iをSQL文の2番目のパラメータ値として設定します。executeUpdate()メソッドを呼び出してSQL文を実行し、データベースにデータを挿入します。
コードは以下の通りです:
private static void insertData(Connection conn) throws SQLException { String insertDataSql = "INSERT INTO test_tbl1 (id, name) VALUES (?, ?)"; try (PreparedStatement insertDataStmt = conn.prepareStatement(insertDataSql)) { for (int i = 0; i < 10; i++) { insertDataStmt.setInt(1, i); insertDataStmt.setString(2, "test_insert" + i); insertDataStmt.executeUpdate(); } } }データ削除用メソッドの定義。
データベースから特定の条件を満たすデータを削除するメソッドを提供します。接続オブジェクトをパラメータとして受け取り、プリコンパイル方式を使用してデータ削除のSQL文を実行します。具体的な手順は以下の通りです:
Connectionオブジェクトをパラメータとして受け取るプライベート静的メソッドdeleteData()を定義します。このメソッドはSQLException例外をスローする可能性があります。- データ削除のSQL文を格納するために使用される文字列変数
deleteDataSqlを定義します。 conn.prepareStatement(deleteDataSql)メソッドを使用して、プリコンパイルされたSQL文を実行するために使用されるPreparedStatementオブジェクトdeleteDataStmtを作成します。setInt()メソッドを使用して、数値5をSQL文のパラメータ値として設定します。executeUpdate()メソッドを呼び出してSQL文を実行し、データベースから条件を満たすデータを削除します。
コードは以下の通りです:
private static void deleteData(Connection conn) throws SQLException { String deleteDataSql = "DELETE FROM test_tbl1 WHERE id < ?"; try (PreparedStatement deleteDataStmt = conn.prepareStatement(deleteDataSql)) { deleteDataStmt.setInt(1, 5); deleteDataStmt.executeUpdate(); } }データ更新用メソッドの定義。
データベース内の特定の条件を満たすデータを更新するメソッドを提供します。接続オブジェクトをパラメータとして受け取り、プリコンパイル方式を使用してデータ更新のSQL文を実行します。具体的な手順は以下の通りです:
Connectionオブジェクトをパラメータとして受け取るプライベート静的メソッドupdateData()を定義します。このメソッドはSQLException例外をスローする可能性があります。- データ更新のSQL文を格納するために使用される文字列変数
updateDataSqlを定義します。 conn.prepareStatement(updateDataSql)メソッドを使用して、プリコンパイルされたSQL文を実行するために使用されるPreparedStatementオブジェクトupdateDataStmtを作成します。setString()メソッドを使用して、文字列test_updateをSQL文の最初のパラメータ値として設定します。setInt()メソッドを使用して、数値5をSQL文の2番目のパラメータ値として設定します。executeUpdate()メソッドを呼び出してSQL文を実行し、データベース内の条件を満たすデータを更新します。
コードは以下の通りです:
private static void updateData(Connection conn) throws SQLException { String updateDataSql = "UPDATE test_tbl1 SET name = ? WHERE id = ?"; try (PreparedStatement updateDataStmt = conn.prepareStatement(updateDataSql)) { updateDataStmt.setString(1, "test_update"); updateDataStmt.setInt(2, 5); updateDataStmt.executeUpdate(); } }データクエリ用メソッドの定義。
データベース内のデータをクエリして処理するメソッドを提供します。接続オブジェクトをパラメータとして受け取り、プリコンパイル方式を使用してデータクエリのSQL文を実行します。具体的な手順は以下の通りです:
Connectionオブジェクトをパラメータとして受け取るプライベート静的メソッドqueryData()を定義します。このメソッドはSQLException例外をスローする可能性があります。データクエリのSQL文を格納するために使用される文字列変数
queryDataSqlを定義します。conn.prepareStatement(queryDataSql)メソッドを使用して、プリコンパイルされたSQL文を実行するために使用されるPreparedStatementオブジェクトqueryDataStmtを作成します。queryDataStmt.executeQuery()メソッドを介してSQLクエリを実行し、ResultSetオブジェクトrsを使用してクエリ結果を受け取ります。whileループを使用し、rs.next()メソッドを介してクエリ結果セットを反復処理します:getInt()メソッドを使用して、結果セット内のidという名称の列の整数値を取得し、それを変数idに代入します。getString()メソッドを使用して、結果セット内のnameという名称の列の文字列値を取得し、それを変数nameに代入します。- クエリ結果の
idとnameを出力します。
コードは以下の通りです:
private static void queryData(Connection conn) throws SQLException { String queryDataSql = "SELECT * FROM test_tbl1"; try (PreparedStatement queryDataStmt = conn.prepareStatement(queryDataSql)) { try (ResultSet rs = queryDataStmt.executeQuery()) { while (rs.next()) { int id = rs.getInt("id"); String name = rs.getString("name"); System.out.println("id: " + id + ", name: " + name); } } } }
全コード一覧
```java
<?xml version="1.0" encoding="UTF-8"?>
<groupId>com.example</groupId>
<artifactId>dbcp-mysql-client</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.9.0</version>
</dependency>
</dependencies>
# Database Connect Information
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://$host:$port/$database_name
username=$user_name
password=$password
connectionProperties=useSSL=false;characterEncoding=UTF-8
# ConnectionPool Parameters
initialSize=30
maxTotal=30
maxIdle=10
minIdle=5
maxWaitMillis=1000
removeAbandonedTimeout=1
removeAbandonedOnMaintenance=true
removeAbandonedOnBorrow=true
```java
package com.example;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
import org.apache.commons.dbcp2.BasicDataSource;
import org.apache.commons.dbcp2.BasicDataSourceFactory;
public class Main {
public static void main(String[] args) {
try (BasicDataSource dataSource = createDataSource()) {
try (Connection conn = dataSource.getConnection()) {
createTable(conn);
insertData(conn);
deleteData(conn);
updateData(conn);
queryData(conn);
}
} catch (Exception e) {
e.printStackTrace();
}
}
// Create ConnectionPool
private static BasicDataSource createDataSource() throws Exception {
Properties props = new Properties();
FileInputStream is = new FileInputStream("src/main/resources/db.properties");
props.load(is);
return BasicDataSourceFactory.createDataSource(props);
}
// Create table
private static void createTable(Connection conn) throws SQLException {
String createTableSql = "CREATE TABLE test_tbl1 (id INT, name VARCHAR(32))";
try (PreparedStatement createTableStmt = conn.prepareStatement(createTableSql)) {
createTableStmt.execute();
}
}
// Insert data
private static void insertData(Connection conn) throws SQLException {
String insertDataSql = "INSERT INTO test_tbl1 (id, name) VALUES (?, ?)";
try (PreparedStatement insertDataStmt = conn.prepareStatement(insertDataSql)) {
for (int i = 0; i < 10; i++) {
insertDataStmt.setInt(1, i);
insertDataStmt.setString(2, "test_insert" + i);
insertDataStmt.executeUpdate();
}
}
}
// Delete data
private static void deleteData(Connection conn) throws SQLException {
String deleteDataSql = "DELETE FROM test_tbl1 WHERE id < ?";
try (PreparedStatement deleteDataStmt = conn.prepareStatement(deleteDataSql)) {
deleteDataStmt.setInt(1, 5);
deleteDataStmt.executeUpdate();
}
}
// Update data
private static void updateData(Connection conn) throws SQLException {
String updateDataSql = "UPDATE test_tbl1 SET name = ? WHERE id = ?";
try (PreparedStatement updateDataStmt = conn.prepareStatement(updateDataSql)) {
updateDataStmt.setString(1, "test_update");
updateDataStmt.setInt(2, 5);
updateDataStmt.executeUpdate();
}
}
// Query data
private static void queryData(Connection conn) throws SQLException {
String queryDataSql = "SELECT * FROM test_tbl1";
try (PreparedStatement queryDataStmt = conn.prepareStatement(queryDataSql)) {
try (ResultSet rs = queryDataStmt.executeQuery()) {
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
System.out.println("id: " + id + ", name: " + name);
}
}
}
}
} ```
関連情報
MySQL Connector/Jの詳細については、MySQL Connector/Jの概要をご参照ください。