Mybatisの原理、メリット・デメリット、Hibernateとの比較
取得元:http://blog.csdn.net/luanlouis/article/details/40422941
MyBatis の参考サイトです。 https://mybatis.github.io/mybatis-3/zh/index.html
<スパン プリンシプル詳細
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テーブルを作成し、データを挿入する。
<ブロッククオート- -- 従業員の基本情報のテーブルを作成する
- 作成 テーブル "EMPLOYEES"。 (
- "EMPLOYEE_ID" NUMBER(6) ない ヌル ,
- "FIRST_NAME"。 VARCHAR2(20)。
- LAST_NAME"。 VARCHAR2(25) ない ヌル ,
- "EMAIL"。 VARCHAR2(25) ない ヌル 一意 ,
- 給与について NUMBER(8,2)です。
- 制約条件 "EMP_EMP_ID_PK" プライマリー キー ( "EMPLOYEE_ID" )
- );
- コメント について テーブル エンプロイーズ は '社員情報フォーム' ;
- コメント について コラム employees.employee_id は '社員ID' ;
- コメント について コラム 従業員.first_name は 'ファーストネーム' ;
- コメント について コラム 従業員.last_name は 'ラストネーム' ;
- コメント について コラム 従業員.Eメール は '電子メールアドレス' ;
- コメント について コラム 社員数.給与 は 'salary'(サラリー ;
- --データの追加
- 挿入 への 従業員 (employee_id、first_name、last_name、email、salary)
- 値 (100, 'スティーブン' , 'キング' , <スパン 'スキング' , 24000.00);
- 挿入 への 従業員 (employee_id、first_name、last_name、email、salary)
- 値 (101, 'ニーナ' , 'コチャール' , 'NKOCHHAR' , 17000.00);
- 挿入 への 従業員 (employee_id、first_name、last_name、email、salary)
- 値 (102, 'レックス' , 'デ・ハーン' , 'LDEHAAN' , 17000.00);
- 挿入 への 従業員 (employee_id、first_name、last_name、email、salary)
- 値 (103, 'アレクサンダー' , 'フノルド' , <スパン 'AHUNOLD' , 9000.00);
- 挿入 への 従業員 (employee_id、first_name、last_name、email、salary)
- 値 (104, 'ブルース' , 'エルンスト' , 'BERNST' , 6000.00);
- 挿入 への 従業員 (employee_id、first_name、last_name、email、salary)
- 値 (105, 'デビッド' , 'オースティン' , 'DAUSTIN' , 4800.00);
- 挿入 への 従業員 (employee_id、first_name、last_name、email、salary)
- 値 (106, 'ヴァリ' , 'パタバラ' , 'VPATABAL' , 4800.00);
- 挿入 への 従業員 (employee_id、first_name、last_name、email、salary)
- 値 (107, 'ダイアナ' , 'ローレンツ' , 'DLORENTZ' , 4200.00);
<ブロッククオート
2. Mybatis設定ファイル(ファイル名:mybatisConfig.xml)を設定する。
<ブロッククオート- <? xml バージョン = "1.0" エンコーディング = "utf-8"。 ? >
- <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN".PUBLIC "-/mybatis.org//DTD Config 3.0/EN"
- "http://mybatis.org/dtd/mybatis-3-config.dtd"。 >
- <スパン < 構成 >
- <スパン < 環境 デフォルト = "development"。 >
- <スパン < 環境 イド = <スパン "開発" >
- <スパン < トランザクションマネージャ タイプ = "JDBC"。 />
- <スパン < データソース タイプ = <スパン "POOLED"。 >
- <スパン < プロパティ 名前 = <スパン "ドライバー" 値 = oracle.jdbc.driver.OracleDriver" />
- <スパン < プロパティ 名前 = "url"。 値 = jdbc:oracle:thin:@localhost:1521:xe" />
- <スパン < プロパティ 名前 = <スパン "ユーザー名" 値 = <スパン ルイ&クォーツ。 />
- <スパン < プロパティ 名前 = <スパン パスワード"quot; 値 = <スパン 123456" />
- </ データソース >
- <スパン </ 環境 >
- <スパン </ 環境 >
- <スパン < マッパー >
- <スパン < マッパー リソース = "com/louis/mybatis/domain/EmployeesMapper.xml"。 />
- </ マッパー >
- <スパン </ 構成 >
3. Employee エンティティBean を作成し、Mapper 構成ファイルを構成する。
<ブロッククオート
- パッケージ com.louis.mybatis.model。
- インポート java.math;
- 公開 クラス 社員 {
- プライベート EmployeeId(整数)。
- プライベート 文字列 firstName;
- プライベート 文字列 lastName;
- プライベート 文字列のEメール。
- プライベート 給料をBigDecimalで表示します。
- 公開 Integer getEmployeeId() {。
- 戻る employeeId。
- }
- 公開 ボイド setEmployeeId(Integer employeeId) {。
- これ .employeeId = employeeId。
- }
- 公開 文字列getFirstName() {
- 戻る firstName;
- }
- 公開 ボイド setFirstName(String firstName) {。
- これ .firstName = firstName;
- }
- 公開 文字列 getLastName() {
- 戻る lastName;
- }
- 公開 ボイド setLastName(String lastName) {。
- これ .lastName = lastName;
- }
- 公開 文字列 getEmail() {
- 戻る 電子メールを送信します。
- }
- 公開 ボイド setEmail(String email) {
- これ .email = email;
- }
- 公開 BigDecimal getSalary() { {.
- 戻る の給与が支払われます。
- }
- 公開 ボイド setSalary(BigDecimal サラリー) { {...
- これ .salary = salary;
- }
- }
- <? xml バージョン = "1.0" エンコーディング = "UTF-8"。 ? >
- <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0/EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"。 >
- <スパン < マッパー 名前空間 = com.louis.mybatis.dao.EmployeeMapper".EmployeeMapper.EmployeeMapper。 >
- <スパン < 結果マップ イド = BaseResultMap"。 タイプ = com.louis.mybatis.model.Employee" >
- <スパン < イド 列 = "EMPLOYEE_ID"。 プロパティ = employeeId" jdbcType = DECIMAL" />
- <スパン < 結果 列 = <スパン "FIRST_NAME"。 プロパティ = "firstName" jdbcType = VARCHAR" />
- <スパン < 結果 列 = <スパン "LAST_NAME"。 プロパティ = "lastName"。 jdbcType = VARCHAR" />
- <スパン < 結果 列 = <スパン "EMAIL"。 プロパティ = "メール" jdbcType = VARCHAR" />
- <スパン < 結果 列 = <スパン "SALARY"。 プロパティ = "salary"。 jdbcType = DECIMAL" />
- </ 結果マップ >
- <スパン < セレクト イド = selectByPrimaryKey" 結果マップ = "BaseResultMap"。 パラメータタイプ = "java.lang.Integer" >
- セレクト
- 従業員ID、名、姓、Eメール、給与
- LOUIS.EMPLOYEESより
- ここで <スパン EMPLOYEE_ID = #{employeeId, <スパン JdbcType = DECIMAL }
- </ セレクト >
- <スパン </ マッパー >
4. eclipse または myeclipse の maven プロジェクトを、以下の maven 設定で作成します。
<ブロッククオート- < プロジェクト 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"。 >
- <スパン < モデルバージョン > 4.0.0 <スパン </ モデルバージョン >
- <スパン < グループID > バチス </ グループID >
- <スパン < アーティファクトId > バチス </ アーティファクトId >
- <スパン < バージョン > 0.0.1-SNAPSHOT <スパン </ バージョン >
- <スパン < パッケージング > ジャー </ パッケージング >
- <スパン < 名称 > バチス </ 名称 >
- <スパン < url > http://maven.apache.org </ url >
- <スパン < プロパティ >
- <スパン < project.build.sourceEncoding > UTF-8 </ project.build.sourceEncoding >
- <スパン </ プロパティ
関連
-
Git Pull Failed マージされていないファイルがあるため、Pull できません。
-
java マイクロソフト払い戻し予期せぬサーバーからのファイルの終了
-
配列定数は初期化子でのみ使用可能です。
-
Java の double データ型における 0.0 と -0.0 の問題
-
アクセス制限の解決方法: ---- in Java
-
htmlとwordの相互変換の実装(画像あり)
-
ロンボク版問題による血の海を思い出せ
-
スプリング】豆の自動組立
-
Java の例外 #クラスパスが複数の SLF4J バインディングを含んでいます。
-
ローカルホストへの接続に失敗しました。[08001] データベースサーバーへの接続を作成できませんでした。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Springの設定でxsdファイルのバージョン番号を設定しない方が良い理由
-
Solve モジュールのビルドに失敗しました。Error: ENOENT: no such file or directory エラー
-
ajax コミット リソースの読み込みに失敗しました: サーバーはステータス 400 で応答しました ()
-
強制型変換について
-
名前 'XXX' を持つ Bean の作成に失敗しました。自動依存関係の注入に失敗しました 解決方法
-
List list = new ArrayList(); Error: ArrayList は型に解決できません。
-
linux ant Resolve error: main class not found or couldn't be loaded org.apache.tools.ant.launcher.
-
JSoupは、新バージョンの正方学務システム(イントラネット-学務システム)にログインし、情報処理の詳細をクロールするシミュレーションを行います。
-
ソケット java.net.SocketException: 接続リセットエラーの原因と対処法
-
コレクション - クラス関係図