フロントエンドの 3 番目のモジュールのプロジェクトを覚えていますか。このプロジェクトでは、サーバー API 用の RPG 管理パネルを実装する必要がありました。覚えている人はいると思いますが、マップはサーバー上のストレージとして使用されていました。当然のことながら、現実にはそのようなストレージは使用されず、データベースが使用されます。このプロジェクトの目標は、Hibernate を使用して代替リポジトリ層の実装を作成することです。
このためには次のものが必要です。
- リポジトリからフォークする
- プロジェクトのバージョンをコンピュータにダウンロードします。
- 依存関係を pom.xml に追加します。
- mysql:mysql-connector-java:8.0.30
- org.hibernate: hibernate-core-jakarta: 5.6.11.Final
- Maven ビルドを作成します (mvn clean install)。変更のために、Java バージョン 1.8 を使用します。
- アイデア経由で起動構成を追加します。この項目の実装は、講義https://codegym.cc/quests/lectures/cgu.module3.lecture02 (項目 4)にあります。唯一の違いは、アーティファクトの名前が異なることです。すべてを正しく実行してアプリケーションを起動すると、次のような内容が表示されます。
- ワークベンチで rpg スキーマ作成スクリプトを実行します。
CREATE SCHEMA `rpg` ;
- オプション。どのような動作が予想されるかを確認したい場合は、クラスのコンストラクター パラメーターで
com.game.service.PlayerService
アノテーション値を「db」から「memory」に@Qualifier
変更できます。この場合、Spring は を使用します。テスト後、アノテーションの値を"db"に戻すことを忘れないでください。IPlayerRepository
PlayerRepositoryMemory
@Qualifier
- 必要なすべてのアノテーションをエンティティ クラスに配置します
com.game.entity.Player
。テーブルの名前は「player」、スキーマは「rpg」にする必要があります。enam の場合は、@Enumerated(EnumType.ORDINAL)
注釈に加えて を使用します@Column
。名前フィールドの長さは最大 12 文字、タイトル フィールドの長さは最大 30 文字である必要があることに注意してください。絶対にすべてのフィールドを null にすることはできません。 - class にプライベートの Finalフィールド
PlayerRepositoryDB
を追加し、クラス コンストラクターでこのフィールドを初期化します。通常のタスクと同様にプロパティを使用します (MySQL データベース バージョン 8 を使用します)。興味深いものから - 追加SessionFactory sessionFactory
これにより、テーブルを手動で (または SQL スクリプトの実行によって) 作成する必要がなくなります。properties.put(Environment.HBM2DDL_AUTO, "update");
- すべてのクラスメソッドを実装します。変更するには、次のようにしてみましょう。
- メソッドを実装する
getAll
には、NativeQuery
- メソッドを実装する
getAllCount
には、NamedQuery
- メソッド内で
beforeStop
ysessionFactory
メソッドを呼び出しますclose
。メソッドにアノテーションを付けることで@PreDestroy
、Spring はアプリケーションを停止する前にこのメソッドを呼び出し、これによりすべてのシステム リソースを有効に解放できるようになります。 - 他のメソッドの実装はあなた次第です。ただし、データベースの内容を何らかの方法で変更するメソッドのトランザクションとコミットについては忘れないでください。
- アプリケーションを起動します。すべて正しく行えば、動作するアプリケーションが得られます。しかし、そこにはデータがないため、ワークベンチを通じて (リソースから) init.sqlスクリプトを実行して、データが表示されるようにします。その後、ブラウザで F5 を押して、すべてのメソッドが正しく実装されていることを確認します。
- Hibernate がどのようなクエリを実行するのかを正確に確認するのは興味深いことなので、クエリのログを追加しましょう。これを行うには、p6spy:p6spy:3.9.1依存関係を pom.xml に追加します。リソース フォルダーにファイルspy.propertiesを作成し、次のように指定します。
そして、PlayerRepositoryDB クラスのコンストラクターで、2 つのオプションを変更します。driverlist=com.mysql.cj.jdbc.Driver dateformat=yyyy-MM-dd hh:mm:ss a appender=com.p6spy.engine.spy.appender.StdoutLogger logMessageFormat=com.p6spy.engine.spy.appender.MultiLineFormat
各リクエストのサーバー出力には 2 行が表示されます。1 つ目はどのようなステートメントが準備されるか、2 つ目は挿入されたパラメーターを含むクエリです。properties.put(Environment.DRIVER, "com.p6spy.engine.spy.P6SpyDriver"); properties.put(Environment.URL, "jdbc:p6spy:mysql://localhost:3306/rpg");
これでプロジェクトの準備は完了です。おめでとうございます!
実際、Spring から Hibernate を使用する場合は別のアプローチが使用されます。これについては 5 番目のモジュールで説明します。
プロジェクト分析。
GO TO FULL VERSION