本記事では、Druid接続プール、MySQL Connector/J、およびOceanBaseデータベースを使用してアプリケーションを構築し、テーブルの作成、データの挿入、更新、削除、クエリ、テーブルの削除など、基本的なデータベース操作を実装する方法について説明します。
前提条件
OB Cloudデータベースアカウントに登録済みで、クラスタインスタンスとOB Cloud MySQLモードのテナントを作成していること。詳細については、クラスタインスタンスの作成およびテナントの作成をご参照ください。
対象のMySQL互換モードテナントの接続文字列を取得済みであること。詳細な操作については、接続文字列の取得をご参照ください。
JDK 1.8とMavenをインストール済みであること。
Eclipseをインストール済みであること。
説明
このドキュメントでコードを実行するために使用されているツールはEclipse IDE for Java Developers 2022-03バージョンですが、個人の好みに応じて適したツールを選択してサンプルコードを実行することもできます。
操作手順
説明
本記事で示す操作手順は、Windows環境でEclipse IDE for Java Developers 2022-03を使用してこのプロジェクトをコンパイルおよび実行する場合のものです。他のOS環境やコンパイラを使用する場合は、手順が若干異なる可能性があります。
ステップ1:druid-mysql-clientプロジェクトをEclipseにインポートする
Eclipseを開き、メニューバーからFile->Open Projects from File Systemを選択します。
ポップアップダイアログで、Directoryボタンをクリックしてプロジェクトのディレクトリを選択し、Finishをクリックしてインポートを完了します。
説明
Eclipseを使用してMavenプロジェクトをインポートすると、プロジェクト内の
pom.xmlファイルを自動的に検出し、その記述に基づいて必要な依存ライブラリをダウンロードしてプロジェクトに追加します。
プロジェクトの状況を確認します。

ステップ2:druid-mysql-clientプロジェクトのデータベース接続情報を修正する
前提条件で取得した接続文字列情報に基づいて、druid-mysql-client/src/main/resources/db.properties ファイル内のデータベース接続情報を修正します。
例:
- 接続アドレスは
t5******.********.oceanbase.cloudです。 - アクセスポートは3306を使用します。
- アクセスするデータベース名は
testです。 - テナントの接続アカウントは
test_user001です。 - パスワードは
******です。
コード:
...
url=jdbc:mysql://t5******.********.oceanbase.cloud:3306/test?useSSL=false
username=test_user001
password=******
...
ステップ3:druid-mysql-clientプロジェクトを実行する
プロジェクトナビゲータービューで、druid-mysql-client/src/main/javaディレクトリを見つけて展開します。
Main.javaファイルを右クリックし、Run As->Java Applicationを選択します。

Eclipseのコンソールウィンドウで出力結果を確認します。

