1. ホーム
  2. Java

Mybatisの原理、メリット・デメリット、Hibernateとの比較

2022-02-26 14:40:29

取得元:http://blog.csdn.net/luanlouis/article/details/40422941

MyBatis の参考サイトです。 https://mybatis.github.io/mybatis-3/zh/index.html

MyBatisは、カスタマイズ可能なSQL、ストアドプロシージャ、高度なマッピングをサポートする優れた永続化フレームワークです。MyBatisは、JDBCコードやパラメータの手動設定、結果セットの抽出のほとんどすべてを回避します。MyBatisは、シンプルなXMLやアノテーションを使用して、プリミティブ、マッピングインターフェース、JavaのPOJO(Plain Old Java Objects)を設定し、データベースのレコードにマッピングします。

<スパン プリンシプル詳細

        MyBatisアプリケーションは、XMLの設定ファイルに基づいてSqlSessionFactoryを作成し、設定に従ってSqlSessionFactoryは、2つの場所から構成、1つは設定ファイル、1つはJavaコードの注釈は、SqlSessionを取得することです。SqlSessionは、SQLを実行するために必要なすべてのメソッドが含まれているので、SqlSessionインスタンスを介して直接マッピングされたSQLステートメントを実行し、データの追加、削除、およびトランザクションのコミットなどを完了し、完了したらSqlSessionを閉じることができる。

<スパン 長所

<スパン 1. シンプルで習得しやすい

       mybatisそのものは小さくてシンプルです。サードパーティの依存関係はなく、最もシンプルなインストールでは、2つのjarファイル+いくつかのsqlマッピングファイルの設定だけで済みます。 学びやすく、使いやすく、ドキュメントとソースコードで、その設計思想と実装をより完全に把握することが可能です。

<スパン 2. 柔軟性

<スパン        mybatisは、アプリケーションまたは データベース sqlはxmlで記述され、統一された管理と最適化がなされています。sqlを使えば、基本的にデータアクセスフレームワークを使わずにできることはすべて、もしかしたらそれ以上のこともできるかもしれません。

<スパン 3. プログラムコードからSQLを切り離す

<スパン        DALレイヤーを用意することで、ビジネスロジックとデータアクセスロジックが分離され、システムの設計が明確になり、保守が容易になり、ユニット化が容易になります テスト . sqlとコードが分離されているため、保守性が向上します。

<スパン 4. オブジェクトとデータベース間のormフィールドの関係のマッピングをサポートするマッピングタグの提供
5、オブジェクト関係形成のメンテナンスをサポートするために、オブジェクト関係マッピングタグを提供する。
6. 動的SQLの記述をサポートするxmlタグを提供する。

<スパン デメリット

<スパン 1. SQL文の記述には、特に多くのフィールドと多くの関連するテーブルがある場合、多くの作業が必要である。
2、SQL文はデータベースに依存するため、データベースの移植性が悪く、データベースを変更することができない。

<スパン 3は、フレームワークは、まだ比較的初歩的な、そこにまだ不足している機能は、それがデータバインディングコードを簡素化するが、全体の基礎となるデータベースクエリが実際にまだあなた自身を書くことです、ワークロードも比較的大きく、それは急速なデータベースの変更に適応することは容易ではありません。

<スパン 4. 二次キャッシュの仕組みが悪い

<スパン MyBatisフレームワークの設計

<ブロッククオート <ブロッククオート

注:上の画像は、iteye onの画像を大いに参考にしています。 chenjc_it   が書いたブログ記事 第2回:フレームワークの全体設計の原理分析 chenjc_itのMyBatisアーキテクチャ本体図がとてもよくまとまっていますね、お見事です。

<スパン 1. インターフェース層 - データベースと対話する方法

<ブロッククオート

<スパン MyBatisと データベース は2つの方法で相互作用します。

<スパン a. 従来のMyBatisが提供するAPIを使用する。

<スパン b. Mapperインターフェイスを使用する

1.1. 従来のMyBatis提供のAPIの利用

      これは、従来の配信の ステートメントID とクエリパラメータを SqlSession オブジェクトを使用します。 SqlSession オブジェクトを作成し、データベースとのやりとりを完了させます。 マイバティス は、ユーザーがデータベースのデータ操作を追加、削除、確認するための非常に便利でシンプルなAPIを提供し、接続情報や マイバティス 自身の設定情報に対する保守運用。

