本記事では、JfinalフレームワークとOceanBaseデータベースを使用して、テーブルの作成、データの挿入、クエリなどの基本的な操作を実現するアプリケーションの構築方法を紹介します。
前提条件
- OceanBaseデータベースがインストール済みであること。
- JDK 1.8とMavenがインストール済みであること。
- IntelliJ IDEAがインストール済みであること。
説明
本ドキュメントでコードを実行するために使用したツールはIntelliJ IDEA 2021.3.2 (Community Edition)です。個人の好みに応じて、適切なツールを選択してサンプルコードを実行することもできます。
手順
説明
本記事で示す操作手順は、Windows環境に基づいています。他のOS環境やコンパイラを使用している場合は、手順が若干異なる可能性があります。
- OceanBaseデータベースの接続文字列を取得します。
java-oceanbase-JfinalプロジェクトをIDEAにインポートします。java-oceanbase-JfinalプロジェクトのTomcat実行環境を構築します。java-oceanbase-Jfinalプロジェクト内のデータベース接続情報を変更します。java-oceanbase-Jfinalプロジェクトを実行します。
ステップ1:OceanBaseデータベースの接続文字列を取得する
OceanBaseデータベースのデプロイ担当者または管理者から、該当するデータベース接続文字列を取得します。
obclient -hxx.xx.xx.xx -P2883 -uroot@sys#cluster -p**** -Aデプロイ済みのOceanBaseデータベースに基づいて、以下のURLに対応する情報を入力します。
説明
config.propertiesファイルには、ここでのURL情報が必要です。jdbc:oceanbase://host:port/schema_name?user=$user_name&password=$passwordパラメータ説明:
host:OceanBaseデータベースへの接続IPアドレス。ODP接続方式ではODPアドレスを使用し、直接接続方式ではOBServerノードのIPアドレスを使用します。port:OceanBaseデータベースへの接続ポート。ODP接続方式のデフォルトポートは2883で、ODPデプロイ時にカスタマイズ可能です。直接接続方式のデフォルトポートは2881で、OceanBaseデータベースのデプロイ時にカスタマイズ可能です。schema_name:アクセスするスキーマ名です。user_name:テナントの接続アカウント。ODP接続方式では、ユーザー名@テナント名#クラスタ名またはクラスタ名:テナント名:ユーザー名の2種類の一般的な形式があります。直接接続方式の形式はユーザー名@テナント名です。password:アカウントのパスワードです。
その他のURLパラメータの詳細については、データベースURLを参照してください。
ステップ2:java-oceanbase-JfinalプロジェクトをIDEAにインポートする
IntelliJ IDEAを開き、**File > Open...**オプションを選択します。

表示されたOpen File or Projectウィンドウで、対応するプロジェクトファイルを選択し、OKをクリックしてプロジェクトファイルのインポートを完了します。
IntelliJ IDEAは、プロジェクト内のさまざまなファイルの種類を自動的に認識し、Projectツールウィンドウで、プロジェクトのディレクトリ構造、ファイルリスト、モジュールリスト、依存関係などの情報を確認できます。Projectツールウィンドウは通常、IntelliJ IDEA画面の左側にあり、デフォルトでは開いています。Projectツールウィンドウが閉じている場合は、メニューバーのView > Tool Windows > Projectをクリックするか、ショートカットキーAlt + 1を使用して再表示できます。
説明
IntelliJ IDEAでプロジェクトをインポートすると、IntelliJ IDEAはプロジェクト内のpom.xmlファイルを自動的に検出し、ファイルに記述されている依存関係に基づいて必要な依存ライブラリを自動的にダウンロードし、プロジェクトに追加します。
プロジェクトの状況を確認します。

