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

ステップ2:OceanBaseデータベースのURLを取得する
OceanBaseデータベースのデプロイ担当者または管理者から、該当するデータベース接続文字列を取得します。
例:
obclient -hxxx.xxx.xxx.xxx -P2881 -utest_user001@mysql001 -p****** -Dtest詳細な接続文字列については、OBClientを使用したOceanBaseテナントへの接続を参照してください。
OceanBaseデータベースの接続文字列に基づいて、以下のURLの対応する情報を入力します。
jdbc:mysql://$host:$port/$database_name?user=$user_name&password=$password&useSSL=falseパラメータの説明:
$host:OceanBaseデータベースへの接続IPアドレス。OceanBaseデータベースプロキシ(OceanBase Database Proxy、ODP)接続方式ではODPアドレスを使用し、直接接続方式ではOBServerノードのIPアドレスを使用します。$port:OceanBaseデータベースへの接続ポート。ODP接続方式のデフォルトポートは2883で、ODPデプロイ時にカスタマイズ可能です。直接接続方式のデフォルトポートは2881で、OceanBaseデータベースのデプロイ時にカスタマイズ可能です。$database_name:アクセス対象のデータベース名。注意
テナントに接続するユーザーは、そのデータベースに対する
CREATE、DROP、INSERT、DELETE、UPDATEおよびSELECT権限を持っている必要があります。ユーザー権限の詳細については、MySQLモードの権限分類を参照してください。user_name:テナントの接続アカウント。ODP接続の一般的な形式:ユーザー名@テナント名#クラスタ名またはクラスタ名:テナント名:ユーザー名。直接接続方式の形式:ユーザー名@テナント名。password:アカウントのパスワード。
MySQL Connector/J接続プロパティの詳細については、Configuration Propertiesを参照してください。
例:
jdbc:mysql://xxx.xxx.xxx.xxx:2881/test?user=test_user001@mysql001&password=******&useSSL=false
ステップ3:druid-mysql-clientプロジェクトのデータベース接続情報を修正する
ステップ2:OceanBaseデータベースのURLを取得するで取得した情報に基づいて、druid-mysql-client/src/main/resources/db.properties ファイル内のデータベース接続情報を修正します。

例:
- OBServerノードのIPアドレスは
xxx.xxx.xxx.xxxです。 - アクセスポートは2881を使用します。
- アクセスするデータベース名は
testです。 - テナントの接続アカウントは
test_user001@mysql001です。mysql001はOceanBaseデータベース内で作成されたMySQLモードのユーザーテナントであり、test_user001はテナントmysql001のユーザー名です。 - パスワードは
******です。
コード:
...
url=jdbc:mysql://xxx.xxx.xxx.xxx:2881/test?useSSL=false
username=test_user001@mysql001
password=******
...
ステップ4: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と指定します。 - ホストIPアドレス、ポート番号、アクセスするSchemaを含むデータベース接続のURLを指定します。
- データベースのユーザー名を指定します。
- データベースのパスワードを指定します。
コード:
driverClassName=com.mysql.jdbc.Driver url=jdbc:oceanbase://$host:$port/$database_name?useSSL=false username=$user_name password=$passwordパラメータの説明:
$host:OceanBaseデータベースへの接続IPアドレス。ODP接続方式ではODPアドレスを使用し、直接接続方式ではOBServerノードのIPアドレスを使用します。$port:OceanBaseデータベースへの接続ポート。ODP接続方式のデフォルトポートは2883で、ODPデプロイ時にカスタマイズ可能です。直接接続方式のデフォルトポートは2881で、OceanBaseデータベースのデプロイ時にカスタマイズ可能です。$database_name:アクセス対象のデータベース名です。$user_name:テナントの接続アカウント。ODP接続の一般的な形式:ユーザー名@テナント名#クラスタ名またはクラスタ名:テナント名:ユーザー名。直接接続方式の形式:ユーザー名@テナント名。$password:アカウントのパスワード。
- データベースドライバーのクラス名を
他の接続プールのパラメータを設定します。
- 接続検証用のSQLステートメント
select 1を指定します。 - 接続プールの初期接続数を3に指定します。これは、接続プール起動時に3つの初期接続が作成されることを意味します。
- 接続プールの最大アクティブ接続数を30に指定します。これは、接続プール内で同時に最大30個の接続が存在できることを意味します。
- 廃棄された接続のログを出力するかどうかを
trueに指定します。これは、廃棄された接続を回収する際にエラーログに出力されるようにすることを意味します。テスト環境ではtrueに設定し、本番環境ではfalseに設定することで、パフォーマンスへの影響を回避できます。 - 接続プールの最小アイドル接続数を5に指定します。これは、接続プール内のアイドル接続数が5未満の場合、接続プールが自動的に新しい接続を作成することを意味します。
- 接続取得時の最大待機時間を1000に指定します。単位はミリ秒です。これは、接続プール内のすべての接続が占用されており、待機時間が1000ミリ秒を超えた場合、接続取得操作でタイムアウト例外が発生することを意味します。
- 接続がアイドル状態にあるときの最小保持時間を300000に指定します。単位はミリ秒です。これは、接続が300000ミリ秒(5分)アイドル状態で使用されない場合、回収されることを意味します。
- 廃棄された接続の回収を有効にするかどうかを
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インターフェースをインポートし、データベースクエリ結果のデータセットを表すために使用します。 - Java の
SQLExceptionクラスをインポートし、SQL例外を処理するために使用します。 - Java の
Statementインターフェースをインポートし、SQLステートメントを実行するために使用します。 - Java の
PreparedStatementインターフェースをインポートし、プリコンパイルされたSQLステートメントを使用するために使用します。 - Java の
Propertiesクラスをインポートし、プロパティファイルを処理するために使用します。 - Java の
DataSourceインターフェースをインポートし、データベース接続を管理するために使用します。 - Alibaba Druid接続プールの
DruidDataSourceFactoryクラスをインポートし、Druidデータソースを作成するために使用します。
コード:
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という名前のパブリッククラスを定義します。クラス名はファイル名と一致させる必要があります。プログラムのエントリポイントとして、パブリック静的メソッド
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()) { // Table creation createTable(conn); // Data insertion insertData(conn); // Data query selectData(conn); // Data update updateData(conn); // Query of updated data selectData(conn); // Data deletion deleteData(conn); // Query of data after deletion selectData(conn); // Table deletion 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オブジェクトを作成します。データベース接続を管理および取得するために使用されます。具体的な手順は以下のとおりです:- プライベートな静的メソッド
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()を定義し、データベース内のテーブルを削除します。具体的な手順は以下のとおりです:- プライベートな静的メソッド
dropTable()を定義し、Connectionオブジェクトをパラメータとして受け取り、SQLException例外をスローする可能性があることを宣言します。 try-with-resourcesステートメントを使用して、接続オブジェクトconnのcreateStatement()メソッドを使用して、Statementオブジェクトstmtを作成します。- 文字列変数
sqlを定義し、テーブル削除のSQLステートメントを格納します。 executeUpdate()メソッドを使用して、テーブル削除のSQLステートメントを実行します。- テーブル削除が成功したことを示すメッセージを出力します。
コード:
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>
db.properties
# 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サンプルプロジェクトをダウンロード
Druid接続プールによるOceanBaseデータベースへの接続サンプルプログラム(MySQLモード)