<ブロッククオート

      上記の使用方法は マイバティス メソッドを扱うデータベースを作成することです。 SqlSession オブジェクトを作成し、そのオブジェクトを元に ステートメントID とパラメータでデータベースを操作するのは、確かにシンプルで実用的ではあるが、オブジェクト指向言語のコンセプトやインターフェース指向のプログラミングの習慣にはそぐわない。インターフェース指向のプログラミングは、オブジェクト指向の一般的な傾向であるため <スパン マイバティス この流れに対応するため、2回目の使用となる マイバティス インターフェイスのサポート ( インターフェース ) の呼び出しメソッドです。

1.2.使用方法 <スパン マッパー インターフェース

<ブロッククオート <ブロッククオート

<スパン <スパン <スパン <スパン マイバティス 設定ファイルの各項目を組み合わせて <mapper> として抽象化され、ノードは マッパー インタフェースで宣言されたメソッドと同じであり,このインタフェースで宣言されたメソッドは <mapper> ノードを <select|update|delete|insert>。 ノードアイテムに対応する <select|update|delete|insert> ノードの id 値は <スパン マッパー というインタフェース内のメソッド名。 パラメータタイプ の値は マッパー はメソッドの入力型に対応し、一方 結果マップ の値が対応します。 マッパー インターフェースで表される戻り値のタイプ、または結果セットを返す要素のタイプ。

<ブロッククオート

<スパン  によると <スパン マイバティス で設定指定した後 SqlSession.getMapper(XXXMapper.class) メソッドを呼び出すと <スパン マイバティス は、対応するインタフェースで宣言されたメソッド情報に基づいて、動的なプロキシ機構を生成します。 マッパー インスタンスを使用します。 <スパン マッパー インターフェースのメソッドのいずれかが <スパン マイバティス は、このメソッドのメソッド名とパラメータ型に基づいて、このメソッドの ステートメントID 要は SqlSession.select("statementId",parameterObject); または SqlSession.update("statementId",parameterObject); などで、データベースに対する操作を実装しています( この動的な仕組みがどのように実装されているかは、また記事にしたいと思いますので、お楽しみに〜。 )

<スパン <スパン <スパン <スパン <スパン マイバティス 引用元 <スパン <スパン マッパー このようなインターフェースの呼び出し方は、純粋にインターフェース指向のプログラミングのニーズに応えるためです。(もう一つの理由は、インターフェース指向プログラミングによって、ユーザーがインターフェース上のアノテーションを使ってSQL文を構成することができるため、XML構成ファイルから離れ、"0構成"を実現することができるからです).

2. データ処理層

      データ処理層は、以下のように記述することができます。 <スパン <スパン <スパン <スパン マイバティス その核となるのは、大枠では3つの機能を持つことです。

<ブロッククオート

<スパン a. パラメータを渡して動的SQL文を構築する。

b.インターセプターを使用してSQL文を再構築することができます; (追加)

c.SQL文の実行とクエリ結果のカプセル化 リストの統合<E>

2.1. パラメータ・マッピングと動的SQL文の生成

<ブロッククオート

       動的なステートメント生成は、間違いなく、MyBatisフレームワークの非常にエレガントなデザインの1つで、以下のようなものです。 <スパン <スパン <スパン <スパン マイバティス パラメータの値を渡すことで を使って Ognl SQLステートメントを動的に構築する を作る。 <スパン <スパン マイバティス 柔軟性と拡張性に優れています。

パラメータ・マッピングとは ジャワ データ型と ジェイビーシー データ型間の変換:ここには2つのプロセスが含まれます:クエリフェーズでは、java型のデータを受け取り、それを ジェイビーシー を介して渡されるデータの種類を指定します。 preparedStatement.setXXX() の値を設定することである。 結果セット の結果セットを問い合わせる。 jdbcType へのデータ変換 ジャワ データ型です。

<スパン ( MyBatisがどのようにSQL文を動的に構築するかについては、また記事にしたいと思いますので、お楽しみに。 )

2.2. SQL文の実行とクエリ結果のカプセル化統合 List<E>

              動的SQL文が生成された後 <スパン <スパン マイバティス は SQL 文を実行し、返される可能性のある結果セットを リスト<E> リストです。 <スパン <スパン <スパン <スパン <スパン マイバティス 結果セットの処理では、結果セットの関係の1対多、多対1の変換がサポートされており、クエリ文が入れ子になっているクエリと、結果セットが入れ子になっているクエリの2種類のサポートがあります。

3. フレーム支持層

3.1. トランザクション管理機構

          トランザクション管理の仕組みは、以下のような場合に非常に便利です。 ORM また、トランザクション管理機構の品質も オーエム フレームワークの優秀さの基準、データ管理機構については、すでにブログ記事で書いています mybatisの原理をより深く理解する MyBatisトランザクション管理機構 mybatisのトランザクション管理機構については、非常に詳細な議論がなされているので、興味のある読者はクリックしてみてください。