プロジェクトコードについて
druid-mysql-client をクリックしてプロジェクトコードをダウンロードします。これは、druid-mysql-client.zip という名前の圧縮ファイルです。
解凍すると、druid-mysql-client という名前のフォルダが作成されます。ディレクトリ構造は以下のとおりです:
druid-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>を使用して、プロジェクトの名前をdruid-mysql-clientと指定します。<version>を使用して、プロジェクトのバージョン番号を1.0-SNAPSHOTと指定します。
コード:
<groupId>com.example</groupId> <artifactId>druid-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>プロジェクトが依存するコンポーネントを設定します。
データベースとのやり取りを行うために、
mysql-connector-java依存ライブラリを追加します:<groupId>を使用して、依存関係の所属組織をmysqlと指定します。<artifactId>を使用して、依存関係の名前をmysql-connector-javaと指定します。<version>を使用して、依存関係のバージョン番号を5.1.40と指定します。
コード:
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.40</version> </dependency>druid依存ライブラリを追加します:<groupId>を使用して、依存関係の所属組織をcom.alibabaと指定します。<artifactId>を使用して、依存関係の名前をdruidと指定します。<version>を使用して、依存関係のバージョン番号を1.2.8と指定します。
コード:
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.8</version> </dependency>
db.propertiesコードの紹介
db.properties は本記事の例となる接続プールの設定ファイルであり、接続プールの設定プロパティが含まれています。これらのプロパティには、データベースURL、ユーザー名、パスワード、接続プールのその他のオプションが含まれます。
本記事の db.properties ファイルのコードは、主に以下の部分で構成されています:
データベース接続パラメータの設定。
- データベースドライバーのクラス名を
com.mysql.jdbc.Driverと指定します。 - データベース接続のURLを指定します。これには、ホストIPアドレス、ポート番号、アクセスするスキーマが含まれます。
- データベースのユーザー名を指定します。
- データベースのパスワードを指定します。
コード:
driverClassName=com.mysql.jdbc.Driver url=jdbc:oceanbase://$host:$port/$database_name?useSSL=false username=$user_name password=$passwordパラメータの説明:
$host:接続文字列の-hパラメータから取得したOB Cloudデータベースの接続アドレスです。$port:接続文字列の-Pパラメータから取得したOB Cloudデータベースの接続ポートです。$database_name:接続文字列の-Dパラメータから取得した、アクセスするデータベースの名前です。$user_name:接続文字列の-uパラメータから取得したアカウント名です。$password:接続文字列の-pパラメータから取得したアカウントのパスワードです。
- データベースドライバーのクラス名を
その他の接続プールパラメータの設定。
- 接続検証用のSQLステートメントとして
select 1を指定します。 - 接続プールの初期接続数を3に設定します。これは、接続プール起動時に3つの初期接続が作成されることを意味します。
- 接続プールの最大アクティブ接続数を30に設定します。これは、接続プール内に同時に最大30個の接続が存在できることを意味します。
- 無効接続のログを出力するかどうかを
trueで指定します。これは、無効接続が回収される際にエラーログに情報が出力されることを意味します。テスト環境ではtrueに設定し、本番環境ではパフォーマンスへの影響を避けるためにfalseに設定できます。 - 接続プールの最小アイドル接続数を5に設定します。これは、接続プール内のアイドル接続数が5未満になると、接続プールが自動的に新しい接続を作成することを意味します。
- 接続取得時の最大待機時間を1000ミリ秒に設定します。これは、接続プール内のすべての接続が使用中で、待機時間が1000ミリ秒を超えると、接続取得操作でタイムアウト例外がスローされることを意味します。
- アイドル状態の接続の最小保持時間を300000ミリ秒(5分)に設定します。これは、接続が300000ミリ秒間アイドル状態のままで使用されない場合、回収されることを意味します。
- 無効接続を回収するかどうかを
trueで指定します。これは、接続がremoveAbandonedTimeoutで定義された時間を超えると回収されることを意味します。 - 無効接続のタイムアウト時間を300秒に設定します。これは、300秒(5分)以上使用されない接続が回収されることを意味します。
- アイドル接続回収スレッドの実行間隔を10000ミリ秒に設定します。これは、10000ミリ秒(10秒)ごとにアイドル接続回収スレッドがアイドル接続の回収操作を実行することを意味します。
- 接続取得時に接続の可用性を検証するかどうかを
falseで指定します。falseに設定するとパフォーマンスが向上しますが、取得した接続が使用不能になる可能性もあります。 - 接続返却時に接続の可用性を検証するかどうかを
falseで指定します。falseに設定するとパフォーマンスが向上しますが、返却される接続が使用不能になる可能性もあります。 - アイドル状態の接続を検証するかどうかを
trueで指定します。trueに設定すると、接続プールは定期的にvalidationQueryを実行して接続の可用性を検証します。 - 長時間接続のハイビジビ機能を有効にするかどうかを
falseで指定します。falseに設定すると長時間接続のハイビジビは有効になりません。 - 接続のアイドル時間しきい値を60000ミリ秒に設定します。これは、接続のアイドル時間が設定されたしきい値60000ミリ秒(1分)を超えると、接続ハイビジビメカニズムがその接続を検出して可用性を確保することを意味します。接続がしきい時間内に何らかの操作を行うと、接続のアイドル時間は再計算されます。
コード:
validationQuery=select 1 initialSize=3 maxActive=30 logAbandoned=true minIdle=5 maxWait=1000 minEvictableIdleTimeMillis=300000 removeAbandoned=true removeAbandonedTimeout=300 timeBetweenEvictionRunsMillis=10000 testOnBorrow=false testOnReturn=false testWhileIdle=true keepAlive=false keepAliveBetweenTimeMillis=60000- 接続検証用のSQLステートメントとして
注意
具体的なプロパティ(パラメータ)の設定は、プロジェクトの要件とデータベースの特性によって異なります。実際の状況に応じて調整および設定を行うことを推奨します。
Druid接続プールのよく使われる構成パラメータ:
パラメータ |
説明 |
|---|---|
| url | データベースのURLを指定します。データベースの種類、ホスト名、ポート番号、データベース名などの情報が含まれます。 |
| username | データベースへの接続に必要なユーザー名を指定します。 |
| password | データベースへの接続に必要なパスワードを指定します。 |
| driverClassName | データベースドライバーのクラス名を指定します。driverClassName を明示的に設定しない場合、Druid接続プールは url からデータベースの種類 (dbType) を自動的に認識し、対応する driverClassName を選択します。この自動認識メカニズムにより、設定作業が軽減され、設定プロセスが簡素化されます。ただし、url が正しく解析できない場合や、非標準のデータベースドライバークラスを使用する必要がある場合は、正しいドライバークラスがロードされるように、driverClassName パラメータを明示的に設定する必要があります。 |
| initialSize | 接続プールの初期化時に作成する接続数を指定します。アプリケーション起動時、接続プールは指定された数の接続を作成して接続プールに格納します。 |
| maxActive | 接続プール内の最大アクティブ接続数を指定します。接続プールのアクティブ接続数が最大値に達すると、その後の接続要求は、接続が解放されるまで待機します。 |
| maxIdle | 接続プール内の最大アイドル接続数を指定します (このプロパティは廃止されています)。接続プールのアイドル接続数が最大値に達すると、余分な接続は閉じられます。 |
| minIdle | 接続プール内の最小アイドル接続数を指定します。接続プールのアイドル接続数が最小値を下回ると、接続プールは新しい接続を作成します。 |
| maxWait | 接続取得の最大待機時間を指定します。この時間を超えると例外がスローされます。正の数値に設定した場合、それは待機するミリ秒数を表し、その時間を超えると例外がスローされます。 |
| poolPreparedStatements | PreparedStatement のキャッシュ (PSCache) メカニズムを有効にするかどうかを指定します。true に設定すると、PreparedStatement オブジェクトをキャッシュしてパフォーマンスを向上させますが、OBProxyのメモリ使用量が継続的に増加する可能性があるため注意が必要です。このようなシナリオでは、メモリリークやメモリオーバーフローを避けるために、メモリ使用状況を適切に設定および監視する必要があります。 |
| validationQuery | 接続検証のSQLクエリステートメントを指定します。接続が接続プールから取り出される際、このクエリステートメントが実行され、接続が有効かどうか検証されます。 |
| timeBetweenEvictionRunsMillis | 接続プールがアイドル接続を検出する間隔時間をミリ秒単位で指定します。接続のアイドル時間が timeBetweenEvictionRunsMillis の設定値を超えると、接続は閉じられます。 |
| minEvictableIdleTimeMillis | 接続プール内の接続の最小アイドル時間をミリ秒単位で指定します。この時間を超えると接続は回収されます。負の数値に設定した場合、接続は回収されません。 |
| testWhileIdle | アイドル状態のときに接続をテストするかどうかを指定します。true に設定すると、接続がアイドル状態のときに validationQuery を実行して、接続が有効かどうか検証されます。 |
| testOnBorrow | 接続を取得するときに接続をテストするかどうかを指定します。true に設定すると、接続を取得するときに validationQuery を実行して、接続が有効かどうか検証されます。 |
| testOnReturn | 接続を返却するときに接続をテストするかどうかを指定します。true に設定すると、接続を返却するときに validationQuery を実行して、接続が有効かどうか検証されます。 |
| filters | 接続プール内で事前定義された一連のフィルターを指定します。これらのフィルターは、特定の順序で接続に対する事前処理および後処理操作を行い、追加機能を提供し、接続プールのパフォーマンスを向上させることができます。一般的なフィルターには以下のものがあります:
filters プロパティに設定することで、接続プールは指定された順序でこれらのフィルターを順次適用します。複数のフィルター名はカンマで区切ることができます。例:filters=stat,wall,log4j。 |
Main.java コードの紹介
Main.java ファイルは、本記事のサンプルプログラムのメインプログラムです。このサンプルを通じて、データソース、接続オブジェクト、およびさまざまなデータベース操作メソッドを使用してデータベースとやり取りする方法を理解できます。
本記事の Main.java ファイルのコードは、主に以下の部分で構成されています:
必要なクラスとインターフェースをインポートします。
- 現在のコードが属するパッケージ名を
com.exampleと宣言します。 - 入出力例外を処理するために、Javaの
IOExceptionクラスをインポートします。 - ファイルやその他のソースから入力ストリームを取得するために、Javaの
InputStreamクラスをインポートします。 - データベースへの接続を表すために、Javaの
Connectionインターフェースをインポートします。 - データベースクエリ結果のデータセットを表すために、Javaの
ResultSetインターフェースをインポートします。 - SQL例外を処理するために、Javaの
SQLExceptionクラスをインポートします。 - SQLステートメントを実行するために、Javaの
Statementインターフェースをインポートします。 - プリコンパイルされたSQLステートメントを使用するために、Javaの
PreparedStatementインターフェースをインポートします。 - プロパティファイルを処理するために、Javaの
Propertiesクラスをインポートします。 - データベース接続を管理するために、Javaの
DataSourceインターフェースをインポートします。 - Druidデータソースを作成するために、Alibaba Druid接続プールの
DruidDataSourceFactoryクラスをインポートします。
コード:
package com.example; import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.sql.PreparedStatement; import java.util.Properties; import javax.sql.DataSource; import com.alibaba.druid.pool.DruidDataSourceFactory;- 現在のコードが属するパッケージ名を
Mainクラスを作成し、mainメソッドを定義します。Mainクラスとmainメソッドを定義します。mainメソッドは、接続プールを使用してデータベースから一連の操作を実行する方法を示すために使用されます。具体的な手順は以下のとおりです:プログラムのエントリポイントとして、
Mainという名前のpublicクラスを定義します。クラス名はファイル名と一致させる必要があります。プログラムのエントリポイントとして、コマンドライン引数を受け取るpublic staticメソッド
mainを定義します。例外処理メカニズムを使用して、発生する可能性のある例外をキャッチし、処理します。
loadPropertiesFileメソッドを呼び出して、プロパティファイルを読み込み、Propertiesオブジェクトを返します。プロパティファイルの設定に基づいてデータソースオブジェクトを作成するために、
createDataSource()メソッドを呼び出します。try-with-resourcesステートメントを使用して、データベース接続を取得し、接続の使用後に自動的に接続を閉じます。createTable()メソッドを呼び出して、テーブルを作成します。insertData()メソッドを呼び出して、データを挿入します。selectData()メソッドを呼び出して、データをクエリします。updateData()メソッドを呼び出して、データを更新します。- 再度
selectData()メソッドを呼び出して、更新後のデータをクエリします。 deleteData()メソッドを呼び出して、データを削除します。- 再度
selectData()メソッドを呼び出して、削除後のデータをクエリします。 dropTable()メソッドを呼び出して、テーブルを削除します。
コード:
public class Main { public static void main(String[] args) { try { Properties properties = loadPropertiesFile(); DataSource dataSource = createDataSource(properties); try (Connection conn = dataSource.getConnection()) { // Create table createTable(conn); // Insert data insertData(conn); // Query data selectData(conn); // Update data updateData(conn); // Query the updated data selectData(conn); // Delete data deleteData(conn); // Query the data after deletion selectData(conn); // Drop table dropTable(conn); } } catch (Exception e) { e.printStackTrace(); } } // プロパティファイルから設定情報を取得し、使用するためのメソッドを定義します。 // データソースオブジェクトを取得するためのメソッドを定義します。 // テーブルを作成するためのメソッドを定義します。 // データを挿入するためのメソッドを定義します。 // データを更新するためのメソッドを定義します。 // データを削除するためのメソッドを定義します。 // データをクエリするためのメソッドを定義します。 // テーブルを削除するためのメソッドを定義します。 }プロパティファイルから設定情報を取得し、使用するためのメソッドを定義します。
プライベート静的メソッド
loadPropertiesFile()を定義して、プロパティファイルを読み込み、Propertiesオブジェクトを返します。具体的な手順は以下のとおりです:- プライベート静的メソッド
loadPropertiesFile()を定義します。このメソッドはPropertiesオブジェクトを返し、IOException例外をスローする可能性があることを宣言します。 - プロパティファイル内のキー・バリュー・ペアを格納するために使用される
Propertiesオブジェクトを作成します。 try-with-resourcesステートメントを使用して、クラスローダーからプロパティファイルdb.propertiesの入力ストリームisを取得します。loadメソッドを使用して、入力ストリームのプロパティをpropertiesオブジェクトにロードします。- 読み込んだ
propertiesオブジェクトを返します。
コード:
private static Properties loadPropertiesFile() throws IOException { Properties properties = new Properties(); try (InputStream is = Main.class.getClassLoader().getResourceAsStream("db.properties")) { properties.load(is); } return properties; }- プライベート静的メソッド
データソースオブジェクトを取得するためのメソッドを定義します。
プライベート静的メソッド
createDataSource()を定義し、プロパティファイル内の設定に基づいてDataSourceオブジェクトを作成します。このDataSourceオブジェクトは、データベース接続の管理と取得に使用されます。具体的な手順は以下のとおりです:- プライベート静的メソッド
createDataSource()を定義します。このメソッドはPropertiesオブジェクトをパラメータとして受け取り、Exception例外をスローする可能性があることを宣言します。 DruidDataSourceFactoryクラスのcreateDataSource()メソッドを呼び出し、プロパティpropertiesを渡してDataSourceオブジェクトを返します。
コード:
private static DataSource createDataSource(Properties properties) throws Exception { return DruidDataSourceFactory.createDataSource(properties); }- プライベート静的メソッド
テーブルを作成するためのメソッドを定義します。
プライベート静的メソッド
createTable()を定義し、データベースにテーブルを作成します。具体的な手順は以下のとおりです:- プライベート静的メソッド
createTable()を定義します。このメソッドはConnectionオブジェクトをパラメータとして受け取り、SQLException例外をスローする可能性があることを宣言します。 try-with-resourcesステートメントを使用し、接続オブジェクトconnのcreateStatement()メソッドを通じて、Statementオブジェクトstmtを作成します。- 文字列変数
sqlを定義し、テーブル作成のSQLステートメントを格納します。 executeUpdate()メソッドを使用してSQLステートメントを実行し、データテーブルを作成します。- テーブル作成成功のメッセージを出力します。
コード:
private static void createTable(Connection conn) throws SQLException { try (Statement stmt = conn.createStatement()) { String sql = "CREATE TABLE test_druid (id INT, name VARCHAR(20))"; stmt.executeUpdate(sql); System.out.println("Table created successfully."); } }- プライベート静的メソッド
データを挿入するためのメソッドを定義します。
プライベート静的メソッド
insertData()を定義し、データベースにデータを挿入します。具体的な手順は以下のとおりです:プライベート静的メソッド
insertData()を定義します。このメソッドはConnectionオブジェクトをパラメータとして受け取り、SQLException例外をスローする可能性があることを宣言します。文字列変数
insertDataSqlを定義し、データ挿入のSQLステートメントを格納します。整数型変数
insertedRowsを定義し、初期値を0に設定します。これは挿入されたデータの行数を記録するために使用されます。try-with-resourcesステートメントを使用し、接続オブジェクトconnのprepareStatement()メソッドとデータ挿入のSQLステートメントを使用して、PreparedStatementオブジェクトinsertDataStmtを作成します。forループステートメントを使用して5回繰り返し、5件のデータを挿入します。setInt()メソッドを使用して、最初のパラメータの値をループ変数iに設定します。setString()メソッドを使用して、2番目のパラメータの値を文字列test_insertとループ変数iの値を結合したものに設定します。executeUpdate()メソッドを使用してデータ挿入のSQLステートメントを実行し、戻り値である操作行数をinsertedRows変数に累積します。
データ挿入成功のメッセージと、挿入された総行数を出力します。
挿入された総行数を返します。
コード:
private static int insertData(Connection conn) throws SQLException { String insertDataSql = "INSERT INTO test_druid (id, name) VALUES (?, ?)"; int insertedRows = 0; try (PreparedStatement insertDataStmt = conn.prepareStatement(insertDataSql)) { for (int i = 1; i < 6; i++) { insertDataStmt.setInt(1, i); insertDataStmt.setString(2, "test_insert" + i); insertedRows += insertDataStmt.executeUpdate(); } System.out.println("Data inserted successfully. Inserted rows: " + insertedRows); } return insertedRows; }データを更新するためのメソッドを定義します。
データベース内のデータを更新するために、プライベート静的メソッド
updateData()を定義します。具体的な手順は以下のとおりです:- プライベート静的メソッド
updateData()を定義します。このメソッドはConnectionオブジェクトをパラメータとして受け取り、SQLException例外をスローする可能性があることを宣言します。 try-with-resourcesステートメントを使用し、接続オブジェクトconnのprepareStatement()メソッドとデータを更新するSQL文を用いて、PreparedStatementオブジェクトpstmtを作成します。setString()メソッドを使用し、最初のパラメータの値を文字列test_updateに設定します。setInt()メソッドを使用し、2番目のパラメータの値を整数値3に設定します。executeUpdate()メソッドを使用してデータを更新するSQL文を実行し、戻り値である操作行数を変数updatedRowsに代入します。- データ更新が成功したことを示すメッセージと、更新された総行数を出力します。
コード:
private static void updateData(Connection conn) throws SQLException { try (PreparedStatement pstmt = conn.prepareStatement("UPDATE test_druid SET name = ? WHERE id = ?")) { pstmt.setString(1, "test_update"); pstmt.setInt(2, 3); int updatedRows = pstmt.executeUpdate(); System.out.println("Data updated successfully. Updated rows: " + updatedRows); } }- プライベート静的メソッド
データを削除するためのメソッドを定義します。
データベース内のデータを削除するためのプライベート静的メソッド
deleteData()を定義します。具体的な手順は以下のとおりです:- プライベート静的メソッド
deleteData()を定義します。このメソッドはConnectionオブジェクトをパラメータとして受け取り、SQLException例外をスローする可能性があることを宣言します。 try-with-resourcesステートメントを使用し、接続オブジェクトconnのprepareStatement()メソッドとデータを削除するSQL文を用いて、PreparedStatementオブジェクトpstmtを作成します。setInt()メソッドを使用し、最初のパラメータの値を整数値3に設定します。executeUpdate()メソッドを使用してデータを削除するSQL文を実行し、戻り値である操作行数を変数deletedRowsに代入します。- データの削除が成功したことを示すメッセージと、削除された総行数を出力します。
コード:
private static void deleteData(Connection conn) throws SQLException { try (PreparedStatement pstmt = conn.prepareStatement("DELETE FROM test_druid WHERE id < ?")) { pstmt.setInt(1, 3); int deletedRows = pstmt.executeUpdate(); System.out.println("Data deleted successfully. Deleted rows: " + deletedRows); } }- プライベート静的メソッド
データを検索するためのメソッドを定義します。
データベースからデータを検索するためのプライベート静的メソッド
selectData()を定義します。具体的な手順は以下のとおりです:プライベート静的メソッド
selectData()を定義します。このメソッドはConnectionオブジェクトをパラメータとして受け取り、SQLException例外をスローする可能性があることを宣言します。try-with-resourcesステートメントを使用し、接続オブジェクトconnのcreateStatement()メソッドを用いて、Statementオブジェクトstmtを作成します。文字列変数
sqlを定義し、検索するデータのSQL文を格納します。executeQuery()メソッドを使用してデータを検索するSQL文を実行し、戻り値である結果セットを変数resultSetに代入します。whileループステートメントを使用して、結果セットの各行データを走査します。getInt()メソッドを使用して、現在の行のidフィールドの整数値を取得し、id変数に代入します。getString()メソッドを使用して、現在の行のnameフィールドの文字列値を取得し、name変数に代入します。- 現在の行の
idとnameフィールドの値を出力します。
コード:
private static void selectData(Connection conn) throws SQLException { try (Statement stmt = conn.createStatement()) { String sql = "SELECT * FROM test_druid"; ResultSet resultSet = stmt.executeQuery(sql); while (resultSet.next()) { int id = resultSet.getInt("id"); String name = resultSet.getString("name"); System.out.println("id: " + id + ", name: " + name); } } }テーブルを削除するためのメソッドを定義します。
データベース内のテーブルを削除するためのプライベート静的メソッド `dropTable()` を定義します。具体的な手順は以下のとおりです:
1. プライベート静的メソッド `dropTable()` を定義します。このメソッドは `Connection` オブジェクトをパラメータとして受け取り、`SQLException` 例外をスローする可能性があることを宣言します。
2. `try-with-resources` ステートメントを使用し、接続オブジェクト `conn` の `createStatement()` メソッドを用いて、`Statement` オブジェクト `stmt` を作成します。
3. 文字列変数 `sql` を定義し、テーブルを削除するSQL文を格納します。
4. `executeUpdate()` メソッドを使用して、テーブル削除のSQLステートメントを実行します。
5. テーブルが正常に削除されたことを示すメッセージを出力します。
**コード:**
```java
private static void dropTable(Connection conn) throws SQLException {
try (Statement stmt = conn.createStatement()) {
String sql = "DROP TABLE test_druid";
stmt.executeUpdate(sql);
System.out.println("Table dropped successfully.");
}
}
```
全コード表示
<?xml version="1.0" encoding="UTF-8"?>
<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>
<groupId>com.example</groupId>
<artifactId>druid-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.40</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.8</version>
</dependency>
</dependencies>
</project>
# Database Configuration
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://$host:$port/$database_name?useSSL=false
username=$user_name
password=$password
# Connection Pool Configuration
#To check whether the database link is valid, MySQL must be configured to select 1; Oracle is select 1 from dual
validationQuery=select 1
#Initial number of connections
initialSize=3
#Maximum number of activations, that is, the maximum number of Connection pool
maxActive=30
#When closing the Abandoned connection, the error log is output. When the link is recycled, the console prints information. The test environment can add true, while the online environment is false. Will affect performance.
logAbandoned=true
#Minimum number of activations during idle time
minIdle=5
#The maximum waiting time for a connection, in milliseconds
maxWait=1000
#The maximum time to start the eviction thread is the survival time of a link (previous value: 25200000, the converted result of this time is: 2520000/1000/60/60=7 hours)
minEvictableIdleTimeMillis=300000
#Whether to recycle after exceeding the time limit
removeAbandoned=true
#Exceeding the time limit (in seconds), currently 5 minutes. If any business processing time exceeds 5 minutes, it can be adjusted appropriately.
removeAbandonedTimeout=300
# Run the idle connection collector Destroy thread every 10 seconds to detect the interval time between connections, based on the judgment of testWhileIdle
timeBetweenEvictionRunsMillis=10000
#When obtaining a link, not verifying its availability can affect performance.
testOnBorrow=false
#Check whether the link is available when returning the link to the Connection pool.
testOnReturn=false
#This configuration can be set to true, without affecting performance and ensuring security. The meaning is: Detect when applying for a connection. If the idle time is greater than timeBetweenEviceRunsMillis, execute validationQuery to check if the connection is valid.
testWhileIdle=true
#Default false, if configured as true, connection detection will be performed in the DestroyConnectionThread thread (timeBetweenEvaluation once)
keepAlive=false
#If keepAlive rule takes effect and the idle time of the connection exceeds it, the connection will only be detected
keepAliveBetweenTimeMillis=60000
package com.example;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.PreparedStatement;
import java.util.Properties;
import javax.sql.DataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
public class Main {
public static void main(String[] args) {
try {
Properties properties = loadPropertiesFile();
DataSource dataSource = createDataSource(properties);
try (Connection conn = dataSource.getConnection()) {
// Create table
createTable(conn);
// Insert data
insertData(conn);
// Query data
selectData(conn);
// Update data
updateData(conn);
// Query the updated data
selectData(conn);
// Delete data
deleteData(conn);
// Query the data after deletion
selectData(conn);
// Drop table
dropTable(conn);
}
} catch (Exception e) {
e.printStackTrace();
}
}
private static Properties loadPropertiesFile() throws IOException {
Properties properties = new Properties();
try (InputStream is = Main.class.getClassLoader().getResourceAsStream("db.properties")) {
properties.load(is);
}
return properties;
}
private static DataSource createDataSource(Properties properties) throws Exception {
return DruidDataSourceFactory.createDataSource(properties);
}
private static void createTable(Connection conn) throws SQLException {
try (Statement stmt = conn.createStatement()) {
String sql = "CREATE TABLE test_druid (id INT, name VARCHAR(20))";
stmt.executeUpdate(sql);
System.out.println("Table created successfully.");
}
}
private static int insertData(Connection conn) throws SQLException {
String insertDataSql = "INSERT INTO test_druid (id, name) VALUES (?, ?)";
int insertedRows = 0;
try (PreparedStatement insertDataStmt = conn.prepareStatement(insertDataSql)) {
for (int i = 1; i < 6; i++) {
insertDataStmt.setInt(1, i);
insertDataStmt.setString(2, "test_insert" + i);
insertedRows += insertDataStmt.executeUpdate();
}
System.out.println("Data inserted successfully. Inserted rows: " + insertedRows);
}
return insertedRows;
}
private static void updateData(Connection conn) throws SQLException {
try (PreparedStatement pstmt = conn.prepareStatement("UPDATE test_druid SET name = ? WHERE id = ?")) {
pstmt.setString(1, "test_update");
pstmt.setInt(2, 3);
int updatedRows = pstmt.executeUpdate();
System.out.println("Data updated successfully. Updated rows: " + updatedRows);
}
}
private static void deleteData(Connection conn) throws SQLException {
try (PreparedStatement pstmt = conn.prepareStatement("DELETE FROM test_druid WHERE id < ?")) {
pstmt.setInt(1, 3);
int deletedRows = pstmt.executeUpdate();
System.out.println("Data deleted successfully. Deleted rows: " + deletedRows);
}
}
private static void selectData(Connection conn) throws SQLException {
try (Statement stmt = conn.createStatement()) {
String sql = "SELECT * FROM test_druid";
ResultSet resultSet = stmt.executeQuery(sql);
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
System.out.println("id: " + id + ", name: " + name);
}
}
}
private static void dropTable(Connection conn) throws SQLException {
try (Statement stmt = conn.createStatement()) {
String sql = "DROP TABLE test_druid";
stmt.executeUpdate(sql);
System.out.println("Table dropped successfully.");
}
}
}
関連ドキュメント
MySQL Connector/Jの詳細については、MySQL Connector/Jの概要をご参照ください。
druid-mysql-client サンプルプロジェクトをダウンロード