本ドキュメントでは、MyBatis フレームワークと OceanBase Cloud データベースを使用してアプリケーションを構築し、テーブルの作成、データの挿入、データのクエリなどの基本操作を実装する方法について説明します。
前提条件
- OceanBase Cloud データベースのアカウントを登録し、クラスタインスタンスと MySQL互換モード のテナントを作成していること。詳細は、クラスタインスタンスの作成 および テナントの作成 をご参照ください。
- JDK 1.8 および Maven がインストールされていること。
- IntelliJ IDEA がインストールされていること。
説明
本ドキュメントでコードを実行するために使用しているツールは IntelliJ IDEA 2021.3.2 (Community Edition) ですが、お好みに応じて適切なツールを選択してサンプルコードを実行することもできます。
操作手順
説明
本ドキュメントに記載されている手順は、Windows 環境に基づいています。他のオペレーティングシステム環境やコンパイラを使用している場合、手順が若干異なる場合があります。
- OceanBase Cloud データベースの接続文字列を取得します。
java-oceanbase-mybatisプロジェクトを IDEA にインポートします。java-oceanbase-mybatisプロジェクト内のデータベース接続情報を変更します。java-oceanbase-mybatisプロジェクトを実行します。
操作手順 1:OceanBase Cloud データベースの接続文字列を取得する
OB Cloudクラウドデータベースコンソール にログインします。インスタンス一覧ページで対象インスタンスの情報を展開し、対象テナントの下で 接続 > 接続文字列を取得 を選択します。
詳細な操作については、接続文字列の取得 をご参照ください。
作成済みの OceanBase Cloud データベースに基づいて、以下の URL の対応する情報を入力します。
説明
jdbc.propertiesファイルでこの URL 情報が必要になります。jdbc:oceanbase://host:port/schema_name?user=$user_name&password=$passwordパラメータの説明:
host:OceanBase Cloud データベースの接続アドレスを指定します。例:t********.********.oceanbase.cloud。port:OceanBase Cloud データベースの接続ポートを指定します。デフォルトは 3306 です。schema_name:アクセスするスキーマ名を指定します。user_name:データベースにアクセスするためのアカウントを指定します。password:アカウントのパスワードを指定します。
URL パラメータの詳細については、データベースURL をご参照ください。
操作手順 2:java-oceanbase-mybatis プロジェクトを 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-mybatis プロジェクト内のデータベース接続情報を変更する
手順 1:OceanBase Cloud データベースの接続文字列を取得する の情報に基づいて、jdbc.properties ファイル内のデータベース接続情報を変更します。
例は以下の通りです:
- データベースドライバ名:
com.mysql.cj.jdbc.Driver - OBServerノード の IP アドレス:
t5******.********.oceanbase.cloud - アクセスポート:3306
- アクセスするスキーマ名:
test - URL の追加接続プロパティ:
useServerPrepStmts=true&rewriteBatchedStatements=true - テナントの接続アカウント:
mysql001 - パスワード:
******
サンプルコードは以下の通りです:
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:oceanbase://t5******.********.oceanbase.cloud:3306/test?useServerPrepStmts=true&rewriteBatchedStatements=true
jdbc.username=mysql001
jdbc.password=******
操作手順 4:java-oceanbase-mybatis プロジェクトを実行する
実行パス
- プロジェクト構造の src > test > java から
TestMybatis.javaファイルを見つけます。 - ツールメニューバーで 実行(U) > 実行 > TestMybatis を選択するか、右上の緑色の三角形を直接クリックして実行します。
- IDEA のコンソールからプロジェクトのログ情報と出力結果を確認します。
実行結果
testUserMapperメソッドを実行した出力結果は以下の通りです:User{id=2, name='update'} User{id=3, name='insert'} User{id=4, name='insert'} User{id=5, name='insert'} User{id=6, name='insert'} User{id=7, name='insert'} User{id=8, name='insert'} User{id=9, name='insert'} User{id=10, name='insert'} usersByPage = [User{id=5, name='insert'}, User{id=6, name='insert'}, User{id=7, name='insert'}]testSqlSessionメソッドを実行した出力結果は以下の通りです:User{id=2, name='update'} User{id=3, name='insert'} User{id=4, name='insert'} User{id=5, name='insert'} User{id=6, name='insert'} User{id=7, name='insert'} User{id=8, name='insert'} User{id=9, name='insert'} User{id=10, name='insert'}testAppMapperメソッドを実行した出力結果は以下の通りです:App{id=2, name='update'} App{id=3, name='insert3'} App{id=4, name='insert4'} App{id=5, name='insert5'} App{id=6, name='insert6'} App{id=7, name='insert7'} App{id=8, name='insert8'} App{id=9, name='insert9'} App{id=10, name='insert10'} pageList = Page{count=true, pageNum=2, pageSize=3, startRow=3, endRow=6, total=9, pages=3, reasonable=false, pageSizeZero=true}[App{id=5, name='insert5'}, App{id=6, name='insert6'}, App{id=7, name='insert7'}]完全な出力結果は以下の通りです:
User{id=2, name='update'} User{id=3, name='insert'} User{id=4, name='insert'} User{id=5, name='insert'} User{id=6, name='insert'} User{id=7, name='insert'} User{id=8, name='insert'} User{id=9, name='insert'} User{id=10, name='insert'} usersByPage = [User{id=5, name='insert'}, User{id=6, name='insert'}, User{id=7, name='insert'}] App{id=2, name='update'} App{id=3, name='insert3'} App{id=4, name='insert4'} App{id=5, name='insert5'} App{id=6, name='insert6'} App{id=7, name='insert7'} App{id=8, name='insert8'} App{id=9, name='insert9'} App{id=10, name='insert10'} pageList = Page{count=true, pageNum=2, pageSize=3, startRow=3, endRow=6, total=9, pages=3, reasonable=false, pageSizeZero=true}[App{id=5, name='insert5'}, App{id=6, name='insert6'}, App{id=7, name='insert7'}] User{id=2, name='update'} User{id=3, name='insert'} User{id=4, name='insert'} User{id=5, name='insert'} User{id=6, name='insert'} User{id=7, name='insert'} User{id=8, name='insert'} User{id=9, name='insert'} User{id=10, name='insert'}
よくある質問
1. 接続タイムアウト
接続タイムアウトの問題が発生した場合は、JDBC URL で接続タイムアウトパラメータを設定できます:
jdbc:mysql://host:port/database?connectTimeout=30000&socketTimeout=60000
2. 文字セットの問題
正しい文字エンコーディングを確保するために、JDBC URL で正しい文字セットパラメータを設定します:
jdbc:mysql://host:port/database?characterEncoding=utf8&useUnicode=true
3. SSL 接続
OceanBase Cloud データベースとの SSL 接続を有効にするには、JDBC URL に以下のパラメータを追加します:
jdbc:mysql://host:port/database?useSSL=true&requireSSL=true
4. アカウントパスワード内の特殊文字
ユーザー名またはパスワードに特殊文字(# など)が含まれている場合は、URL エンコードを行う必要があります:
String encodedPassword = URLEncoder.encode(password, "UTF-8");
注意
MySQL Connector/J 8.x を使用する場合、アカウントパスワードにハッシュ記号 (#) が含まれていないことを確認してください。含まれていると、接続エラーが発生する可能性があります。
プロジェクトコードの紹介
java-oceanbase-mybatis をクリックしてプロジェクトコードをダウンロードします。これは java-oceanbase-mybatis という名前の圧縮パッケージです。
解凍すると、java-oceanbase-mybatis という名前のフォルダが作成されます。ディレクトリ構造は以下の通りです:
│--pom.xml
│
├─.idea
│
├─src
│ ├─main
│ │ ├─java
│ │ │ └─com
│ │ │ └─oceanbase
│ │ │ ├─mapper
│ │ │ │------IAppMapper.java
│ │ │ │------IUserMapper.java
│ │ │ │
│ │ │ └─pojo
│ │ │ │---App.java
│ │ │ └─--User.java
│ │ │
│ │ └─resources
│ │ │--jdbc.properties
│ │ │--mybatis-config.xml
│ │ │
│ │ └─com
│ │ └─oceanbase
│ │ └─mapper
│ │ └─---IUserMapper.xml
│ │
│ └─test
│ └─java
│ └─---TestMybatis.java
│
└─target
ファイルの説明:
pom.xml:Maven プロジェクトの設定ファイルで、プロジェクトの依存関係、プラグイン、ビルドなどの情報が含まれています。.idea:IDE(統合開発環境)で使用されるディレクトリで、プロジェクト関連の設定情報を保存します。src:通常、プロジェクト内のソースコードを格納するディレクトリを示します。main: メインのソースコードとリソースファイルを格納するディレクトリです。java: Java ソースコードを格納するディレクトリです。com: Java パッケージのルートディレクトリです。oceanbase: プロジェクトのルートディレクトリです。mapper: MyBatis の Mapper インターフェースと XML ファイルを格納します。IAppMapper.java:アプリケーションデータアクセス層のインターフェースを格納します。IUserMapper.java:ユーザーデータアクセス層のインターフェースを格納します。pojo: JavaBean またはエンティティクラスを格納します。App.java:アプリケーションエンティティクラスを格納します。User.java:ユーザーエンティティクラスを格納します。resources: 設定ファイルや SQL ファイルなどのリソースファイルを格納するディレクトリです。jdbc.properties: データベース接続情報を格納する設定ファイルです。mybatis-config.xml: MyBatis の設定ファイルを格納します。IUserMapper.xml:ユーザーデータアクセス層の XML 設定ファイルを格納します。test: テストコードとリソースファイルを格納するディレクトリです。TestMybatis.java: MyBatis をテストする Java クラスを格納します。target: コンパイル後の Class ファイルや Jar パッケージなどのファイルを格納するディレクトリです。
pom.xml コードの紹介
説明
サンプルを検証するだけであれば、デフォルトのコードを使用し、変更する必要はありません。以下の説明に従って、必要に応じて pom.xml ファイルを変更することもできます。
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ファイルの場所を に指定し、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.exampleに指定します。<artifactId>を使用して、プロジェクト依存関係をjava-oceanbase-mybatisに指定します。<version>を使用して、プロジェクトのバージョン番号を1.0-SNAPSHOTに指定します。
コードは以下の通りです:
<groupId>com.oceanbase.example</groupId>
<artifactId>java-oceanbase-mybatis</artifactId>
<version>1.0-SNAPSHOT</version>
<build>を使用して、プロジェクトのビルドプロセスを定義します。<plugins>を使用して、プロジェクトで設定するプラグインを指定します。
<plugin>を使用して、プロジェクトで設定する単一のプラグインを指定します。<groupId>を使用して、プロジェクト識別子をorg.apache.maven.pluginsに指定します。<artifactId>を使用して、プロジェクト依存関係をmaven-compiler-pluginに指定します。<configuration>を使用して、設定するプラグインのパラメータを指定します。<source>を使用して、コンパイラのソースコードバージョンを 8 に指定します。<target>を使用して、コンパイラのターゲットバージョンを 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>
<dependencies>を使用して、プロジェクトが依存するコンポーネントを定義します。依存関係が属する組織を
com.oceanbase、名前をoceanbase-client、バージョン番号を2.4.2に指定します。
コードは以下の通りです:
```java
<dependencies>
<dependency>
<groupId>com.oceanbase</groupId>
<artifactId>oceanbase-client</artifactId>
<version>2.4.2</version>
</dependency>
</dependencies>
```
- 依存関係が属するテストフレームワークを
junit、名前をjunit、バージョン番号を4.10に指定します。
コードは以下の通りです:
```java
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
</dependencies>
```
- 依存関係が属するフレームワークを
org.mybatis、名前をmybatis、バージョン番号を3.5.9に指定します。
コードは以下の通りです:
```java
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
</dependencies>
```
- 依存関係が属するプラグインを
com.github.pagehelper、名前をpagehelper、バージョン番号を5.3.0に指定します。
コードは以下の通りです:
```java
<dependencies>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.3.0</version>
</dependency>
</dependencies>
```
jdbc.properties コードの紹介
jdbc.properties は、データベースの URL、ユーザー名、パスワードなど、データベース接続に関連する設定情報を保存するためのプロパティファイルです。コードには以下の内容が含まれます:
説明
コード内の各フィールドの値は、手順 1:OceanBase Cloud データベースの接続文字列を取得する から直接取得します。
jdbc.driver:データベースドライバをロードするために使用される、データベースドライバのクラス名です。jdbc.url:接続するデータベースを指定するための、データベースの URL アドレスです。jdbc.username:データベース接続を認証するための、データベースのユーザー名です。jdbc.password:データベース接続を認証するための、データベースのパスワードです。
コードは以下の通りです:
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://host:port/TEST?useServerPrepStmts=true&rewriteBatchedStatements=true
jdbc.username=user_name
jdbc.password=******
mybatis-config.xml の紹介
mybatis-config.xml ファイルは、MyBatis フレームワークのグローバルプロパティやプラグインなどを設定するために使用されます。
mybatis-config.xml ファイルのコードは、主に以下のセクションで構成されています:
- ファイル宣言。
このファイルが XML ファイルであることを宣言します。この宣言は、現在のドキュメントが MyBatis 設定ファイルであり、使用する XML バージョンが 1.0、文字エンコーディングが UTF-8 であることを示します。バージョン番号は 3.0、言語は英語で、MyBatis 公式サイトが提供する DTD(Document Type Definition)ファイルを使用して検証を行います。
宣言には以下のセクションが含まれます:
* `version`:XML ファイルのバージョンを指定します。
* `encoding`:XML ファイルのエンコーディング方式を指定します。
* `DOCTYPE`:タイプがドキュメントタイプ宣言であることを宣言します。
* `configuration`:ドキュメントタイプが MyBatis 設定ファイルであることを指定します。
* `PUBLIC`:ドキュメントタイプがパブリックドキュメントタイプであることを指定します。
* `mybatis.org`:MyBatis 公式サイトを示します。
* `DTD Config 3.0`:MyBatis 設定ファイルのバージョン番号を示します。
* `EN`:ドキュメントタイプの言語が英語であることを示します。
コードは以下の通りです:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
```
2. ロードするプロパティファイルのパスとファイル名を指定します。
```xml
<properties resource="jdbc.properties"></properties>
```
3. MyBatis のグローバル設定を行います。
MyBatis のグローバル設定の内容には、以下のセクションが含まれます:
* `setting`:キャッシュやログなど、個別の構成パラメータを設定するために使用されます。
* `cacheEnabled`:キャッシュ機能を有効または無効にするために使用され、`true` に設定します。
* `lazyLoadingEnabled`:遅延ロード機能を有効または無効にするために使用され、`true` に設定します。
* `aggressiveLazyLoading`:積極的な遅延ロード機能を有効または無効にするために使用され、`true` に設定します。
* `multipleResultSetsEnabled`:複数結果セットのサポートを有効にするかどうかを設定するために使用され、`true` に設定します。
* `useColumnLabel`:結果セットの列名として列ラベルを使用するかどうかを設定するために使用され、`true` に設定します。
* `useGeneratedKeys`:自動生成された主キーを使用するかどうかを設定するために使用され、`true` に設定します。
* `autoMappingBehavior`:自動マッピングの処理動作を設定するために使用され、`PARTIAL` に設定します。
* `defaultExecutorType`:デフォルトのエグゼキュータタイプを設定するために使用され、`SIMPLE` に設定します。
* `mapUnderscoreToCamelCase`:データベースの列名にあるアンダースコアを Java オブジェクトのプロパティ名のキャメルケースに変換するかどうかを設定するために使用され、`true` に設定します。
* `localCacheScope`:ローカルキャッシュのスコープを設定するために使用され、`SESSION` に設定します。
* `jdbcTypeForNull`:NULL 値を処理する際に使用する JDBC タイプを設定するために使用され、`NULL` に設定します。
<main id="notice" type='explain'>
<h4>説明</h4>
<p>settings 要素内の子要素はオプションであり、実際の状況に応じて追加または削除できます。</p>
</main>
**コードは以下の通りです:**
```xml
<settings>
<!-- Enable or disable caching for global mappers. -->
<setting name="cacheEnabled" value="true"/>
<!-- Enable or disable lazy loading globally. When disabled, all associated objects are loaded immediately. -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- When enabled, objects with delayed loading properties will fully load any properties when called. Otherwise, each attribute will be loaded as needed. -->
<setting name="aggressiveLazyLoading" value="true"/>
<!-- Allow a single SQL statement to return multiple datasets (depending on driver compatibility) default: true -->
<setting name="multipleResultSetsEnabled" value="true"/>
<!-- Can column aliases be used (depending on driver compatibility) default: true -->
<setting name="useColumnLabel" value="true"/>
<!-- Allow JDBC to generate primary keys. Drive support is required. If set to true, this setting will force the use of the generated primary key, and some drives may not be compatible but can still be executed. default:false -->
<setting name="useGeneratedKeys" value="true"/>
<!-- Specify how MyBatis automatically maps the columns of the data base table NONE: Not Implicit PART: Partial FULL: All -->
<setting name="autoMappingBehavior" value="PARTIAL"/>
<!-- This is the default execution type (SIMPLE: simple; REUSE: executor may repeatedly use prepared statements; BATCH: executor can repeatedly execute statements and batch updates) -->
<setting name="defaultExecutorType" value="SIMPLE"/>
<!-- Convert fields using camel naming. -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- Set the local cache range session: there will be data sharing statement: statement range (so there will be no data sharing) defalut: session -->
<setting name="localCacheScope" value="SESSION"/>
<!-- When the JDBC type is set to null, some drivers need to specify a value, default: Other, and there is no need to specify a type when inserting null values -->
<setting name="jdbcTypeForNull" value="NULL"/>
</settings>
```
4. MyBatis のプラグインを設定します。
MyBatis のプラグインの内容には、以下のセクションが含まれます:
* `plugin`:単一のプラグインを設定するために使用されます。
* `property`:プラグインのプロパティを指定するために使用されます。
* `interceptor`:プラグインの実装クラスを指定するために使用されます。
* `helperDialect`:選択したデータベースを指定するために使用されます。
* `offsetAsPageNum`:offset パラメータを pageNum パラメータとして使用するかどうかを示します。
* `rowBoundsWithCount`:count クエリを実行するかどうかを示します。
* `pageSizeZero`:pageSize が 0 のクエリをサポートするかどうかを示します。
* `reasonable`:合理化クエリを有効にするかどうかを示します。
* `params`:ページネーションパラメータを渡すためのパラメータ名とパラメータ値のマッピング関係を示します。
* `supportMethodsArguments`:メソッドパラメータを使用してページネーションパラメータを渡すことをサポートするかどうかを示します。
* `returnPageInfo`:戻り値のタイプを示します。
**コードは以下の通りです:**
```xml
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!-- this parameter indicates which database to connect to -->
<!--MySQLMode dialect<property name="helperDialect" value="mysql"/>-->
<!--OracleMode dialect -->
<property name="helperDialect" value="mysql"/>
<!-- This parameter defaults to false. When set to true, the first parameter offset of RowBounds will be used as the pageNum page number, similar to the pageNum effect in startPage -->
<property name="offsetAsPageNum" value="true"/>
<!-- This parameter defaults to false, and when set to true, using RowBounds pagination will result in a count query -->
<property name="rowBoundsWithCount" value="true"/>
<!-- When set to true, if pageSize=0 or RowBounds. limit=0, all results will be queried (equivalent to not executing a pagination query, but the returned results are still of type Page) -->
<property name="pageSizeZero" value="true"/>
<!-- Version 3.3.0 is available - pagination parameter rationalization is disabled by default as false. When rationalization is enabled, if pageNum<1, the first page will be queried, and if pageNum>pages, the last page will be queried. Rationalization of paging parameters. When rationalization is disabled, if pageNum<1 or pageNum>pages returns empty data -->
<property name="reasonable" value="false"/>
<!-- Version 3.5.0 is available - In order to support the startPage (Object params) method, a 'params' parameter has been added to configure parameter mapping, which can be used to retrieve values from Map or ServletRequest. PageNum, pageSize, count, pageSizeZero, reasonable, orderBy can be configured. If mapping is not configured, the default value will be used. If you do not understand the meaning, do not copy this configuration casually -->
<property name="params" value="pageNum=start;pageSize=limit;"/>
<!-- Support passing paging parameters through Mapper interface parameters -->
<property name="supportMethodsArguments" value="true"/>
<!-- Always always returns PageInfo type, check to check if the return type is PageInfo, and none returns Page -->
<property name="returnPageInfo" value="check"/>
</plugin>
```
5. MyBatis の環境を設定します。
MyBatis の環境の内容には、以下のセクションが含まれます:
* `environment`:単一の環境を設定するために使用されます。
* `transactionManager`:トランザクションマネージャーの実装クラスを指定するために使用されます。
* `dataSource`:データソースの実装クラスを指定するために使用されます。
* `property`:データベースドライバのクラス名を指定します。
<main id="notice" type='explain'>
<h4>説明</h4>
<p>MyBatis の他の設定要素では、<code>${}</code> プレースホルダーを使用して、環境で設定されたデータソース、トランザクションマネージャー、エグゼキュータなどを参照できます。</p>
</main>
**コードは以下の通りです:**
```xml
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
```
6. MyBatis のマッパーを設定します。
MyBatis のマッパーでよく使用される要素は以下の通りです:
* resource:マッパーの XML 設定ファイルのパスとファイル名を指定するために使用されます。
* class:マッパーの Java クラス名を指定するために使用されます。
<main id="notice" type='explain'>
<h4>説明</h4>
<p>XML 設定ファイルを使用する場合は、mapper 要素で XML ファイルのパスとファイル名を指定する必要があります。Java インターフェースを使用する場合は、mapper 要素で Java クラスの完全修飾名を指定する必要があります。</p>
</main>
**コードは以下の通りです:**
```xml
<mappers>
<!-- IUserMapper.xml mapping file -->
<mapper resource="com/alipay/oceanbase/mapper/IUserMapper.xml"></mapper>
<!-- IAppMapper mapping class -->
<mapper class="com.oceanbase.mapper.IAppMapper"></mapper>
</mappers>
```
### IUserMapper.xml コードの紹介
`IUserMapper.xml` ファイルは、ユーザーオブジェクトに関連する SQL ステートメントを定義するためのマッピングファイルです。このファイルには `IUserMapper` という名前空間が定義されており、ユーザーオブジェクトに関連する SQL ステートメントを格納するために使用されます。
<main id="notice" type='explain'>
<h4>説明</h4>
<p>サンプルを検証するだけであれば、デフォルトのコードを使用し、変更する必要はありません。変更が必要な場合は、実際の状況に応じて変更してください。</p>
</main>
`IUserMapper.xml` ファイルのコードは、主に以下のセクションで構成されています:
1. ファイル宣言文。
XML ファイルの宣言セクションは、XML ファイルのバージョンとエンコーディング方式を指定するために使用されます。DTD ファイルの宣言セクションは、MyBatis の DTD ファイルをインポートするために使用されます。
**コードは以下の通りです:**
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
http://mybatis.org/dtd/mybatis-3-mapper.dtd>
```
2. `IUserMapper.java` とのマッピング関係を設定します。
1. `Mapper` インターフェースの名前空間を定義し、Java コード内の `Mapper` インターフェースと対応させます。
2. `insertUser` という名前の SQL ステートメントを作成し、`test_user` テーブルにレコードを挿入します。これには `id` と `name` の 2 つのフィールドが含まれ、値はそれぞれ `#{id}` と `#{name}` です。`parameterType` プロパティは、渡されるパラメータのタイプが `com.oceanbase.pojo.User` であることを指定します。
3. `deleteUser` という名前の SQL ステートメントを作成し、`test_user` テーブルからレコードを削除します。`id` フィールドの値に基づいて対応するレコードを照合し、値は `#{id}` です。
4. `updateUser` という名前の SQL ステートメントを作成し、`test_user` テーブルのレコードを更新します。`name` フィールドの値を `#{name}` に更新し、`id` フィールドの値に基づいて対応するレコードを照合します。値は `#{id}` です。
5. `selectUsers` という名前の SQL ステートメントを作成し、`test_user` テーブル内のすべてのユーザーレコードをクエリします。
6. `selectUserByPage` という名前の SQL ステートメントを作成し、`test_user` テーブルから指定されたページ数のユーザーオブジェクトをクエリします。サブクエリと `rownum` フィールドを使用してページネーションクエリを実行します。ここで、`#{pageNum}` と `#{pageSize}` は現在のページ番号と 1 ページあたりのレコード数を示します。
**コードは以下の通りです:**
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
http://mybatis.org/dtd/mybatis-3-mapper.dtd>
<mapper namespace="com.oceanbase.mapper.IUserMapper">
<insert id="insertUser" parameterType="com.oceanbase.pojo.User">
INSERT INTO test_user (id,name) VALUES (#{id},#{name})
</insert>
<delete id="deleteUser" parameterType="long">
DELETE FROM test_user WHERE id = #{id}
</delete>
<update id="updateUser" parameterType="com.oceanbase.pojo.User">
UPDATE test_user SET name = #{name} WHERE id = #{id}
</update>
<select id="selectUsers" resultType="com.oceanbase.pojo.User">
SELECT id,name FROM test_user
</select>
<!-- There are two ways to paginate queries: 1. Use the pagehelper plugin; 2. Use SQL statements to paginate -->
<!-- SQL statement pagination: Oracle mode does not support the limit keyword, and instead uses the unique field 'rownum'-->
<select id="selectUserByPage" resultType="com.oceanbase.pojo.User">
select id,name from ( select row_.*, rownum rownum_ from ( select * from test_user ) row_ where rownum
<![CDATA[ <= ]]> #{pageNum} * #{pageSize} ) where rownum_ <![CDATA[ >]]> ( #{pageNum}- 1) * #{pageSize}
</select>
</mapper>
```
### IAppMapper.java コードの紹介
`IAppMapper.java` ファイルは、SQL マッピング関係を定義するために使用されます。
`IAppMapper.java` ファイルのコードは、主に以下のセクションで構成されています:
1. `Mapper` パッケージを定義します。
現在のファイルが属するパッケージ名が `com.oceanbase.mapper` であることを宣言します。`Mapper` パッケージには以下のインターフェースとクラスが含まれます:
* `App` インターフェース:データベーステーブルとのマッピングを示し、データの読み書き操作を実装します。
* `org.apache.ibatis.annotations.*`:MyBatis のアノテーションクラスをインポートするために使用されます。
* `java.util.List`:`java.util` パッケージの `List` クラスをインポートするために使用されます。
**コードは以下の通りです:**
```java
package com.oceanbase.mapper;
import com.oceanbase.pojo.App;
import org.apache.ibatis.annotations.*;
import java.util.List;
```
2. `IAppMapper` インターフェースを定義します。
`IAppMapper` インターフェースは、MyBatis の `Mapper` インターフェースを定義するために使用されます。`Mapper` インターフェースは、SQL マッピング関係を定義し、データベースに対する CRUD 操作を実装するために使用されます。具体的には、`IAppMapper` インターフェースは `test_app` テーブルに対する CRUD 操作のメソッドを定義しており、以下が含まれます:
* `@Insert` メソッド:データベースにデータを挿入するために使用されます。
* `@Update` メソッド:データベース内のデータを更新するために使用されます。
* `@Delete` メソッド:データベース内のデータを削除するために使用されます。
* `@Select` メソッド:データベース内のデータをクエリするために使用されます。
* `@Results` メソッド:クエリ結果のマッピング関係を示し、クエリ結果のフィールドを Java オブジェクトのプロパティにマッピングするために使用されます。
**データベースに対する CRUD 操作は以下の通りです:**
1. データの挿入
App オブジェクトを `test_app` テーブルのレコードにマッピングし、App オブジェクトのプロパティ値は `#{プロパティ名}` の形式でプレースホルダーとして表されます。`Integer` タイプの戻り値は、SQL ステートメントがデータを挿入した後に返される自動生成された ID、つまり `test_app` テーブルの ID フィールドに対応する値を示します。
```java
@Insert("insert into test_app(id,name) values(#{id},#{name})")
Integer insertApp(App app);
```
2. データの削除
`test_app` テーブルから id が `#{id}` に等しいデータを削除します。
```java
@Delete("delete from test_app where id =#{id}")
Integer deleteApp(Long id);
```
3. データの更新
`test_app` テーブルのレコードを変更するには、Update 操作を実行する必要があります。
```java
@Update("update test_app set name= #{name} where id = #{id}")
Integer updateApp(App user);
```
4. データのクエリとマッピング
`test_app` テーブル内のすべてのデータをクエリします。同時に、`@Results` アノテーションと `@Result` アノテーションを使用して、クエリ結果を App オブジェクトの `id` および `name` プロパティにマッピングします。最終的に App オブジェクトのリストを返します。
```java
@Update("update test_app set name= #{name} where id = #{id}")
Integer updateApp(App user);
@Results({
@Result(id = true, column = "id", property = "id"),
@Result(column = "name", property = "name")
})
List<App> selectApps();
```
**コードは以下の通りです:**
```java
package com.oceanbase.mapper;
import com.oceanbase.pojo.App;
import org.apache.ibatis.annotations.*;
import java.util.List;
public interface IAppMapper {
@Insert("insert into test_app(id,name) values(#{id},#{name})")
Integer insertApp(App app);
@Delete("delete from test_app where id =#{id}")
Integer deleteApp(Long id);
@Update("update test_app set name= #{name} where id = #{id}")
Integer updateApp(App user);
@Select("select * from test_app")
@Results({
@Result(id = true, column = "id", property = "id"),
@Result(column = "name", property = "name")
})
List<App> selectApps();
}
```
### IUserMapper.java コードの紹介
`IUserMapper.java` ファイルは、データベース操作のメソッドを定義するために使用されます。
`IUserMapper.java` ファイルのコードは、主に以下のセクションで構成されています:
1. 他のクラスとインターフェースの参照。
現在のファイルに含まれるインターフェースとクラスを宣言します:
* `User` クラス:ユーザーオブジェクトを示します。
* `org.apache.ibatis.annotations.Param` クラス:MyBatis フレームワークのパラメータアノテーションです。
* `List` インターフェース:リストタイプを示します。
**コードは以下の通りです:**
```java
package com.oceanbase.mapper;
import com.oceanbase.pojo.User;
import org.apache.ibatis.annotations.Param;
import java.util.List;
```
2. `IUserMapper` インターフェースを定義します。
`IUserMapper` という名前のインターフェースを定義し、ユーザーデータの挿入、削除、更新、クエリのメソッド、およびユーザーデータのページネーションクエリのメソッドを定義します。同時に、`JavaDoc` コメントと `@Param` アノテーションを使用して、コードの可読性と保守性を向上させます。
**コードは以下の通りです:**
```java
public interface IUserMapper {
Integer insertUser(User user);
Integer deleteUser(Long id);
Integer updateUser(User user);
List<User> selectUsers();
public List<User> selectUserByPage(@Param("user") User user, @Param("pageNum") Integer pageNum,
@Param("pageSize") Integer pageSize);
}
App.java コードの紹介
App.java ファイルは、App アプリケーションオブジェクトを表すために使用されます。これには id と name の 2 つのプロパティが含まれます。クラスには、プロパティのアクセス・メソッドとコンストラクタ、およびオブジェクトを文字列に変換する toString メソッドも定義されています。
App.java ファイルのコードは、主に以下のセクションで構成されています:
pojoパッケージを定義します。 現在のファイルが属するパッケージ名がcom.oceanbase.pojoであることを宣言します。Appクラスを定義します。Appというクラスを定義します。これにはidとnameの 2 つのプライベートプロパティ、および引数なしのコンストラクタpublic App(){}が含まれます。- 指定された
idとnameを持つアプリケーションオブジェクトを作成するために、パラメータ付きのコンストラクタpublic App(Long id, String name)を定義します。 - アプリケーション名を取得および設定するために、
getIdメソッド、setIdメソッド、getNameメソッド、およびsetNameメソッドを定義し、setNameメソッドを通じて設定されたアプリケーション名を返します。 toStringメソッドをオーバーライドすることで、アプリケーションオブジェクトを文字列表現に変換し、出力とデバッグを容易にします。
コードは以下の通りです:
package com.oceanbase.pojo;
public class App {
private Long id;
private String name;
public App() {
}
public App(Long id, String name) {
this.id = id;
this.name = name;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "App{" +
id= + id +
, name=' + name + '\'' +
}';
}
}
User.java コードの紹介
User.java ファイルは、ユーザーオブジェクトを表すために使用されます。これには id と name の 2 つのプロパティが含まれます。クラスには、プロパティのアクセス・メソッドとコンストラクタ、およびオブジェクトを文字列に変換する toString メソッドも定義されています。 このクラスの作成は、上記の App.java コードの作成と同様です。
コードは以下の通りです:
package com.oceanbase.pojo;
public class User {
private Long id;
private String name;
public User() {
}
public User(Long id, String name) {
this.id = id;
this.name = name;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
id= + id +
, name=' + name + '\'' +
}';
}
}
TestMyBatis.java ファイルの紹介
TestMyBatis.java は、MyBatis を使用してデータ操作を行う方法を示すために使用されます。MyBatis フレームワークの基本機能と SQL ステートメントの実行状況、および Mapper インターフェースの呼び出し方法や SQL ステートメントのパラメータと戻り値などをテストします。
- 他のクラスとインターフェースの参照。
使用するクラスとインターフェースをインポートするために使用されるものは以下の通りです:
* `IAppMapper` インターフェース:App オブジェクトに関連する SQL ステートメントを定義するために使用されます。
* `IUserMapper` インターフェース:User オブジェクトに関連する SQL ステートメントを定義するために使用されます。
* `App` クラス:App オブジェクトで、SQL ステートメントの実行状況をテストするために使用されます。
* `User` クラス:User オブジェクトで、SQL ステートメントの実行状況をテストするために使用されます。
* `PageHelper` プラグイン:ページネーションクエリ機能を実装するために使用されます。
* `PageInfo` プラグイン:ページネーションクエリ結果をカプセル化するために使用されます。
* `Resources` クラス:MyBatis 設定ファイルをロードするために使用されます。
* `SqlSession` クラス:SQL ステートメントを実行し、トランザクションを管理するために使用されます。
* `SqlSessionFactory` クラス:SqlSession オブジェクトを作成するために使用されます。
* `SqlSessionFactoryBuilder` クラス:SqlSessionFactory オブジェクトを作成するために使用されます。
* `org.junit.Test`:JUnit テストフレームワークのアノテーションで、テストメソッドをマークするために使用されます。
* `IOException` クラス:入出力操作中のエラーを示すために使用されます。
* `SQLException` クラス:SQL 操作中のエラーを示すために使用されます。
* `Statement` インターフェース:SQL ステートメントを実行し、結果を返すために使用されます。
* `java.util.List` インターフェース:順序付けられたコレクションを示すために使用され、その中の要素は重複する可能性があります。
コードは以下の通りです:
```java
import com.oceanbase.mapper.IAppMapper;
import com.oceanbase.mapper.IUserMapper;
import com.oceanbase.pojo.App;
import com.oceanbase.pojo.User;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.IOException;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;
```
testUserMapperメソッドを定義します。
testUserMapper メソッドは、User オブジェクトの Mapper インターフェースで定義された SQL ステートメントの実行状況をテストするために使用されます。
SqlSessionFactoryBuilderクラスのbuild()メソッドを使用して、SqlSessionFactoryインスタンスを作成します。これはSqlSessionインスタンスの作成と破棄を管理するために使用されます。SqlSessionFactoryのopenSession()メソッドを使用して、SqlSessionインスタンスを作成します。クエリ、挿入、更新、削除などの操作を含むさまざまな SQL ステートメントを実行できます。SqlSessionインスタンスのgetConnection()メソッドを使用して、Connectionインスタンスを取得します。さまざまなデータベース操作を実行できます。ConnectionインスタンスのcreateStatement()メソッドを使用して、Statementインスタンスを作成します。SQL ステートメントを順次実行します。Statementオブジェクトのexecute()メソッドを使用して、test_userという名前のテーブルを削除する SQL ステートメントを実行します。
Statementオブジェクトのexecute()メソッドを使用して、test_userという名前のテーブルを作成します。このテーブルには 2 つのフィールドが含まれます。1 つはidで、タイプはnumber(20)で主キーとして機能します。もう 1 つはnameで、タイプはvarchar2(100)です。SqlSessionインスタンスのgetMapper()メソッドを使用して、IUserMapperインターフェースのインスタンスを取得します。さまざまなデータベース操作メソッドを定義します。forループを使用してtest_userテーブルに 10 件のデータを挿入します。各ループで新しい User オブジェクトを作成し、MapperインターフェースのinsertUser()メソッドを使用して挿入操作を実行します。挿入操作の実行結果はinsertResult変数に格納されます。test_userテーブル内のデータに対して削除、更新、クエリを実行し、最後にforEach()メソッドを使用して、そのユーザーリスト内の各ユーザーの情報を出力します。insertという名前のユーザーを作成し、selectUserByPage()メソッドを使用してtest_userテーブル内の名前が "insert" であるすべてのユーザーデータをクエリし、指定されたページのユーザーリストを返します。クエリするのは 2 ページ目で、1 ページあたり 3 件のデータを表示し、これらのユーザーデータをコンソールに出力します。同時にStatementとSqlSessionインスタンスを閉じ、トランザクションをコミットしてリソースを解放します。
コードは以下の通りです:
```java
public void testUserMapper() throws SQLException, IOException {
//mybatis xml usecases
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
Statement statement = sqlSession.getConnection().createStatement();
try {
statement.execute("drop table test_user");
} catch (SQLException ex) {
} finally {
statement.execute("create table test_user(id number(20) primary key,name varchar2(100))");
}
IUserMapper mapper = sqlSession.getMapper(IUserMapper.class);
//insert 10 users
for (int i = 1; i <= 10; i++) {
User user = new User((long) i, "insert");
Integer insertResult = mapper.insertUser(user);
}
//delete id==1
Integer deleteResult = mapper.deleteUser(1L);
//update id==2L name=update
User updateUser = new User(2L, "update");
Integer updateResult = mapper.updateUser(updateUser);
//selectUsers query all
List<User> userList = mapper.selectUsers();
userList.forEach(System.out::println);
//selectUsersByPage:use the rownum keyword in SQL statements to manually perform pagination queries,
// example: data on page 2 (3 items per page)
User user = new User();
user.setName("insert");
List<User> usersByPage = mapper.selectUserByPage(user, 2, 3);
System.out.println("usersByPage = " + usersByPage);
statement.close();
sqlSession.commit();
sqlSession.close();
}
```
testSqlSessionメソッドを定義します。
testSqlSession メソッドは、SQL ステートメントの実行、トランザクションのコミット、SqlSession オブジェクトのクローズなど、SqlSession オブジェクトの基本機能をテストするために使用されます。
SqlSessionFactoryBuilderクラスのbuild()メソッドを使用して、SqlSessionFactoryインスタンスを作成します。これはSqlSessionインスタンスの作成と破棄を管理するために使用されます。SqlSessionFactoryのopenSession()メソッドを使用して、SqlSessionインスタンスを作成します。クエリ、挿入、更新、削除などの操作を含むさまざまな SQL ステートメントを実行できます。SqlSessionインスタンスのgetConnection()メソッドを使用して、Connectionインスタンスを取得します。さまざまなデータベース操作を実行できます。ConnectionインスタンスのcreateStatement()メソッドを使用して、Statementインスタンスを作成します。SQL ステートメントを順次実行します。Statementオブジェクトのexecute()メソッドを使用して、test_userという名前のテーブルを削除する SQL ステートメントを実行します。
Statementオブジェクトのexecute()メソッドを使用して、test_userという名前のテーブルを作成します。このテーブルには 2 つのフィールドが含まれます。1 つはidで、タイプはnumber(20)で主キーとして機能します。もう 1 つはnameで、タイプはvarchar2(100)です。forループを使用してtest_userテーブルに 10 件のデータを挿入します。各ループで新しい User オブジェクトを作成し、MapperインターフェースのinsertUser()メソッドを使用して挿入操作を実行します。挿入操作の実行結果はinsertResult変数に格納されます。sqlSessionのdelete()メソッドを使用して、削除操作を実行します。渡されたパラメータ 1L を通じて削除条件を設定します。削除操作の結果はdeleteResult変数に格納されます。sqlSessionオブジェクトを使用してデータベースの更新操作を実行します。User オブジェクトを作成し、updateメソッドを呼び出して SQL ステートメントの識別子とパラメータオブジェクトを渡し、更新操作を完了します。具体的な SQL ステートメントとパラメータのマッピング関係は、"com.oceanbase.mapper.IUserMapper" インターフェースの XML 設定ファイルにあります。更新操作の結果はupdateResult変数に格納されます。SqlSessionFactoryのopenSession()メソッドを使用してSqlSessionインスタンスを作成し、このインスタンスを通じてクエリ操作を実行し、クエリ結果をuserList変数に格納します。最後に、forEachメソッドを使用してuserListを反復処理し、コンソールに出力します。statement.close()を通じてデータベース接続内のStatementオブジェクトを閉じます。次に、sqlSession.commit()を通じてトランザクションをコミットし、すべての変更をデータベースに永続化します。最後に、sqlSession.close()を通じてSqlSessionオブジェクトを閉じ、関連するリソースを解放してデータベースとの接続を閉じます。
コードは以下の通りです:
```java
public void testSqlSession() throws SQLException, IOException {
//SqlSession usecases
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
Statement statement = sqlSession.getConnection().createStatement();
try {
statement.execute("drop table test_user");
} catch (SQLException ex) {
} finally {
statement.execute("create table test_user(id number(20) primary key,name varchar2(100))");
}
//insert
for (int i = 1; i <= 10; i++) {
User user = new User((long) i, "insert");
//Integer insertResult = mapper.insertUser(user);
int insertResult = sqlSession.insert("com.oceanbase.mapper.IUserMapper.insertUser", user);
}
//delete
int deleteResult = sqlSession.delete("com.oceanbase.mapper.IUserMapper.deleteUser", 1L);
//update
User updateUser = new User(2L, "update");
int updateResult = sqlSession.update("com.oceanbase.mapper.IUserMapper.updateUser", updateUser);
//selectUsers
List<User> userList = sqlSession.selectList("com.oceanbase.mapper.IUserMapper.selectUsers", null);
userList.forEach(System.out::println);
//System.out.println("userList = " + userList);
statement.close();
sqlSession.commit();
sqlSession.close();
}
```
testAppMapperメソッドを定義します。
testAppMapper メソッドは、AppMapper の機能をテストするために使用されます。
SqlSessionFactoryBuilderクラスのbuild()メソッドを使用して、SqlSessionFactoryインスタンスを作成します。これはSqlSessionインスタンスの作成と破棄を管理するために使用されます。SqlSessionFactoryのopenSession()メソッドを使用して、SqlSessionインスタンスを作成します。クエリ、挿入、更新、削除などの操作を含むさまざまな SQL ステートメントを実行できます。SqlSessionインスタンスのgetConnection()メソッドを使用して、Connectionインスタンスを取得します。さまざまなデータベース操作を実行できます。ConnectionインスタンスのcreateStatement()メソッドを使用して、Statementインスタンスを作成します。SQL ステートメントを順次実行します。Statementオブジェクトのexecute()メソッドを使用して、test_appという名前のテーブルを削除する SQL ステートメントを実行します。
Statementオブジェクトのexecute()メソッドを使用して、test_appという名前のテーブルを作成します。このテーブルには 2 つのフィールドが含まれます。1 つはidで、タイプはnumber(20)で主キーとして機能します。もう 1 つはnameで、タイプはvarchar2(100)です。SqlSessionインスタンスのgetMapper()メソッドを使用して、IAppMapperインターフェースのインスタンスを取得します。さまざまなデータベース操作メソッドを定義します。forループを使用してtest_appテーブルに 10 件のデータを挿入します。各ループで新しい App オブジェクトを作成し、MapperインターフェースのinsertApp()メソッドを使用して挿入操作を実行します。挿入操作の実行結果はinsertResult変数に格納されます。mapperのdelete()メソッドを使用して、削除操作を実行します。渡されたパラメータ1Lを通じて削除条件を設定します。削除操作の結果はdeleteResult変数に格納されます。mapperオブジェクトを使用してデータベースの更新操作を実行します。App オブジェクトを作成し、updateメソッドを呼び出して SQL ステートメントの識別子とパラメータオブジェクトを渡し、更新操作を完了します。idが2Lでnameが "update" であるAppオブジェクトupdateAppを作成します。mapperのupdateAppメソッドを呼び出し、updateAppオブジェクトを渡して更新操作を実行します。sqlSessionのcommitメソッドを呼び出し、データベーストランザクションをコミットします。mapperのselectAppsメソッドを呼び出し、すべての App オブジェクトをクエリします。forEachメソッドを使用してuserListを反復処理し、コンソールに出力します。PageHelperのstartPageメソッドを呼び出し、ページ番号と 1 ページあたりのデータ数を渡してページネーションパラメータを設定します。すべてのAppオブジェクトをクエリし、すべてのAppオブジェクトを含むListオブジェクトを返します。PageInfoのgetListメソッドを呼び出し、ページネーション後の App オブジェクトリストを取得し、System.out.printlnメソッドを使用してページネーション後のAppオブジェクトリストを出力します。sqlSession.close()を通じてSqlSessionオブジェクトを閉じ、関連するリソースを解放します。
コードは以下の通りです:
```java
public void testAppMapper() throws SQLException, IOException {
//mybatis annotation usecases
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
Statement statement = sqlSession.getConnection().createStatement();
try {
statement.execute("drop table test_app");
} catch (SQLException ex) {
} finally {
statement.execute("create table test_app(id number(20) primary key,name varchar2(100))");
}
IAppMapper mapper = sqlSession.getMapper(IAppMapper.class);
//insert
for (int i = 1; i <= 10; i++) {
App app = new App((long) i, "insert" + i);
Integer insertResult = mapper.insertApp(app);
}
//delete
Integer deleteResult = mapper.deleteApp(1L);
//update
App updateApp = new App(2L, "update");
Integer updateResult = mapper.updateApp(updateApp);
//commit
sqlSession.commit();
//selectApps
List<App> appList = mapper.selectApps();
appList.forEach(System.out::println);
//selectbyPage
//set page parameters
PageHelper.startPage(2, 3);
//selectApps
List<App> appList1 = mapper.selectApps();
//get pageList
PageInfo pageInfo = new PageInfo(appList1);
List<App> pageList = pageInfo.getList();
System.out.println("pageList = " + pageList);
sqlSession.close();
}
```
完全なコードの表示
<?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.example</groupId>
<artifactId>java-oceanbase-mybatis</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>com.oceanbase</groupId>
<artifactId>oceanbase-client</artifactId>
<version>2.4.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
<!-- pagehelper plug-in -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.3.0</version>
</dependency>
</dependencies>
</project>
```
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:oceanbase://host:port/TEST?useServerPrepStmts=true&rewriteBatchedStatements=true
jdbc.username=user_name
jdbc.password=******
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="jdbc.properties"></properties>
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="true"/>
<setting name="multipleResultSetsEnabled" value="true"/>
<setting name="useColumnLabel" value="true"/>
<setting name="useGeneratedKeys" value="true"/>
<setting name="autoMappingBehavior" value="PARTIAL"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="mapUnderscoreToCamelCase" value="true"/>
<setting name="localCacheScope" value="SESSION"/>
<setting name="jdbcTypeForNull" value="NULL"/>
</settings>
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<property name="helperDialect" value="oracle"/>
<property name="offsetAsPageNum" value="true"/>
<property name="rowBoundsWithCount" value="true"/>
<property name="pageSizeZero" value="true"/>
<property name="reasonable" value="false"/>
<property name="params" value="pageNum=start;pageSize=limit;"/>
<property name="supportMethodsArguments" value="true"/>
<property name="returnPageInfo" value="check"/>
</plugin>
</plugins>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/alipay/oceanbase/mapper/IUserMapper.xml"></mapper>
<mapper class="com.oceanbase.mapper.IAppMapper"></mapper>
</mappers>
</configuration>
```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
http://mybatis.org/dtd/mybatis-3-mapper.dtd>
<mapper namespace="com.oceanbase.mapper.IUserMapper">
<insert id="insertUser" parameterType="com.oceanbase.pojo.User">
INSERT INTO test_user (id,name) VALUES (#{id},#{name})
</insert>
<delete id="deleteUser" parameterType="long">
DELETE FROM test_user WHERE id = #{id}
</delete>
<update id="updateUser" parameterType="com.oceanbase.pojo.User">
UPDATE test_user SET name = #{name} WHERE id = #{id}
</update>
<select id="selectUsers" resultType="com.oceanbase.pojo.User">
SELECT id,name FROM test_user
</select>
<!-- There are two ways to paginate queries: 1. Use the pagehelper plugin; 2. Use SQL statements to paginate -->
<!-- SQL statement pagination: Oracle mode does not support the limit keyword, and instead uses the unique field 'rownum'-->
<select id="selectUserByPage" resultType="com.oceanbase.pojo.User">
select id,name from ( select row_.*, rownum rownum_ from ( select * from test_user ) row_ where rownum
<![CDATA[ <= ]]> #{pageNum} * #{pageSize} ) where rownum_ <![CDATA[ >]]> ( #{pageNum}- 1) * #{pageSize}
</select>
</mapper>
```
```java
package com.oceanbase.mapper;
import com.oceanbase.pojo.App;
import org.apache.ibatis.annotations.*;
import java.util.List;
//using annotations public interface IAppMapper { @Insert("insert into test_app(id,name) values(#{id},#{name})") Integer insertApp(App app);
@Delete("delete from test_app where id =#{id}") Integer deleteApp(Long id);
@Update("update test_app set name= #{name} where id = #{id}") Integer updateApp(App user);
@Select("select * from test_app") @Results({ @Result(id = true, column = "id", property = "id"), @Result(column = "name", property = "name") }) List
```java
package com.oceanbase.mapper;
import com.oceanbase.pojo.User;
import org.apache.ibatis.annotations.Param;
import java.util.List;
//using XML public interface IUserMapper {
Integer insertUser(User user);
Integer deleteUser(Long id);
Integer updateUser(User user);
List
public List
package com.oceanbase.pojo;
public class App {
private Long id;
private String name;
public App() {
}
public App(Long id, String name) {
this.id = id;
this.name = name;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "App{" +
id= + id +
, name=' + name + '\'' +
}';
}
}
package com.oceanbase.pojo;
public class User {
private Long id;
private String name;
public User() {
}
public User(Long id, String name) {
this.id = id;
this.name = name;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
id= + id +
, name=' + name + '\'' +
}';
}
}
```java
import com.oceanbase.mapper.IAppMapper;
import com.oceanbase.mapper.IUserMapper;
import com.oceanbase.pojo.App;
import com.oceanbase.pojo.User;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.IOException;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;
public class TestMybatis { @Test public void testUserMapper() throws SQLException, IOException { //mybatis xml usecases SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml")); SqlSession sqlSession = sqlSessionFactory.openSession(); Statement statement = sqlSession.getConnection().createStatement(); try { statement.execute("drop table test_user"); } catch (SQLException ex) { } finally { statement.execute("create table test_user(id number(20) primary key,name varchar2(100))"); } IUserMapper mapper = sqlSession.getMapper(IUserMapper.class); //insert 10 users for (int i = 1; i <= 10; i++) { User user = new User((long) i, "insert"); Integer insertResult = mapper.insertUser(user); } //delete id==1 Integer deleteResult = mapper.deleteUser(1L); //update id==2L name=update User updateUser = new User(2L, "update"); Integer updateResult = mapper.updateUser(updateUser); //selectUsers query all List
@Test public void testSqlSession() throws SQLException, IOException { //SqlSession usecases SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml")); SqlSession sqlSession = sqlSessionFactory.openSession(); Statement statement = sqlSession.getConnection().createStatement(); try { statement.execute("drop table test_user"); } catch (SQLException ex) { } finally { statement.execute("create table test_user(id number(20) primary key,name varchar2(100))"); } //insert for (int i = 1; i <= 10; i++) { User user = new User((long) i, "insert"); //Integer insertResult = mapper.insertUser(user); int insertResult = sqlSession.insert("com.oceanbase.mapper.IUserMapper.insertUser", user); } //delete int deleteResult = sqlSession.delete("com.oceanbase.mapper.IUserMapper.deleteUser", 1L); //update User updateUser = new User(2L, "update"); int updateResult = sqlSession.update("com.oceanbase.mapper.IUserMapper.updateUser", updateUser); //selectUsers List
@Test public void testAppMapper() throws SQLException, IOException { //mybatis annotation usecases SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml")); SqlSession sqlSession = sqlSessionFactory.openSession(); Statement statement = sqlSession.getConnection().createStatement(); try { statement.execute("drop table test_app"); } catch (SQLException ex) { } finally { statement.execute("create table test_app(id number(20) primary key,name varchar2(100))"); }
IAppMapper mapper = sqlSession.getMapper(IAppMapper.class);
//insert for (int i = 1; i <= 10; i++) { App app = new App((long) i, "insert" + i); Integer insertResult = mapper.insertApp(app); }
//delete Integer deleteResult = mapper.deleteApp(1L); //update App updateApp = new App(2L, "update"); Integer updateResult = mapper.updateApp(updateApp); //commit sqlSession.commit();
//selectApps
List<App> appList = mapper.selectApps();
appList.forEach(System.out::println);
//selectbyPage //set page parameters PageHelper.startPage(2, 3); //selectApps List
sqlSession.close(); } } ```
関連情報
OceanBase Connector/J の詳細については、OceanBase JDBCドライバ をご参照ください。