3.2. 接続プール管理機構

データベース接続の作成には多くのリソースを消費するため、データスループットが高く、アクセス数が非常に多いアプリケーションでは、コネクションプールの設計が非常に重要になります。 mybatisの原則 Mybatisデータソースとコネクションプーリングについてより深く理解するために この記事には非常に詳しい説明があるので、興味のある読者はクリックしてみてください。

3.3. キャッシュ機構

データ利用率を向上させ、サーバーやデータベースへの負荷を軽減するために <スパン <スパン <スパン マイバティス は、一部のクエリに対してセッションレベルのデータキャッシュを提供し、クエリを特定の時間帯に SqlSession 許可された時間間隔では、まったく同じクエリに対して <スパン <スパン <スパン マイバティス は、データベースを探す代わりに、キャッシュされた結果を直接ユーザーに返します。 (その MyBatis特有のキャッシュの仕組みについては、また記事にしたいと思いますので、お楽しみに。 )

<スパン   3. 4. SQL文の設定方法

<ブロッククオート

<スパン 伝統的な <スパン <スパン <スパン <スパン <スパン <スパン <スパン <スパン マイバティス 構成 SQL ステートメントのアプローチは、設定にXMLファイルを使用することですが、このアプローチはインターフェース指向プログラミングの概念をあまりサポートしておらず、インターフェース指向プログラミングをサポートするために <スパン <スパン <スパン <スパン マイバティス を導入しました。 マッパー インターフェイスの導入に指向したインターフェイスの概念、アノテーションを使った構成に SQL ステートメントが可能であれば、ユーザーは必要なアノテーションをインターフェイスに追加するだけでよく、また、そのために XML ファイルを作成しましたが、現在の <スパン <スパン <スパン <スパン <スパン マイバティス アノテーションの設定のみ <スパン SQL 文のサポートは限定的で、一部の高度な機能はまだ XML コンフィギュレーションファイルの構成 SQL ステートメントを使用します。


<ブロッククオート

<スパン 4 ブートストラップ層

<ブロッククオート

ブートストラップ層は、設定と起動を行うために <スパン <スパン <スパン <スパン <スパン マイバティス 情報を構成する方法です。 <スパン <スパン <スパン <スパン <スパン <スパン <スパン <スパン マイバティス 2つのリード方法を提供 <スパン <スパン <スパン <スパン <スパン <スパン <スパン <スパン <スパン <スパン マイバティス : XML設定ファイルベースのアプローチと ジャワ API 読者は、私の他のブログの記事を参照してください。 MyBatisによるJavaの永続化3(中国語版) 第2章 MyBatisを導入する


II. MyBatis の主な構成要素とその相互関係

  MyBatisコードの実装の観点から、MyBatisの主なコアコンポーネントは以下の通りです。

<ブロッククオート
  • SqlSession            MyBatisが使用するメインのトップレベルAPIとして、データベースと対話し、必要なデータベースの追加、削除、チェックを行うセッションを表します。
  • 実行者              MyBatisエグゼキュータは、MyBatisスケジューリングの中核であり、SQL文の生成とクエリキャッシュの保守を担当する
  • ステートメントハンドラー   JDBC Statement 操作をカプセル化し、パラメータの設定や Statement の結果セットを List コレクションに変換するなどの JDBC Statement 操作を担当します。
  • ParameterHandler   ユーザーから渡されたパラメータを、JDBCステートメントで必要とされるパラメータに変換する責任を負う。
  • ResultSetHandler    JDBCから返されたResultSet結果セットオブジェクトをList型のコレクションに変換する役割を担う。
  • TypeHandler          Javaデータ型とjdbcデータ型間のマッピングと変換を担当する。
  • マッピングされたステートメント   MappedStatement は、次のような <select|update|delete|insert> ノードのラッパーを維持します。
  • SqlSource            は、ユーザから渡された parameterObject に基づいて SQL 文を動的に生成し、その情報を BoundSql オブジェクトにカプセル化し、そして
  • BoundSql             動的に生成されるSQL文とそれに対応するパラメータ情報を示す。
  • 構成        MyBatis の設定情報は、すべて Configuration オブジェクトで管理されます。

