本ドキュメントでは、Druid コネクションプール、MySQL Connector/J、および OceanBase データベースを使用してアプリケーションを構築し、テーブルの作成、データの挿入、データの更新、データの削除、データのクエリ、テーブルの削除などの基本的なデータベース操作を実装する方法について説明します。
druid-mysql-clientをクリックして サンプルプロジェクトをダウンロード
</a>
<!-- <a role='video' href='https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/video-center/video/video/06%20druid-mysql-client.mp4'>
Druid コネクションプールを使用して OceanBase データベースに接続するサンプルプログラム(MySQLモード) -->
前提条件
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:druid-mysql-client プロジェクトを Eclipse にインポートする
Eclipse を開き、メニューバーから File -> Open Projects from File System を選択します。
表示されたダイアログボックスで、Directory ボタンをクリックしてプロジェクトのディレクトリを選択し、Finish をクリックしてインポートを完了します。
説明
Eclipse を使用して Maven プロジェクトをインポートすると、Eclipse はプロジェクト内の
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 であることを宣言します。
コードは以下のとおりです。
```java
<?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に指定します。
コードは以下のとおりです。
```java
<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に指定します。
コードは以下のとおりです。
```java
<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 の構文と機能を正しく処理できるようになります。
<main id="notice" type='explain'>
<h4>説明</h4>
<p>Java 1.8 と Java 8 は、同じバージョンの異なる命名方法です。</p>
</main>
コードは以下のとおりです。
```java
<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に指定します。
コードは以下のとおりです。
```java
<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に指定します。
コードは以下のとおりです。
```java
<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、ポート番号、アクセスするスキーマを含む、データベース接続の URL を指定します。
データベースのユーザー名を指定します。
データベースのパスワードを指定します。
コードは以下のとおりです。
```java
driverClassName=com.mysql.jdbc.Driver
url=jdbc:oceanbase://$host:$port/$database_name?useSSL=false
username=$user_name
password=$password
```
パラメータの説明:
* `$host`:接続文字列の `-h` パラメータから取得した、OceanBase Cloud クラウドデータベースの接続アドレス。
* `$port`:接続文字列の `-P` パラメータから取得した、OceanBase Cloud クラウドデータベースの接続ポート。
* `$database_name`:接続文字列の `-D` パラメータから取得した、アクセスするデータベース名。
* `$user_name`:接続文字列の `-u` パラメータから取得した、アカウント名。
* `$password`:接続文字列の `-p` パラメータから取得した、アカウントのパスワード。
その他のコネクションプールのパラメータを設定します。
接続を検証する 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 秒)ごとに、アイドル接続再利用スレッドがアイドル接続の再利用操作を 1 回実行することを示します。
接続取得時に接続の可用性を検証するかどうかを
falseに指定します。falseに設定するとパフォーマンスは向上しますが、取得した接続が使用できない可能性があります。接続返却時に接続の可用性を検証するかどうかを
falseに指定します。falseに設定するとパフォーマンスは向上しますが、返却された接続が使用できない可能性があります。アイドル時に接続を検証するかどうかを
trueに指定します。trueに設定すると、コネクションプールは定期的にvalidationQueryを実行して接続の可用性を検証します。長い接続のキープアライブ機能を有効にするかどうかを
falseに指定します。falseに設定すると、長い接続のキープアライブは有効になりません。接続のアイドル時間しきい値を 60000(単位:ミリ秒)に指定します。これは、接続のアイドル時間が設定されたしきい値の 60000 ミリ秒(つまり 1 分)を超えた場合、接続キープアライブメカニズムがその接続を検出し、接続の可用性を確保することを示します。しきい値時間内に接続で何らかの操作があった場合、接続のアイドル時間は再計算されます。
コードは以下のとおりです。
```java
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
```
注意
具体的なプロパティ(パラメータ)の設定は、プロジェクトの要件とデータベースの特性によって異なります。実際の状況に応じて調整および設定することをお勧めします。
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クラスをインポートします。
コードは以下のとおりです。
```java
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文を使用してデータベース接続を取得し、接続の使用が完了した後に自動的に接続を閉じます。1. `createTable()` メソッドを呼び出して、テーブルを作成します。insertData()メソッドを呼び出して、データを挿入します。selectData()メソッドを呼び出して、データをクエリします。updateData()メソッドを呼び出して、データを更新します。再度
selectData()メソッドを呼び出して、更新されたデータをクエリします。deleteData()メソッドを呼び出して、データを削除します。再度
selectData()メソッドを呼び出して、削除後のデータをクエリします。dropTable()メソッドを呼び出して、テーブルを削除します。
コードは以下のとおりです。
```java
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();
}
}
// プロパティファイル内の設定情報を取得して使用するためのメソッドを定義します // データソースオブジェクトを取得するためのメソッドを定義します // テーブルを作成するためのメソッドを定義します // データを挿入するためのメソッドを定義します // データを更新するためのメソッドを定義します // データを削除するためのメソッドを定義します // データをクエリするためのメソッドを定義します // テーブルを削除するためのメソッドを定義します } ```
- プロパティファイル内の設定情報を取得して使用するためのメソッドを定義します。
プロパティファイルをロードし、Properties オブジェクトを返すためのプライベート静的メソッド loadPropertiesFile() を定義します。具体的な手順は以下のとおりです。
Propertiesオブジェクトを返し、IOException例外をスローする可能性があることを宣言するプライベート静的メソッドloadPropertiesFile()を定義します。- プロパティファイル内のキーと値のペアを格納するための
Propertiesオブジェクトを作成します。 try-with-resources文を使用して、クラスローダー経由でプロパティファイルdb.propertiesの入力ストリームisを取得します。loadメソッドを使用して、入力ストリーム内のプロパティをpropertiesオブジェクトにロードします。- ロードされた
propertiesオブジェクトを返します。
コードは以下のとおりです。
```java
private static Properties loadPropertiesFile() throws IOException {
Properties properties = new Properties();
try (InputStream is = Main.class.getClassLoader().getResourceAsStream("db.properties")) {
properties.load(is);
}
return properties;
}
```
- データソースオブジェクトを取得するためのメソッドを定義します。
プロパティファイルの設定に基づいて、データベース接続を管理および取得するための DataSource オブジェクトを作成するプライベート静的メソッド createDataSource() を定義します。具体的な手順は以下のとおりです。
Propertiesオブジェクトをパラメータとして受け取り、Exception例外をスローする可能性があることを宣言するプライベート静的メソッドcreateDataSource()を定義します。DruidDataSourceFactoryクラスのcreateDataSource()メソッドを呼び出し、プロパティpropertiesを渡して、DataSourceオブジェクトを返します。
コードは以下のとおりです。
```java
private static DataSource createDataSource(Properties properties) throws Exception {
return DruidDataSourceFactory.createDataSource(properties);
}
```
- テーブルを作成するためのメソッドを定義します。
データベース内にデータテーブルを作成するためのプライベート静的メソッド createTable() を定義します。具体的な手順は以下のとおりです。
Connectionオブジェクトをパラメータとして受け取り、SQLException例外をスローする可能性があることを宣言するプライベート静的メソッドcreateTable()を定義します。try-with-resources文を使用して、接続オブジェクトconnのcreateStatement()メソッド経由でStatementオブジェクトstmtを作成します。- テーブルを作成する SQL 文を格納する文字列変数
sqlを定義します。 executeUpdate()メソッドを使用して SQL 文を実行し、データテーブルを作成します。- テーブルの作成が成功したことを示すメッセージを出力します。
コードは以下のとおりです。
```java
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() を定義します。具体的な手順は以下のとおりです。
Connectionオブジェクトをパラメータとして受け取り、SQLException例外をスローする可能性があることを宣言するプライベート静的メソッドinsertData()を定義します。データを挿入する SQL 文を格納する文字列変数
insertDataSqlを定義します。挿入されたデータの行数を記録するための整数変数
insertedRowsを定義し、初期値を 0 に設定します。try-with-resources文を使用して、接続オブジェクトconnのprepareStatement()メソッドとデータ挿入用の SQL 文経由でPreparedStatementオブジェクトinsertDataStmtを作成します。forループ文を使用して 5 回反復し、5 件のデータを挿入することを示します。setInt()メソッドを使用して、最初のパラメータの値をループ変数iに設定します。setString()メソッドを使用して、2 番目のパラメータの値を文字列test_insertにループ変数iの値を加えたものに設定します。executeUpdate()メソッドを使用してデータ挿入用の SQL 文を実行し、返された操作行数をinsertedRows変数に累積します。データの挿入が成功したことを示すメッセージと、挿入された合計行数を出力します。
挿入された合計行数を返します。
コードは以下のとおりです。
```java
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() を定義します。具体的な手順は以下のとおりです。
Connectionオブジェクトをパラメータとして受け取り、SQLException例外をスローする可能性があることを宣言するプライベート静的メソッドupdateData()を定義します。try-with-resources文を使用して、接続オブジェクトconnのprepareStatement()メソッドとデータ更新用の SQL 文経由でPreparedStatementオブジェクトpstmtを作成します。setString()メソッドを使用して、最初のパラメータの値を文字列test_updateに設定します。setInt()メソッドを使用して、2 番目のパラメータの値を整数値 3 に設定します。executeUpdate()メソッドを使用してデータ更新用の SQL 文を実行し、返された操作行数をupdatedRows変数に代入します。- データの更新が成功したことを示すメッセージと、更新された合計行数を出力します。
コードは以下のとおりです。
```java
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() を定義します。具体的な手順は以下のとおりです。
Connectionオブジェクトをパラメータとして受け取り、SQLException例外をスローする可能性があることを宣言するプライベート静的メソッドdeleteData()を定義します。try-with-resources文を使用して、接続オブジェクトconnのprepareStatement()メソッドとデータ削除用の SQL 文経由でPreparedStatementオブジェクトpstmtを作成します。setInt()メソッドを使用して、最初のパラメータの値を整数値 3 に設定します。executeUpdate()メソッドを使用してデータ削除用の SQL 文を実行し、返された操作行数をdeletedRows変数に代入します。- データの削除が成功したことを示すメッセージと、削除された合計行数を出力します。
コードは以下のとおりです。
```java
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() を定義します。具体的な手順は以下のとおりです。
Connectionオブジェクトをパラメータとして受け取り、SQLException例外をスローする可能性があることを宣言するプライベート静的メソッドselectData()を定義します。try-with-resources文を使用して、接続オブジェクトconnのcreateStatement()メソッド経由でStatementオブジェクトstmtを作成します。データをクエリする SQL 文を格納する文字列変数
sqlを定義します。executeQuery()メソッドを使用してデータクエリ用の SQL 文を実行し、返された結果セットをresultSet変数に代入します。whileループ文を使用して、結果セット内の各行のデータを反復処理します。getInt()メソッドを使用して、現在の行のidフィールドの整数値を取得し、id変数に代入します。getString()メソッドを使用して、現在の行のnameフィールドの文字列値を取得し、name変数に代入します。現在の行の
idおよびnameフィールドの値を出力します。
コードは以下のとおりです。
```java
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() を定義します。具体的な手順は以下のとおりです。
Connectionオブジェクトをパラメータとして受け取り、SQLException例外をスローする可能性があることを宣言するプライベート静的メソッドdropTable()を定義します。try-with-resources文を使用して、接続オブジェクトconnのcreateStatement()メソッド経由でStatementオブジェクトstmtを作成します。- テーブルを削除する SQL 文を格納する文字列変数
sqlを定義します。 executeUpdate()メソッドを使用してテーブル削除用の SQL 文を実行します。- テーブルの削除が成功したことを示すメッセージを出力します。
コードは以下のとおりです。
```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.");
}
}
```
完全なコードの表示
```java
<?xml version="1.0" encoding="UTF-8"?>
<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>
# 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
```java
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の概要 をご参照ください。