この記事はWeChatの公開アカウント「Uncle Who Knows a Little Code」から転載したもので、著者はUncle Who Knows a Little Codeです。この記事を転載する場合は、Uncle Who Knows Codeの公式アカウントまでご連絡ください。 1 プレコンセプト 01 粘り強さ 永続性とは、ディスクなどの永続的に保存できるストレージ デバイスにデータを保存することを意味します。 02 JDBC Java を学習する場合、ほとんどのプログラマーは、Java を使用してデータベースにアクセスする方法を学ぶときに、最初に JDBC を学習します。 JDBC は、SQL ステートメントを実行し、データベースへの統一されたアクセスを提供し、データベースにデータを「保持」するために使用される Java API です。 簡単に説明しましょう (JDBC についてある程度の知識がある方は読み飛ばしてください)。 Sun は 1998 年に JDK1.1 をリリースしました。JDBC はこのバージョンにおける重要な技術ポイントです。 Java 言語を使用してデータベースに接続する場合、通常は、Sun がデータベースへの接続方法と SQL ステートメントの実行方法を実現すると考えられています。しかし、市場にはデータベースが多すぎて、データベース間の違いも非常に大きくなっています。さらに、Sun が各データベースの内部詳細を理解することは不可能です... Java コードがデータベースにうまく接続できるようにするために、Sun は一連のインターフェースを開発しました。インターフェースと呼ばれていますが、実際には一連の標準と仕様です。コードの具体的な実装は各データベースベンダーによって作成されます。したがって、私たちがよく呼ぶ「ドライバー クラス」は、各ベンダーの実装クラスです。 したがって、JDBC を使用してデータベースに接続する場合、最初のステップはドライバーを登録すること、つまり、使用するデータベース実装クラスを JVM に指示することです。 03 オーム ORM フレームワークが登場する前は、次のようにデータベースを操作していました。 JDBC を使用してデータベースを操作する場合、コードが煩雑になり、SQL のパラメータのスペルにエラーが発生しやすくなり、読みやすさが悪くなるため、コードのメンテナンスが難しくなることがわかります。 ORM フレームワークを使用すると、データベースを次のように操作します。 ORM フレームワークは、Java オブジェクトとデータベース テーブル間のマッピングを作成し、データベース アクセスの詳細をカプセル化します。データベースステートメントを操作する必要がある場合は、Java オブジェクトを直接操作できます。 2. Spring BootはMyBatisを統合する Java でよく使用される ORM フレームワークには、Hibernate、MyBatis、JPA などがあります。次のテキストでは、これらのフレームワークの長所と短所を比較します。この章では、主に、Spring Boot プロジェクトに MyBatis を統合してデータベースにアクセスする方法について説明します。 ステップ1.依存関係を追加する
ステップ2. データベースリンクを構成する application.yml ファイルでデータベース関連情報を構成します。
ステップ3. データベースリンクを構成する ローカル データベースで、ユーザー テーブルを作成し、データを挿入します。
ステップ4. モデルレイヤーを作成する 通常、データベースからデータを受け取るオブジェクトの場合は、別のモデル パッケージを作成し、クラス内の属性とフィールドを同じに保つことに慣れています。
ステップ5. Daoレイヤーを作成する 通常、データベースを直接処理するコードは、すべてのデータ アクセス ロジックが配置されている DAO レイヤー (データ アクセス オブジェクト) に配置します。 新しい dao パッケージを作成し、その下に新しい **interface** を作成します。これはインターフェースであることに注意してください。
ここでもう少しだけ言わせてください! 技術的な観点から見ると、モデル内の属性はテーブル内のフィールドとは異なる場合があります。たとえば、データベースに [mobilephone] という携帯電話番号フィールドを追加します。
User.java に [telephone] というフィールドを追加します。 [telephone] がデータベース内の [mobilephone] に対応していることはわかっていますが、これら 2 つのフィールドが対応していることを Mybatis に知らせるにはどうすればよいでしょうか。いくつかの方法があります: 01. SQL ステートメントで制御し、異なる名前のフィールドにエイリアスを付与します。
02. @Results タグを使用して、異なる設定を持つプロパティとフィールドをマップします (同じ名前のものは省略できます)。
ただし、モデル クラスを記述するときには、属性をテーブル内のフィールドとまったく同じに保つことをお勧めします。これにより、コードの複雑さが軽減されるだけでなく、コードの可読性が大幅に向上し、エラーの可能性も減ります。 質問がある生徒もいるかもしれません。多くのプロジェクトのデータ構造設計はそれほど標準化されていません。たとえば、フィールド名は flag01、flag02 など、非常に奇妙な名前になる場合があります。このようなフィールドがデータベースから照会され、インターフェースを通じて返されると、インターフェースの読みやすさが極端に悪くなるでしょうか? 通常、モデルの内容を直接パッケージ化して返すことはありません。多くのモデルはデータベースと Java オブジェクト間のマッピングであり、通常、データ転送には DTO が必要です。データベースからデータをクエリし、それをモデルに格納します。インターフェイスでデータを返す前に、モデルを DTO に変換し、DTO 内の属性の標準化と意味の明確化を確保する必要があります。 ステップ6. サービス層を作成する これで、プロジェクトには、データにアクセスするための Dao レイヤーと、ユーザー提供のインターフェース アクセスを提供するためのコントローラー レイヤーが追加されました。では、コントローラーは Dao 内のメソッドを直接呼び出すことができるのでしょうか?直接電話しないほうがいいですよ! 通常、ビジネス ロジックを保存するためにサービス レイヤーを作成します。現時点での完全な呼び出しプロセスは次のとおりです。 コントローラー - サービス - Dao Service パッケージを作成したら、その中に UserService を作成します。
ステップ7. コントローラー層にインターフェースを追加する ユーザー ID で顧客情報を照会し、顧客情報を返すインターフェースを追加します。
ステップ8. テストと検証 デバッグやテストのためにブラウザまたはクライアントのインターフェースにアクセスし、顧客情報を照会できます。
03MyBatisのその他の操作 キーコードのみが提供されます。完全なコードについては、この章のプロジェクト コードを参照してください。 01. 追加
02. 変更
03. 削除
4. コードの改善 上記では、Spring Boot と MyBatis の最も単純な統合が完了し、CRUD 用にデータベースを正常に読み取ることができるようになりました。ただし、これは最も単純な統合であるため、次のような改善が必要な詳細がいくつかあります。 パラメータはすべて URL に表示されます。 Object.toString() を直接返しますが、これはあまり使いやすくありません。 データが見つからなかったか例外が発生し、特別な処理は行われませんでした。 少しずつ改善していきましょう 01. JsonをパラメータとしてPostリクエストを送信する RESTful スタイルに厳密に従う場合は、次の点に従う必要があります。 クエリ: GET /url/xxx 新規: POST /url 変更: PUT /url/xxx 削除: DELETE /url/xxx ここでは単純に URL にパラメータを記述することでパラメータの内容を一目で確認しやすく、パラメータが増えると URL が長くなりすぎるため、通常は Json をパラメータとして使用して Post リクエストを送信することに慣れています。たとえば、新しいユーザーを追加するためのインターフェースは次のように記述できます。 新しい DTO パッケージを追加し、新しい UserDTO を作成します。
ユーザー インターフェイスが追加されました:
インターフェースを呼び出してテストしてみましょう:
02. 標準化された戻りパラメータ Object.toString() を直接返しますが、これはあまり使いやすくありません。 コード (ステータス コード)、メッセージ (例外情報の説明)、データ (データ) を含む単純な戻り参照オブジェクトを設計してみましょう。
コードについては、Http ステータス コードを参照し、よく使用されるコードをいくつか使用します。
今回は、クエリ インターフェースを書き直してみましょう。
呼び出し結果には、カプセル化された戻りパラメータが表示されます。これは、はるかに標準化されているようです。
03. 例外処理 コードの実行中に例外が発生した場合、どのように処理すればよいでしょうか?例外情報はフロントエンドに直接返されるべきでしょうか?これは発信者にとってあまり親切ではありません。通常、エラー ログをローカルに出力し、呼び出し元に例外ステータス コードを返します。 サービス層と Dao 層の統合は上向きに行われます。
コントローラー層で例外をキャッチし、戻りパラメータをカプセル化します。
4MyBatis よくある質問 01. MyBatis が半自動 ORM フレームワークと呼ばれるのはなぜですか? 半自動もあれば、全自動もあるでしょう。 Hibernate は完全に自動化された ORM フレームワークです。 Hibernate を使用すると、オブジェクトリレーショナル モデルに完全に従って操作できるため、Java オブジェクトを操作するために SQL を記述する必要がなく、完全に自動化されます。一方、MyBatis では、オブジェクトを関連付けるときに SQL ステートメントを手動で記述する必要があるため、「半自動」と呼ばれます。 02. 注釈か XML か? MyBatis を使用するほとんどのプロジェクトでは、SQL ステートメントを構成するために XML が使用されていますが、このコースの例ではすべてアノテーションが使用されていると思います。では、この2つの違いは何でしょうか?実際の開発ではどのように選択するのでしょうか? まず、アノテーションを使用して動的 SQL を接合することがより困難であるため、公式には XML を使用することが推奨されています。 SQL がより複雑で、複数のテーブルの関連付けが必要な場合は、XML を使用する方が適切です。そして現在では、MyBatis XML を自動的に生成できるプラグインが数多く存在します。 しかし、コインには常に表と裏がある。複雑な SQL は誇るべきものではありません。複雑な SQL を使用せずにプロジェクトを実行できる場合は、アノテーションを使用する方が適しています (現在のプロジェクトの SQL の 95% 以上は単一テーブル クエリです)。 03. #{} と ${} の違いは何ですか? ${} は文字列の置換、#{} はコンパイル前の処理です。 #{} を使用すると、SQL インジェクションを防ぎ、システムのセキュリティを向上できます。 04. バッチ挿入を行うにはどうすればいいですか? アノテーション メソッドでは動的 SQL も使用できます。
Spring Boot は MyBatis を統合して、データベースの追加、削除、クエリ、および変更操作を実行します。これは比較的基本的な知識であり、Java を初めて使用する人にとって役立つことを願っています。 |
<<: JVMはオブジェクトが死んだと判断し、GCリサイクルを検証します。
>>: 2021 年に、エッジ コンピューティングという収益性の高いビジネスを発見したのは誰でしょうか?
多くのベンダーがアプリケーションの近代化を推進しています。しかし、CIO はこれをどの程度うまく実行...
仮想化は、通常、実際のベースではなく仮想ベースで実行されるコンピューティング要素を指す広い用語です。...
ウェブサイトの最適化は、多くの分野からなる非常に包括的なタスクです。しかし、最も基本的な最適化作業と...
中国国際放送、北京、12月30日(記者 費磊)国家著作権局と新聞出版総局は本日、2011年動画ウェブ...
新しいウェブマスターでも、古いウェブマスターでも、ウェブサイトを最適化するときに、多くの人は基本的に...
HTML コードで marquee 要素を使用すると、スクロールするテキスト サブタイトルを作成でき...
加速クラウドの山東省棗荘データセンターの高防御クラウドサーバーがセール中です。直接価格を50元引き下...
記者は1月17日、テンセントの内部情報筋から、テンセントクラウドが最近、本格的なインターネット金融チ...
まず、オンプレミスと同じアーキテクチャを使用して、レンタルベースでクラウドで実行することで、同じ機能...
「レスポンシブ」と「セルフサービス Web サイト構築」という、もともと異なる 2 つの要素はどのよ...
ユーザーがキーワードを検索するときに最初に比較するのは、Web サイトのタイトルです。ユーザーはタイ...
今年は私たちウェブマスターにとって大変な年です。外部リンクを貼るのが難しいだけでなく、検索エンジンに...
最近、IDC は、IDC が定義した 18 のエンタープライズ ワークロード セグメントを含む、グロ...
InceptionHosting は、非常に信頼性の高い品質を備えた VPS プロバイダーです。その...
月収10万元の起業の夢を実現するミニプログラム起業支援プラン前回の記事では、ステーショングループの遊...