( <スパン 注:これは私が個人的にコアコンポーネントと考えるもののリストですので、これだけがMyBatisのパーツであるという印象は持たないでください (MyBatisに対する理解は人それぞれなので、結果は当然異なりますので、読者の皆さんは疑問や異論をお持ちになるのは大歓迎です)

両者の関係は以下の図の通りです。




III. MyBatisの1つのselectクエリ文から、MyBatisのアーキテクチャ設計を分析する

<ブロッククオート

<スパン I. データの準備(MyBatisを熟知し、適用している読者は、このセクションをさっと読み飛ばしてください。)

<ブロッククオート

<スパン 1. データベースのデータを用意し、EMPLOYEESテーブルを作成し、データを挿入する。      

<ブロッククオート
  1. -- 従業員の基本情報のテーブルを作成する
  2. 作成 テーブル "EMPLOYEES"。 (  
  3. "EMPLOYEE_ID"  NUMBER(6)  ない ヌル ,  
  4. "FIRST_NAME"。  VARCHAR2(20)。  
  5. LAST_NAME"。  VARCHAR2(25)  ない ヌル ,  
  6. "EMAIL"。  VARCHAR2(25)  ない ヌル 一意 ,  
  7. 給与について  NUMBER(8,2)です。  
  8. 制約条件 "EMP_EMP_ID_PK" プライマリー キー  ( "EMPLOYEE_ID" )  
  9.    );  
  10.    コメント  について テーブル  エンプロイーズ  '社員情報フォーム' ;  
  11.    コメント  について コラム  employees.employee_id  '社員ID' ;  
  12.    コメント  について コラム  従業員.first_name  'ファーストネーム' ;  
  13.    コメント  について コラム  従業員.last_name  'ラストネーム' ;  
  14.    コメント  について コラム  従業員.Eメール  '電子メールアドレス' ;  
  15.    コメント  について コラム  社員数.給与  'salary'(サラリー ;  
  16. --データの追加
  17. 挿入 への  従業員 (employee_id、first_name、last_name、email、salary)  
  18.  (100,  'スティーブン' 'キング' ,  <スパン 'スキング' , 24000.00);  
  19. 挿入 への  従業員 (employee_id、first_name、last_name、email、salary)  
  20.  (101,  'ニーナ' 'コチャール' 'NKOCHHAR' , 17000.00);  
  21. 挿入 への  従業員 (employee_id、first_name、last_name、email、salary)  
  22.  (102,  'レックス' 'デ・ハーン' 'LDEHAAN' , 17000.00);  
  23. 挿入 への  従業員 (employee_id、first_name、last_name、email、salary)  
  24.  (103,  'アレクサンダー' 'フノルド' ,  <スパン 'AHUNOLD' , 9000.00);  
  25. 挿入 への  従業員 (employee_id、first_name、last_name、email、salary)  
  26.  (104,  'ブルース' 'エルンスト' 'BERNST' , 6000.00);  
  27. 挿入 への  従業員 (employee_id、first_name、last_name、email、salary)  
  28.  (105,  'デビッド' 'オースティン' 'DAUSTIN' , 4800.00);  
  29. 挿入 への  従業員 (employee_id、first_name、last_name、email、salary)  
  30.  (106,  'ヴァリ' 'パタバラ' 'VPATABAL' , 4800.00);  
  31. 挿入 への  従業員 (employee_id、first_name、last_name、email、salary)  
  32.  (107,  'ダイアナ' 'ローレンツ' 'DLORENTZ' , 4200.00);      

<ブロッククオート

2. Mybatis設定ファイル(ファイル名:mybatisConfig.xml)を設定する。

<ブロッククオート
[html】をご覧ください。] 表示プレーン コピー 印刷 ?
  1. <? xml バージョン = "1.0" エンコーディング = "utf-8"。 ? >
  2. <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN".PUBLIC "-/mybatis.org//DTD Config 3.0/EN"  
  3. "http://mybatis.org/dtd/mybatis-3-config.dtd"。 >
  4. <スパン < 構成 >
  5. <スパン < 環境 デフォルト = "development"。 >
  6. <スパン < 環境 イド = <スパン "開発" >
  7. <スパン < トランザクションマネージャ タイプ = "JDBC"。 />
  8. <スパン < データソース タイプ = <スパン "POOLED"。 >
  9. <スパン < プロパティ 名前 = <スパン "ドライバー" = oracle.jdbc.driver.OracleDriver" />
  10. <スパン < プロパティ 名前 = "url"。 = jdbc:oracle:thin:@localhost:1521:xe" />
  11. <スパン < プロパティ 名前 = <スパン "ユーザー名" = <スパン ルイ&クォーツ。 />
  12. <スパン < プロパティ 名前 = <スパン パスワード"quot; = <スパン 123456" />
  13. </ データソース >
  14. <スパン </ 環境 >
  15. <スパン </ 環境 >
  16. <スパン < マッパー >
  17. <スパン < マッパー リソース = "com/louis/mybatis/domain/EmployeesMapper.xml"。 />
  18. </ マッパー >
  19. <スパン </ 構成 >
<ブロッククオート

3. Employee エンティティBean を作成し、Mapper 構成ファイルを構成する。

  1. パッケージ  com.louis.mybatis.model。  
  2. インポート  java.math;  
  3. 公開 クラス  社員 {  
  4. プライベート  EmployeeId(整数)。  
  5. プライベート  文字列 firstName;  
  6. プライベート  文字列 lastName;  
  7. プライベート  文字列のEメール。  
  8. プライベート  給料をBigDecimalで表示します。  
  9. 公開  Integer getEmployeeId() {。  
  10. 戻る  employeeId。  
  11.     }  
  12. 公開 ボイド  setEmployeeId(Integer employeeId) {。  
  13. これ .employeeId = employeeId。  
  14.     }  
  15. 公開  文字列getFirstName() {  
  16. 戻る  firstName;  
  17.     }  
  18. 公開 ボイド  setFirstName(String firstName) {。  
  19. これ .firstName = firstName;  
  20.     }  
  21. 公開  文字列 getLastName() {  
  22. 戻る  lastName;  
  23.     }  
  24. 公開 ボイド  setLastName(String lastName) {。  
  25. これ .lastName = lastName;  
  26.     }  
  27. 公開  文字列 getEmail() {  
  28. 戻る  電子メールを送信します。  
  29.     }  
  30. 公開 ボイド  setEmail(String email) {  
  31. これ .email = email;  
  32.     }  
  33. 公開  BigDecimal getSalary() { {.  
  34. 戻る  の給与が支払われます。  
  35.     }  
  36. 公開 ボイド  setSalary(BigDecimal サラリー) { {...  
  37. これ .salary = salary;  
  38.     }  
  39. }  

[html】をご覧ください。] 表示プレーン コピー 印刷 ?
  1. <? xml バージョン = "1.0" エンコーディング = "UTF-8"。 ? >
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0/EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"。  >
  3. <スパン < マッパー 名前空間 = com.louis.mybatis.dao.EmployeeMapper".EmployeeMapper.EmployeeMapper。 >
  4. <スパン < 結果マップ イド = BaseResultMap"。 タイプ = com.louis.mybatis.model.Employee" >
  5. <スパン < イド = "EMPLOYEE_ID"。 プロパティ = employeeId" jdbcType = DECIMAL" />
  6. <スパン < 結果 = <スパン "FIRST_NAME"。 プロパティ = "firstName" jdbcType = VARCHAR"

    />
  7. <スパン < 結果 = <スパン "LAST_NAME"。 プロパティ = "lastName"。 jdbcType = VARCHAR"

    />
  8. <スパン < 結果 = <スパン "EMAIL"。 プロパティ = "メール" jdbcType = VARCHAR"

    />
  9. <スパン < 結果 = <スパン "SALARY"。 プロパティ = "salary"。 jdbcType = DECIMAL" />
  10. </ 結果マップ >
  11. <スパン < セレクト イド = selectByPrimaryKey" 結果マップ = "BaseResultMap"。 パラメータタイプ = "java.lang.Integer" >
  12.     セレクト   
  13.         従業員ID、名、姓、Eメール、給与  
  14.         LOUIS.EMPLOYEESより  
  15.         ここで  <スパン EMPLOYEE_ID  = #{employeeId, <スパン JdbcType = DECIMAL }  
  16. </ セレクト >
  17. <スパン </ マッパー >

<ブロッククオート

4. eclipse または myeclipse の maven プロジェクトを、以下の maven 設定で作成します。

<ブロッククオート
[html】をご覧ください。] 表示プレーン コピー 印刷 ?
  1. < プロジェクト xmlns = <スパン "http://maven.apache.org/POM/4.0.0"。 xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"。
  2. xsi:schemaLocation = <スパン "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"。 >
  3. <スパン < モデルバージョン > 4.0.0 <スパン </ モデルバージョン >
  4. <スパン < グループID > バチス </ グループID >
  5. <スパン < アーティファクトId > バチス </ アーティファクトId >
  6. <スパン < バージョン > 0.0.1-SNAPSHOT <スパン </ バージョン >
  7. <スパン < パッケージング > ジャー </ パッケージング >
  8. <スパン < 名称 > バチス </ 名称 >
  9. <スパン < url > http://maven.apache.org </ url >
  10. <スパン < プロパティ >
  11. <スパン < project.build.sourceEncoding > UTF-8 </ project.build.sourceEncoding >
  12. <スパン </ プロパティ