深入浅出MyBatis:JDBCとMyBatis紹介
最近は産休に付き添い、時間がバラバラで、2冊の本を読む準備が充実しています.1冊は「MyBatis:技術原理と実践を深く理解する」、1冊は「RabbitMQ実戦:分散型メッセージキューの効率的な配置」で、記憶と理解を深めるために、整理、拡張、記録を行います.
読書の目標はすべての細部を覚えることではなく、全体的に一つの技術が何ができるか、含む特性、基本モジュール、実現原理とよくある使用シーンを理解することです.
本編はMyBatis書籍の第1編を分かち合い、まずJDBCの関連概念を思い出し、Javaが提供するデータベースへのアクセスの最も基本的な方法を理解し、それからMyBatisの基本的な特性とコアコンポーネントを紹介し、最後に本書の全体構造を述べ、後続の文章の大まかな内容を理解する.
JDBC関連概念
JavaプログラムはすべてJDBCを通じてデータベースに接続して、SQLを通じてデータベースに対してプログラミングして、JDBCはSUN会社が提出したいくつかの列の規範で、インタフェースの規範だけを定義して、具体的な実現は各データベースのメーカーが実現して、それは1種の典型的なブリッジのモードです.
ブリッジモードは構造型設計モードであり、その主な特徴は抽象と行為実現を分離し、それぞれインタフェースを定義し、各部分の独立性を維持し、彼らの機能拡張に対応することができる.
JDBC仕様
スペシフィケーションとは、標準インタフェースを自分で定義し、Connectionでデータベースとの接続を表し、StatementでSQLを実行し、ResultSetでSQLが返す結果を表し、データの便利さを提供するという抽象的なものです.ConnectionからStatementを作成し、Statementがクエリーを実行してResultSetを取得します.
上記のConnection、Statement、ResultSetは、各データベース・プロバイダが提供するインタフェースであるべきです.規範があれば、統一されたインタフェースを通じて、多種のタイプのデータベースにアクセスすることができて、勝手にデータベースを切り替えることができます.
データベースドライバ
前述したように,インタフェースの実装は各メーカーから提供されるため,実装クラスのクラス名が統一されず,Connectionオブジェクトを作成すると,ある実装クラスがコードに書き込まれてしまい,データベースを切り替える際にコードを修正する必要があるため,あまりよくない.この問題を解決するために,Driver駆動の概念を抽象化した.
各データベースはDriverインタフェースを実装する必要があり、Driverによってデータベース接続接続接続接続接続が得られ、反射メカニズムによって動的に作成されます.
同じプログラムで異なるデータベースにアクセスし、ドライバをDriverManagerで管理することができます.Driverは初期化時にDriverManagerに登録する必要があります.
DriverManagerは、データベース接続を確立するためのgetConnectionメソッドを提供します.
複数のデータベースドライバがある場合、DriverManagerでどのように区別するかは、mysqlなどのデータベース接続urlで指定する必要があります.jdbc:mysql接頭辞を追加する必要があります.
データソース
データソースDataSourceには、接続プールと接続プール管理の2つの部分が含まれており、一般的には接続プールと呼ばれています.システムが初期化されると、データベース接続がオブジェクトとしてメモリに格納され、データベースにアクセスする必要がある場合は、確立された空き接続オブジェクトが接続プールから取り出されます.
データ・ソースを使用して、データベース接続を動的に取得するDataSourceオブジェクトを取得します.また、DataSourceオブジェクトは名前サービス(JNDI)に登録することができ、名前サービスによってDataSourceオブジェクトを取得することができ、ハードコーディング駆動を必要としない.
DriverManagerはJDBC 1が提供し、DataSourceはJDBC 2が追加した機能であり、データソースへの接続方法をよりよく提供しています.
HibernateとMyBatisの比較
以上の説明により、従来のJDBCプログラミングはデータベースに接続する機能をもたらしたが、その作業量は比較的大きく、まず接続し、その後JDBCの下位トランザクションを処理し、データ型を処理し、発生する可能性のある異常をキャプチャ処理し、適切にソースを閉じる.
実際の作業では,JDBCを用いたプログラミングは少なく,データベースデータとPOJOオブジェクトの相互マッピングを主に解決するORMモデルを提案した.
HibernateとMybatisはいずれもORMモデルであり,Hibernateは全表マッピングのモデルを提供し,JDBCのパッケージング程度が比較的高い.しかし、Hibernateにも多くの欠点があり、以下のように列挙されています.全テーブルマッピングは、更新時にすべてのフィールドを送信する必要があるなどの不便をもたらす. は異なる条件によって異なるSQLを組み立てることができない. マルチテーブル関連と複雑なSQLクエリーのサポートが悪いので、自分でSQLを書く必要があります.戻ってきたら、自分でデータをPOJOに組み立てる必要があります. はストレージプロセスを有効にサポートできません. はHQLがありますが、性能が悪く、大規模なインターネットシステムはSQLを最適化する必要がありますが、Hibernateはできません.
大規模なインターネット環境の中で、柔軟性、SQLの最適化、データの伝達を減らすのが最も基本的な最適化方法で、Hibernateは要求を満たすことができなくて、MyBatisはあなたに柔軟性、便利な方式をあげて、1つの半自動マッピングのフレームワークです.
MyBatisはPOJO、SQL、マッピング関係を手動でマッチングする必要がありますが、全テーブルマッピングのHibernateはPOJOとマッピング関係を提供するだけです.
MyBatisは動的SQLを構成することができ、Hibernateのテーブル名が時間によって変化し、条件によって以下に明らかに異なる問題を解決することができる.SQLを最適化し、構成によってSQLマッピングルールを決定したり、ストレージ・プロシージャをサポートしたりすることができ、複雑でパフォーマンスを最適化する必要があるSQLのクエリーに便利です.
コアコンポーネント
コアコンポーネントには、主に次のものが含まれます. SqlSessionFactoryBuilder:構成情報またはコードに基づいてSqlSessionFactoryが生成されます. SqlSessionFactory:工場に依存してSqlSessionを生成する; SqlSession:SQLを送信して実行し、結果を返すことも、Mapperを取得することもできるインタフェースです. SQL Mapper:MyBatisが新しく設計したコンポーネントで、JavaインタフェースとXMLファイルで構成されており、対応するSQLとマッピングルールが必要です.SQLを送信して実行し、結果を返します.
SqlSessionFactoryの構築
各MyBatisアプリケーションは、SqlSessionFactoryのインスタンスを中心としており、そのタスクはSqlSessionの作成です.SqlSesionはJDBCのConnectionオブジェクトに似ています.
SqlSessionFactoryを作成するには、2つの方法があります.1つはXML構成の方法で、1つはコードの方法で、XML構成の使用を推奨します.
mybatis-config.xmlファイルを定義するには、次の手順に従います.
SqlSessionFactoryの作成
SqlSessionの作成
SqlSessionはインタフェースクラスで、プレイヤーの顔の役割を果たし、本当に働いているのはExecutorインタフェースです.使い切るたびに正常に閉じることを保証する必要があります.
マッパー
マッパーは、JavaインタフェースとXMLファイル(または注釈)で構成され、次のように機能します.パラメータタイプ を定義するは、キャッシュ を記述する. SQL文 の説明クエリー結果とPOJOのマッピング関係を定義する まず、Javaインタフェースを定義します.
次に、マッピングXMLファイル、RoleMapper.xmlを定義します.
POJOオブジェクトRoleの定義は比較的簡単で、リストされません.{id}はこのSQLのパラメータであり、SQL列の別名とPOJOの属性名が一致しているため、この文のクエリ結果がロール属性に自動的にマッピングされます.これが自動マッピングです.
クエリーの実行
コンポーネントライフサイクル
SqlSessionFactoryは、MyBatisアプリケーションのライフサイクル全体で、各データベースに1つのSqlSessionFactoryしか対応しておらず、ツールクラスを実装して、オブジェクトを一例のモードで取得することができます.
SqlSessionのライフサイクルは、データベースにトランザクションの処理を要求する過程で、スレッドが安全ではないオブジェクトであり、マルチスレッドに関連する場合は特に注意してください.複数のSQLを実行し、トランザクションの一貫性を保証するアプリケーションのリクエストとアクションに生存します.
Mapperの役割は、SQLを送信し、必要な結果を返すか、SQLを実行してデータベースのデータを変更することです.したがって、JDBCのSQL文の実行のように、SqlSessionトランザクション・メソッド内で、最大の範囲はSqlSessionと同じです.
本の全体構造
本書は3つの部分に分かれており,MyBatisの基礎応用,原理およびプラグイン開発,実戦応用を順に紹介している.
ベースアプリケーション
主にMyBatisを効率的に使用する方法について説明します. MyBatisプロパティ コアコンポーネントおよびそのライフサイクル MyBatis構成 マッパー 動的SQL MyBatisの原理
MyBatisの内部動作原理とプラグインの開発方法とテクニックを深く理解します. MyBatisの解析と動作原理を紹介し、SqlSessionの構築方法、および4つのオブジェクトがどのように動作するかを知る MyBatisのプラグイン を紹介
実戦応用
主にMyBatisのいくつかの実用的なシーンを説明します. MyBatis-Springについて説明します.SpringプロジェクトでMyBatisアプリケーションを統合する方法について説明します. MyBatisの実用的なシーンを紹介し、いくつかの典型的なシーンを精選し、各シーンを解析し、開発者は避けなければならないいくつかのエラーと性能上の損失 に注意しなければならない.
次の記事では、MyBatisに関する構成、異なるビジネスシーンに適したMyBatisの構成、および拡張性について説明します.
読書の目標はすべての細部を覚えることではなく、全体的に一つの技術が何ができるか、含む特性、基本モジュール、実現原理とよくある使用シーンを理解することです.
本編はMyBatis書籍の第1編を分かち合い、まずJDBCの関連概念を思い出し、Javaが提供するデータベースへのアクセスの最も基本的な方法を理解し、それからMyBatisの基本的な特性とコアコンポーネントを紹介し、最後に本書の全体構造を述べ、後続の文章の大まかな内容を理解する.
JDBC関連概念
JavaプログラムはすべてJDBCを通じてデータベースに接続して、SQLを通じてデータベースに対してプログラミングして、JDBCはSUN会社が提出したいくつかの列の規範で、インタフェースの規範だけを定義して、具体的な実現は各データベースのメーカーが実現して、それは1種の典型的なブリッジのモードです.
ブリッジモードは構造型設計モードであり、その主な特徴は抽象と行為実現を分離し、それぞれインタフェースを定義し、各部分の独立性を維持し、彼らの機能拡張に対応することができる.
JDBC仕様
スペシフィケーションとは、標準インタフェースを自分で定義し、Connectionでデータベースとの接続を表し、StatementでSQLを実行し、ResultSetでSQLが返す結果を表し、データの便利さを提供するという抽象的なものです.ConnectionからStatementを作成し、Statementがクエリーを実行してResultSetを取得します.
上記のConnection、Statement、ResultSetは、各データベース・プロバイダが提供するインタフェースであるべきです.規範があれば、統一されたインタフェースを通じて、多種のタイプのデータベースにアクセスすることができて、勝手にデータベースを切り替えることができます.
データベースドライバ
前述したように,インタフェースの実装は各メーカーから提供されるため,実装クラスのクラス名が統一されず,Connectionオブジェクトを作成すると,ある実装クラスがコードに書き込まれてしまい,データベースを切り替える際にコードを修正する必要があるため,あまりよくない.この問題を解決するために,Driver駆動の概念を抽象化した.
Connection con=MySqlConnectionImpl("127.0.0.1",3306,"mi_user",userName,pwd);
各データベースはDriverインタフェースを実装する必要があり、Driverによってデータベース接続接続接続接続接続が得られ、反射メカニズムによって動的に作成されます.
Class.forName("com.mysql.jdbc.Drier");
同じプログラムで異なるデータベースにアクセスし、ドライバをDriverManagerで管理することができます.Driverは初期化時にDriverManagerに登録する必要があります.
DriverManagerは、データベース接続を確立するためのgetConnectionメソッドを提供します.
Connection con=DriverManager.getConnection("127.0.0.1",3306,"mi_user",userName,pwd);
複数のデータベースドライバがある場合、DriverManagerでどのように区別するかは、mysqlなどのデータベース接続urlで指定する必要があります.jdbc:mysql接頭辞を追加する必要があります.
String url= "jdbc:mysql://127.0.0.1:3306/mi_user";
Connection con=DriverManager.getConnection(url,userName,pwd);
データソース
データソースDataSourceには、接続プールと接続プール管理の2つの部分が含まれており、一般的には接続プールと呼ばれています.システムが初期化されると、データベース接続がオブジェクトとしてメモリに格納され、データベースにアクセスする必要がある場合は、確立された空き接続オブジェクトが接続プールから取り出されます.
データ・ソースを使用して、データベース接続を動的に取得するDataSourceオブジェクトを取得します.また、DataSourceオブジェクトは名前サービス(JNDI)に登録することができ、名前サービスによってDataSourceオブジェクトを取得することができ、ハードコーディング駆動を必要としない.
DriverManagerはJDBC 1が提供し、DataSourceはJDBC 2が追加した機能であり、データソースへの接続方法をよりよく提供しています.
HibernateとMyBatisの比較
以上の説明により、従来のJDBCプログラミングはデータベースに接続する機能をもたらしたが、その作業量は比較的大きく、まず接続し、その後JDBCの下位トランザクションを処理し、データ型を処理し、発生する可能性のある異常をキャプチャ処理し、適切にソースを閉じる.
実際の作業では,JDBCを用いたプログラミングは少なく,データベースデータとPOJOオブジェクトの相互マッピングを主に解決するORMモデルを提案した.
HibernateとMybatisはいずれもORMモデルであり,Hibernateは全表マッピングのモデルを提供し,JDBCのパッケージング程度が比較的高い.しかし、Hibernateにも多くの欠点があり、以下のように列挙されています.
大規模なインターネット環境の中で、柔軟性、SQLの最適化、データの伝達を減らすのが最も基本的な最適化方法で、Hibernateは要求を満たすことができなくて、MyBatisはあなたに柔軟性、便利な方式をあげて、1つの半自動マッピングのフレームワークです.
MyBatisはPOJO、SQL、マッピング関係を手動でマッチングする必要がありますが、全テーブルマッピングのHibernateはPOJOとマッピング関係を提供するだけです.
MyBatisは動的SQLを構成することができ、Hibernateのテーブル名が時間によって変化し、条件によって以下に明らかに異なる問題を解決することができる.SQLを最適化し、構成によってSQLマッピングルールを決定したり、ストレージ・プロシージャをサポートしたりすることができ、複雑でパフォーマンスを最適化する必要があるSQLのクエリーに便利です.
コアコンポーネント
コアコンポーネントには、主に次のものが含まれます.
SqlSessionFactoryの構築
各MyBatisアプリケーションは、SqlSessionFactoryのインスタンスを中心としており、そのタスクはSqlSessionの作成です.SqlSesionはJDBCのConnectionオブジェクトに似ています.
SqlSessionFactoryを作成するには、2つの方法があります.1つはXML構成の方法で、1つはコードの方法で、XML構成の使用を推奨します.
mybatis-config.xmlファイルを定義するには、次の手順に従います.
xml version="1.0" encoding="UTF-8"?>
SqlSessionFactoryの作成
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSessionの作成
SqlSessionはインタフェースクラスで、プレイヤーの顔の役割を果たし、本当に働いているのはExecutorインタフェースです.使い切るたびに正常に閉じることを保証する必要があります.
SqlSession sqlSession=null;
try{
sqlSession=sqlSessionFactory.openSession();
//some code
sqlSession.commit();
} catch(Exception ex){
sqlSession.roolback();
} finally{
if(sqlSession!=null){
sqlSession.close();
}
}
マッパー
マッパーは、JavaインタフェースとXMLファイル(または注釈)で構成され、次のように機能します.
public interface RoleMapper{
public Role getRole(Long id);
}
次に、マッピングXMLファイル、RoleMapper.xmlを定義します.
xml version="1.0" encoding="UTF-8"?>
POJOオブジェクトRoleの定義は比較的簡単で、リストされません.{id}はこのSQLのパラメータであり、SQL列の別名とPOJOの属性名が一致しているため、この文のクエリ結果がロール属性に自動的にマッピングされます.これが自動マッピングです.
クエリーの実行
RoleMapper roleMapper=sqlSession.getMapper(RoleMapper.class);
Role role=roleMapper.getRole(1L);
String roleName=role.getRoleName();
コンポーネントライフサイクル
SqlSessionFactoryは、MyBatisアプリケーションのライフサイクル全体で、各データベースに1つのSqlSessionFactoryしか対応しておらず、ツールクラスを実装して、オブジェクトを一例のモードで取得することができます.
SqlSessionのライフサイクルは、データベースにトランザクションの処理を要求する過程で、スレッドが安全ではないオブジェクトであり、マルチスレッドに関連する場合は特に注意してください.複数のSQLを実行し、トランザクションの一貫性を保証するアプリケーションのリクエストとアクションに生存します.
Mapperの役割は、SQLを送信し、必要な結果を返すか、SQLを実行してデータベースのデータを変更することです.したがって、JDBCのSQL文の実行のように、SqlSessionトランザクション・メソッド内で、最大の範囲はSqlSessionと同じです.
本の全体構造
本書は3つの部分に分かれており,MyBatisの基礎応用,原理およびプラグイン開発,実戦応用を順に紹介している.
ベースアプリケーション
主にMyBatisを効率的に使用する方法について説明します.
MyBatisの内部動作原理とプラグインの開発方法とテクニックを深く理解します.
実戦応用
主にMyBatisのいくつかの実用的なシーンを説明します.
次の記事では、MyBatisに関する構成、異なるビジネスシーンに適したMyBatisの構成、および拡張性について説明します.