ステップ3:java-oceanbase-Jfinal プロジェクトのTomcat実行環境を構築する
Tomcat 8.5.95をダウンロードします。 Apache Tomcat公式サイトからTomcat 8.5.95の圧縮ファイルをダウンロードします。ダウンロードしたファイルを、Tomcatをインストールしたいディレクトリに解凍します。
IDEAでTomcatを設定します。 IntelliJ IDEAを開き、FileメニューからSettings > Pluginsを選択します。Settingsウィンドウ中央の検索ボックスでSmart Tomcatと検索し、ダウンロード後にApplyを選択します。すると、Settingsウィンドウ左下にTomcat Serverタブが表示されます。Tomcat Serverタブに移動し、右側の**+ボタンをクリックして解凍したTomcatディレクトリを選択し、ApplyをクリックしてからOK**をクリックすると設定が完了します。

Tomcatの実行設定を作成します。
IDEAの上部ツールバーで、Run > Edit Configurationsを選択します。Run/Debug Configurationsウィンドウで、+ボタンをクリックしてTomcat Serverを選択し、実行サーバー名Nameを入力します。Configuration選択ボックスで、インストールしたバージョンのTomcat severを選択し、Context pathの値を
/に変更します。SSL portの値に8080を入力します。Before launch選択ボックスで、+をクリックしてLaunch Web Browserを選択します。EditをクリックしてURLにhttp://localhost:8080/hello/getDataを入力します。ApplyをクリックしてからOKをクリックすると設定が完了します。
Tomcatサーバーを起動します。
IDEAの上部ツールバーで、先ほど作成したTomcatの実行設定を選択します。実行ボタン(緑色の三角形)をクリックしてTomcatサーバーを起動します。IDEAのRunウィンドウでTomcatサーバーの起動ログを確認できます。
ステップ4:java-oceanbase-Jfinal プロジェクトのデータベース接続情報を修正する
ステップ1:OceanBaseデータベースの接続文字列を取得する の情報に基づいて、config.properties ファイル内のデータベース接続情報を修正します。
例:
- データベースドライバーの名前:
com.oceanbase.jdbc.Driver - OBServerノードのIPアドレスは
10.10.10.1です。 - アクセスポートは2881を使用します。
- アクセスするスキーマ名は
sysです。 - テナントの接続アカウントは
sys@xyoracleです。xyoracleはOceanBaseデータベースで作成されたOracleモードのユーザーテナントであり、sysはテナントxyoracleのユーザー名です。 - パスワードは
******です。
サンプルコードは以下のとおりです:
db.app.driver=com.oceanbase.jdbc.Driver
db.app.url=jdbc:oceanbase://10.10.10.1:2881/sys
db.app.user=sys@xyoracle
db.app.password=******
db.app.poolInitialSize=3
db.app.poolMaxSize=10
db.app.connectionTimeoutMillis=100
db.app.validationQuery=select 1 from dual
ステップ5:java-oceanbase-Jfinal プロジェクトを実行する
実行パス。
IDEAの上部ツールバーで、先ほど作成したTomcatの実行構成を選択します。緑色の三角形 の実行ボタンをクリックしてTomcatサーバーを起動します。Google ChromeまたはIEブラウザでパス
http://localhost:8080/hello/getDataを開き、実行結果を確認します。実行結果。
[{"ID":1,"NAME":"John"},{"ID":2,"NAME":"Jane"}]
プロジェクトコードについて
java-oceanbase-Jfinal をクリックしてプロジェクトコードをダウンロードします。これは java-oceanbase-Jfinal という名前の圧縮ファイルです。
解凍すると、java-oceanbase-Jfinal という名前のフォルダが作成されます。ディレクトリ構造は以下のとおりです:
│--pom.xml
│
├─.idea
│
├─src
│ ├─main
│ │ ├─java
│ │ │ └─com
│ │ │ └─oceanbase
│ │ │ └─testjfinal
│ │ │ ├─config
│ │ │ │ └─UserConfig.java
│ │ │ │
│ │ │ ├─controller
│ │ │ │ └─UserController.java
│ │ │ │
│ │ │ └─pojo
│ │ │ └─User.java
│ │ │
│ │ ├─resources
│ │ │ └─config.properties
│ │ │
│ │ └─webapp
│ │ └─WEB-INF
│ │ └─web.xml
│ │
│ │
│ │
│ └─test
│ └─java
│
│
└─target
ファイルの説明:
pom.xml:Mavenプロジェクトの設定ファイルで、プロジェクトの依存関係、プラグイン、ビルドなどの情報が含まれます。.idea:IDE(統合開発環境)で使用されるディレクトリで、プロジェクト関連の設定情報を格納します。src:プロジェクトのソースコードを格納するディレクトリです。main: 主要なソースコードとリソースファイルを格納するディレクトリ。java: Javaソースコードを格納するディレクトリ。com: Javaパッケージのルートディレクトリ。oceanbase: プロジェクトのルートディレクトリ。testjfinal:JFinalフレームワーク関連のコードを格納します。config:設定ファイルディレクトリで、アプリケーションの設定クラスファイルが含まれます。UserConfig.java:ユーザー設定クラスファイル。controller:コントローラーディレクトリで、アプリケーションのコントローラークラスファイルが含まれます。UserController.java:ユーザーコントローラークラスファイル。pojo: JavaBeanまたはエンティティクラスを格納します。User.java:ユーザーエンティティクラスを格納します。resources: リソースファイルを格納するディレクトリで、設定ファイルやSQLファイルなどが含まれます。config.properties: データベース接続情報を格納する設定ファイル。webapp:Webアプリケーションディレクトリで、Webアプリケーションの静的リソースと設定ファイルが含まれます。WEB-INF:WebアプリケーションのWEB-INFディレクトリで、設定ファイルやその他の保護されたリソースファイルを格納するために使用されます。web.xml:Webアプリケーションのデプロイメント記述子ファイル。test: テストコードとリソースファイルを格納するディレクトリ。target: コンパイル済みのClassファイルやJarパッケージなどのファイルを格納するディレクトリ。
pom.xmlコードの紹介
説明
例を確認するだけであれば、デフォルトのコードを使用し、変更は不要です。以下の説明に従って、ご自身の要件に応じて pom.xml ファイルを変更することもできます。
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.oceanbaseと指定します。<artifactId>を使用して、プロジェクトの依存関係をjava-oceanbase-jfinalと指定します。<version>を使用して、プロジェクトのバージョン番号を1.0-SNAPSHOTと指定します。<packaging>を使用して、プロジェクトのパッケージング方式をWARファイル(Webアプリケーションアーカイブファイル)と指定します。
コード:
<groupId>com.oceanbase</groupId>
<artifactId>java-oceanbase-jfinal</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- Packaging method (default to jar) -->
<packaging>war</packaging>
- Mavenバージョンの設定。
<maven.compiler.source> と <maven.compiler.target> を使用して、コンパイラのソースコードバージョンとターゲットコードバージョンをどちらもJava 8と指定します。
コード:
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
コア依存関係の設定。
依存関係の所属組織を com.jfinal、名前を jfinal、バージョン番号を 5.0.6 と指定します。この依存関係により、JFinalフレームワークの機能を利用できます。
コード:
<dependency> <groupId>com.jfinal</groupId> <artifactId>jfinal</artifactId> <version>5.0.6</version> </dependency>依存関係の所属組織を
com.alibaba、名前をdruid、バージョン番号を1.2.8と指定します。この依存関係により、Druidライブラリを利用できます。Druidライブラリは、データベース接続の取得と解放の管理・最適化に使用されます。
**コード:**
```xml
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.8</version>
</dependency>
```
- 依存関係の所属組織を
com.oceanbase、名前をoceanbase-client、バージョン番号を2.4.3と指定します。この依存関係により、OceanBaseが提供するクライアント機能(接続、クエリ、トランザクションなど)を利用できます。
**コード:**
```xml
<dependencies>
<dependency>
<groupId>com.oceanbase</groupId>
<artifactId>oceanbase-client</artifactId>
<version>2.4.3</version>
</dependency>
</dependencies>
```
config.propertiesファイルの紹介
config.properties ファイルは、OceanBaseデータベースへの接続情報を設定します。データベースドライバーのクラス名、接続URL、ユーザー名、パスワード、および接続プールに関する設定が含まれます。これらのパラメータは、アプリケーションでデータベース接続を取得し、管理してデータベース操作を実行するために使用されます。
db.app.driverを使用して、データベースドライバーをcom.oceanbase.jdbc.Driverと指定し、OceanBaseデータベースとの接続を確立します。db.app.urlを使用して、データベース接続用のURLを指定します。db.app.userを使用して、データベース接続用のユーザー名を指定します。db.app.passwordを使用して、データベース接続用のパスワードを指定します。db.app.poolInitialSizeを使用して、データベース接続プールの初期サイズを3に設定します。これは、初期状態で3つのデータベース接続が作成されることを意味します。db.app.poolMaxSizeを使用して、データベース接続プールの最大サイズを10に設定します。これは、接続プール内で最大10個のデータベース接続を作成できることを意味します。db.app.connectionTimeoutMillisを使用して、データベース接続のタイムアウト時間を100 msに設定します。これは、データベース接続を取得する際、100msを超えても接続が取得できない場合、タイムアウト例外がスローされることを意味します。db.app.validationQueryを使用して、データベース接続の有効性を検証するために使用するSQLクエリステートメントをselect 1 from dualと指定します。これは、接続プールから接続を取得する際、このクエリステートメントを実行して接続の有効性を検証することを意味します。コード:
db.app.driver=com.oceanbase.jdbc.Driver db.app.url=jdbc:oceanbase://host:port/schema_name db.app.user=user_name db.app.password=****** db.app.poolInitialSize=3 db.app.poolMaxSize=10 db.app.connectionTimeoutMillis=100 db.app.validationQuery=select 1 from dual
web.xmlコードの紹介
web.xml ファイルは、Webアプリケーションのフィルターを設定するために使用されます。
web.xml 設定ファイルの内容は以下のとおりです:
ファイル宣言ステートメント。
このファイルがXMLファイルであり、使用しているXMLバージョンが
1.0、文字エンコーディング方式がUTF-8であることを宣言します。コード:
<?xml version="1.0" encoding="UTF-8"?>XMLの名前空間とXMLモデルバージョンの設定。
xmlns:xsiを使用して、XML名前空間をhttp://www.w3.org/2001/XMLSchema-instanceと指定します。xmlnsを使用して、XMLの名前空間をhttp://java.sun.com/xml/ns/javaeeと指定します。xsi:schemaLocationを使用して、XMLの名前空間をhttp://java.sun.com/xml/ns/javaee、XMLのXSDファイルの場所をhttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsdと指定します。<id>および<version>要素を使用して、WebアプリケーションのIDをWebApp_ID、バージョン番号を3.0と指定します。
コード:
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID"
version="3.0">
JFinalフィルターの設定。
WebアプリケーションでJFinalフレームワークを使用するために、
jfinalという名前のフィルターを設定します。フィルターのクラスをcom.jfinal.core.JFinalFilterと指定します。初期化パラメータconfigClassを指定することで、JFinalフレームワークの設定クラスの場所をcom.oceanbase.testjfinal.config.UserConfigと指定します。このフィルターは、WebアプリケーションでJFinalフレームワークを使用し、指定された設定クラスに基づいてJFinalフレームワークの動作を設定するために使用されます。
コード:
<filter>
<filter-name>jfinal</filter-name>
<filter-class>com.jfinal.core.JFinalFilter</filter-class>
<init-param>
<param-name>configClass</param-name>
<!-- your jfinal configuration location -->
<param-value>com.oceanbase.testjfinal.config.UserConfig</param-value>
</init-param>
</filter>
JFinalフィルターマッピングの設定。
jfinalフィルターをすべてのリクエストパスに適用します。つまり、このフィルターはアプリケーション内のすべてのリクエストに適用されます。
コード:
<filter-mapping>
<filter-name>jfinal</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
UserConfig.javaファイルの紹介
UserConfig.java ファイルは、アプリケーションのルーティング、プラグイン、データベース接続などの関連情報を設定するために使用されます。
UserConfig.java ファイルのコードは、主に以下の部分で構成されています:
他のクラスとインターフェースのインポート。
このファイルには以下のインターフェースとクラスが含まれていることを宣言します:
StatFilterクラス:データベースアクセスのパフォーマンス統計に使用されます。JdbcConstantsクラス:データベースタイプの定数を定義するために使用されます。WallFilterクラス:SQLインジェクション攻撃を防ぐために使用されます。PropKitクラス:設定ファイルを読み取るために使用されます。ActiveRecordPluginクラス:データベース操作に使用されます。Dbクラス:データベース操作を実行するために使用されます。OracleDialectクラス:データベースの方言を指定するために使用されます。DruidPluginクラス:データベース接続に使用されます。Engineクラス:テンプレートエンジンの設定に使用されます。UserControllerクラス:ユーザー関連のリクエストを処理するために使用されます。Userクラス:ユーザーデータの受け渡しと保存に使用されます。
コード:
import com.alibaba.druid.filter.stat.StatFilter; import com.alibaba.druid.util.JdbcConstants; import com.alibaba.druid.wall.WallFilter; import com.jfinal.config.*; import com.jfinal.kit.PropKit; import com.jfinal.plugin.activerecord.ActiveRecordPlugin; import com.jfinal.plugin.activerecord.Db; import com.jfinal.plugin.activerecord.dialect.OracleDialect; import com.jfinal.plugin.druid.DruidPlugin; import com.jfinal.template.Engine; import com.oceanbase.testjfinal.controller.UserController; import com.oceanbase.testjfinal.pojo.User;UserConfigクラスの定義。JFinalConfigクラスの各メソッドをオーバーライドすることで、定数、ルーティング、プラグイン、データベース接続などの情報を設定できます。configConstantメソッドの定義。JFinalフレームワークの定数を設定するために使用され、
PropKitを使用して設定ファイルから設定を読み取ります。コード:
@Override public void configConstant(Constants constants) { PropKit.use("config.properties"); }configRouteメソッドの定義。ルーティングマッピングを設定するために使用され、
routes.addメソッドを使用して"/hello"パスをUserControllerクラスのデフォルトアクセスページにマッピングします。コード:
@Override public void configRoute(Routes routes) { routes.add("/hello", UserController.class, "/"); }configEngineメソッドの定義。テンプレートエンジンを設定するために使用されます。
コード:
@Override public void configEngine(Engine engine) { }configPluginメソッドの定義。アプリケーションのプラグインを設定するために使用されます。
initメソッドを呼び出してデータベース接続とテーブル構造を初期化し、DruidPluginとActiveRecordPluginプラグインを作成してpluginsに追加します。同時に、activeRecordPluginのaddMappingメソッドを呼び出してデータベーステーブルとエンティティクラスのマッピング関係を追加し、TEST_USERテーブルをUserクラスにマッピングします。コード:
@Override public void configPlugin(Plugins plugins) { init(); DruidPlugin druidPlugin = createDruidPlugin(); plugins.add(druidPlugin); ActiveRecordPlugin activeRecordPlugin = createActiveRecordPlugin(druidPlugin); activeRecordPlugin.addMapping("TEST_USER", User.class); plugins.add(activeRecordPlugin); }createDruidPluginメソッドの定義。DruidPluginプラグインの作成と接続プールサイズ、SQLファイアウォール、接続エラー処理などの関連パラメータの設定に使用されます。PropKitのgetメソッドを呼び出して、設定ファイルからURL、ユーザー名、パスワード、ドライバークラスなどのデータベース接続関連のプロパティ値を取得します。次に、DruidPluginオブジェクトを作成し、取得したプロパティ値で初期化します。addFilterメソッドを呼び出して、DruidPluginにStatFilterインスタンスを追加し、データベースアクセスのパフォーマンス統計に使用します。WallFilterインスタンスを作成し、setDbTypeメソッドでデータベースタイプをOceanBaseに設定してDruidPluginに追加し、SQLファイアウォールフィルタリングを実行します。setInitialSizeメソッドを呼び出して接続プールの初期サイズを設定します。setMaxPoolPreparedStatementPerConnectionSizeメソッドで接続プールごとのプリペアドステートメントの最大数を設定します。setTimeBetweenConnectErrorMillisメソッドで接続エラー間の時間間隔を設定します。setValidationQueryメソッドで接続の検証クエリステートメントを設定します。最後に、作成したDruidPluginインスタンスを返します。コード:
private DruidPlugin createDruidPlugin() { DruidPlugin druidPlugin = new DruidPlugin( PropKit.get("db.app.url"), PropKit.get("db.app.user"), PropKit.get("db.app.password"), PropKit.get("db.app.driver") ); druidPlugin.addFilter(new StatFilter()); WallFilter wallFilter = new WallFilter(); wallFilter.setDbType(JdbcConstants.OCEANBASE); druidPlugin.addFilter(wallFilter); druidPlugin.setInitialSize(PropKit.getInt("db.app.poolInitialSize")); druidPlugin.setMaxPoolPreparedStatementPerConnectionSize(PropKit.getInt("db.app.poolMaxSize")); druidPlugin.setTimeBetweenConnectErrorMillis(PropKit.getInt("db.app.connectionTimeoutMillis")); druidPlugin.setValidationQuery("select 1 from dual"); return druidPlugin; }
initメソッドの定義。データベース接続の初期化とデータベーステーブルの作成に使用されます。
initDbConnectionメソッドを呼び出してデータベース接続を初期化し、ActiveRecordPluginインスタンスを返します。次に、SQLステートメントを実行してユーザーテーブルTEST_USERが存在するかどうかを確認します。ユーザーテーブルが存在しない場合、CREATE TABLEステートメントを実行してTEST_USERという名前のデータベーステーブルを作成します。このテーブルにはIDとNAMEの2つのフィールドが含まれます。最後に、ActiveRecordPluginプラグインの接続を閉じてデータベース接続を解放します。コード:
public void init() { ActiveRecordPlugin arp = initDbConnection(); boolean tableExists = Db.queryInt("SELECT COUNT(*) FROM USER_TABLES WHERE TABLE_NAME = 'TEST_USER'") > 0; if (!tableExists) { String sql = "CREATE TABLE TEST_USER (ID NUMBER(10), NAME VARCHAR2(50))"; Db.update(sql); } arp.stop(); }initDbConnectionメソッドの定義。データベース接続の初期化に使用されます。まず、
createDruidPluginメソッドを呼び出してDruidPluginオブジェクトを作成し、変数druidPluginに代入します。このメソッドは、データベース接続プールの管理に使用されるDruidPluginの作成と設定を担当します。次に、createActiveRecordPluginメソッドを呼び出してActiveRecordPluginオブジェクトを作成し、DruidPluginオブジェクトをパラメータとしてこのメソッドに渡します。このメソッドは、データベース操作の管理に使用されるActiveRecordPluginの作成と設定を担当します。その後、druidPlugin.startメソッドを呼び出してDruidPluginを起動し、データベース接続プールを初期化します。最後に、activeRecordPlugin.startメソッドを呼び出してActiveRecordPluginを起動します。このメソッドは、設定に基づいてデータベース操作に関する設定を初期化します。コード:
private ActiveRecordPlugin initDbConnection() { DruidPlugin druidPlugin = createDruidPlugin(); ActiveRecordPlugin activeRecordPlugin = createActiveRecordPlugin(druidPlugin); druidPlugin.start(); activeRecordPlugin.start(); return activeRecordPlugin; }ConfigInterceptorとConfigHandlerメソッドの定義。システム初期化プロセス中にグローバル設定を行うために使用されます。
コード:
@Override public void configInterceptor(Interceptors interceptors) { } @Override public void configHandler(Handlers handlers) { }
UserController.javaファイルの紹介
UserController.java ファイルは、getData メソッドを使用してデータベースにデータを挿入し、データをクエリして、その結果をJSON形式でクライアントに返します。JFinalフレームワークが提供する Db クラスを使用してデータベース操作を実行し、カスタムの User クラスを使用してデータマッピングを行うことで、データベース操作とデータ返却機能を実現しています。
UserController.java ファイルのコードは、主に以下の部分で構成されています:
他のクラスとインターフェースのインポート。
このファイルには以下のインターフェースとクラスが含まれていることを宣言します:
Controllerクラス:リクエストとレスポンスを処理するために使用されます。Dbクラス:データベース操作を実行するために使用されます。Userクラス:データベーステーブルにマッピングするために使用されます。Listインターフェース:クエリ結果の集合を操作するために使用されます。
コード:
import com.jfinal.core.Controller; import com.jfinal.plugin.activerecord.Db; import com.oceanbase.testjfinal.pojo.User; import java.util.List;UserControllerクラスの定義。JFinalフレームワークにコントローラーを提供し、
getDataメソッドを使用してデータベースへのデータ挿入とデータクエリ操作を行うために使用されます。- データの挿入。
Db.updateメソッドを使用してSQL挿入ステートメントを実行し、TEST_USERという名前のテーブルに2件のデータを挿入します。IDは1と2、名前はそれぞれJohnとJaneです。 - データのクエリ。
User.dao.findメソッドを使用してSQLクエリステートメントを実行し、TEST_USERという名前のテーブルからすべてのデータをクエリします。クエリ結果はList型の変数usersに代入されます。 - JSONデータのレンダリング。
renderJsonメソッドを使用して、usersオブジェクトに保存されたデータをJSON形式でレンダリングし、クライアントに返します。 - 例外処理。操作の実行中に例外がキャッチされた場合、
catchステートメントブロックで例外のスタック情報を出力します。
コード:
public class UserController extends Controller { public void getData(){ try { // データの挿入 String insertDataSql = "INSERT INTO TEST_USER (ID, NAME) VALUES (?, ?)"; Db.update(insertDataSql, 1, "John"); Db.update(insertDataSql, 2, "Jane"); //データのクエリ List<User> users; users = User.dao.find("SELECT * FROM TEST_USER"); renderJson(users); }catch (Exception e){ e.printStackTrace(); } } }- データの挿入。
User.javaファイルの紹介
User.java ファイルは、データベーステーブルとJavaオブジェクトのマッピングを実装するために使用されます。
User.java ファイルのコードは、主に以下の部分で構成されています:
Modelクラスのインポート。Modelクラスは、データベーステーブルのマッピングとデータ操作に使用されます。Userクラスの定義。Userクラスは、継承したModelクラスが提供するメソッドを使用してデータベース操作を行います。コード:
import com.jfinal.plugin.activerecord.Model; public class User extends Model<User> { public static final User dao = new User(); }
全コード表示
<?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.oceanbase</groupId>
<artifactId>java-oceanbase-jfinal</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- Packaging method (default to jar) -->
<packaging>war</packaging>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>jfinal</artifactId>
<version>5.0.6</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.8</version>
</dependency>
<dependency>
<groupId>com.oceanbase</groupId>
<artifactId>oceanbase-client</artifactId>
<version>2.4.3</version>
</dependency>
</dependencies>
</project>
db.app.driver=com.oceanbase.jdbc.Driver
db.app.url=jdbc:oceanbase://host:port/schema_name
db.app.user=user_name
db.app.password=
db.app.poolInitialSize=3
db.app.poolMaxSize=10
db.app.connectionTimeoutMillis=100
db.app.validationQuery=select 1 from dual
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<filter>
<filter-name>jfinal</filter-name>
<filter-class>com.jfinal.core.JFinalFilter</filter-class>
<init-param>
<param-name>configClass</param-name>
<!-- your jfinal configuration location -->
<param-value>com.oceanbase.testjfinal.config.UserConfig</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>jfinal</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
package com.oceanbase.testjfinal.config;
import com.alibaba.druid.filter.stat.StatFilter;
import com.alibaba.druid.util.JdbcConstants;
import com.alibaba.druid.wall.WallFilter;
import com.jfinal.config.*;
import com.jfinal.kit.PropKit;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.dialect.OracleDialect;
import com.jfinal.plugin.druid.DruidPlugin;
import com.jfinal.template.Engine;
import com.oceanbase.testjfinal.controller.UserController;
import com.oceanbase.testjfinal.pojo.User;
public class UserConfig extends JFinalConfig {
@Override
public void configConstant(Constants constants) {
// Read properties configuration
PropKit.use("config.properties");
}
@Override
public void configRoute(Routes routes) {
// Set the default access page for project startup, which does not need to be set in the web.
routes.add("/hello", UserController.class, "/");
}
@Override
public void configEngine(Engine engine) {
}
@Override
public void configPlugin(Plugins plugins) {
init();
DruidPlugin druidPlugin = createDruidPlugin();
plugins.add(druidPlugin);
ActiveRecordPlugin activeRecordPlugin = createActiveRecordPlugin(druidPlugin);
activeRecordPlugin.addMapping("TEST_USER", User.class);
plugins.add(activeRecordPlugin);
}
private DruidPlugin createDruidPlugin() {
DruidPlugin druidPlugin = new DruidPlugin(
PropKit.get("db.app.url"),
PropKit.get("db.app.user"),
PropKit.get("db.app.password"),
PropKit.get("db.app.driver")
);
druidPlugin.addFilter(new StatFilter());
WallFilter wallFilter = new WallFilter();
wallFilter.setDbType(JdbcConstants.OCEANBASE);
druidPlugin.addFilter(wallFilter);
druidPlugin.setInitialSize(PropKit.getInt("db.app.poolInitialSize"));
druidPlugin.setMaxPoolPreparedStatementPerConnectionSize(PropKit.getInt("db.app.poolMaxSize"));
druidPlugin.setTimeBetweenConnectErrorMillis(PropKit.getInt("db.app.connectionTimeoutMillis"));
druidPlugin.setValidationQuery("select 1 from dual");
return druidPlugin;
}
private ActiveRecordPlugin createActiveRecordPlugin(DruidPlugin druidPlugin) {
ActiveRecordPlugin activeRecordPlugin = new ActiveRecordPlugin(druidPlugin);
activeRecordPlugin.setDialect(new OracleDialect());
return activeRecordPlugin;
}
public void init() {
ActiveRecordPlugin arp = initDbConnection();
boolean tableExists = Db.queryInt("SELECT COUNT(*) FROM USER_TABLES WHERE TABLE_NAME = 'TEST_USER'") > 0;
if (!tableExists) {
String sql = "CREATE TABLE TEST_USER (ID NUMBER(10), NAME VARCHAR2(50))";
Db.update(sql);
}
arp.stop();
}
private ActiveRecordPlugin initDbConnection() {
DruidPlugin druidPlugin = createDruidPlugin();
ActiveRecordPlugin activeRecordPlugin = createActiveRecordPlugin(druidPlugin);
druidPlugin.start();
activeRecordPlugin.start();
return activeRecordPlugin;
}
@Override
public void configInterceptor(Interceptors interceptors) {
}
@Override
public void configHandler(Handlers handlers) {
}
}
package com.oceanbase.testjfinal.controller;
import com.jfinal.core.Controller;
import com.jfinal.plugin.activerecord.Db;
import com.oceanbase.testjfinal.pojo.User;
import java.util.List;
public class UserController extends Controller {
public void getData(){
try {
// データの挿入
String insertDataSql = "INSERT INTO TEST_USER (ID, NAME) VALUES (?, ?)";
Db.update(insertDataSql, 1, "John");
Db.update(insertDataSql, 2, "Jane");
//データのクエリ
List<User> users;
users = User.dao.find("SELECT * FROM TEST_USER");
renderJson(users);
}catch (Exception e){
e.printStackTrace();
}
}
}
package com.oceanbase.testjfinal.pojo;
import com.jfinal.plugin.activerecord.Model;
public class User extends Model<User> {
public static final User dao = new User();
}
関連ドキュメント
OceanBase Connector/Jの詳細については、OceanBase JDBCドライバを参照してください。
クリックしてjava-oceanbase-Jfinalサンプルプロジェクトをダウンロード