最後の数回のレッスンでは、Spring フレームワークについて説明し、その背後にある一般的な設計アイデアを分析し、十数の設計パターンを使用しました。今日から、Java プロジェクト開発でよく使用される別のフレームワーク、MyBatis を分析してみましょう。内容が多くなりましたので、同様に3回に分けて説明させていただきます。
- 最初のレッスンでは、MyBatis がコードの使いやすさ、パフォーマンス、柔軟性をどのように評価するかを分析します。
- 2 番目のレッスンでは、責任チェーンとプロキシ モードを使用して MyBatis プラグインを実装する方法を学びます。
- 3 番目のレッスンでは、MyBatis フレームワークで使用される十数の設計パターンを要約してリストします。
それでは早速、今日の学習を正式に始めましょう!
Mybatis と ORM フレームワークの概要
Java に精通している学生は、MyBatis が ORM (オブジェクト リレーショナル マッピング、オブジェクト リレーショナル マッピング) フレームワークであることを知っているはずです。ORM フレームワークは主にクラスとデータベース テーブル間のマッピング関係に基づいており、プログラマがデータベース内のオブジェクトとデータ間の相互変換を自動的に実現できるようにします。より具体的に言うと、ORM はプログラム内のオブジェクトをデータベースに保存し、データベース内のデータをプログラム内のオブジェクトに変換する役割を果たします。実際、Java には多くの ORM フレームワークがあり、先ほど述べた MyBatis に加えて、Hibernate、TopLink などがあります。
Spring フレームワークを分析するときに、フレームワークの役割を一言で要約すると、開発を簡素化することであると述べました。MyBatis フレームワークも例外ではありません。これにより簡素化されるのはデータベースの開発です。では、MyBatis はどのようにしてデータベース開発を簡素化するのでしょうか? 第59回のJdbcTemplateの例で説明しましょう。
講義 59 では、Java がさまざまな種類のデータベース操作をカプセル化するための JDBC クラス ライブラリを提供していると述べました。ただし、データベース プログラミングに JDBC を直接使用するのはまだ少し面倒です。したがって、Spring は、JDBC をさらにカプセル化し、データベース プログラミングをさらに簡素化する JdbcTemplate を提供します。
データベース プログラミングに JdbcTemplate を使用すると、ビジネス関連のコード (SQL ステートメント、データベース内のデータとオブジェクト間の相互変換のコードなど) とその他のプロセス関連のコード (ドライバーの読み込み、データベース接続の作成、ステートメントの作成、接続のクローズ、ステートメントのクローズなど) は JdbcTemplate クラスにカプセル化されているため、繰り返し記述する必要はありません。
その際、JdbcTemplate を使用することでデータベース プログラミングがどのように簡素化されるかを示すために、データベース内のユーザー情報をクエリする例も示しました。同じ例ですが、MyBatis を使用してそれを実現する方法を見てみましょう。JdbcTemplate を使用するよりも簡単です。
MyBatis は JDBC ドライバーに依存しているため、プロジェクトで MyBatis を使用するには、MyBatis フレームワーク自体 (mybatis.jar) の導入に加えて、JDBC ドライバーの導入も必要です (たとえば、MySQL の JDBC ドライバー実装にアクセスするため)。クラス ライブラリ mysql-connector-java.jar)。2 つの jar パッケージをプロジェクトに導入したら、プログラミングを開始できます。MyBatis を使用してデータベース内のユーザー情報にアクセスするコードは次のとおりです。
// 1. 定义UserDO
public class UserDo {
private long id;
private String name;
private String telephone;
// 省略setter/getter方法
}
// 2. 定义访问接口
public interface UserMapper {
public UserDo selectById(long id);
}
// 3. 定义映射关系:UserMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="cn.xzg.cd.a87.repo.mapper.UserMapper">
<select id="selectById" resultType="cn.xzg.cd.a87.repo.UserDo">
select * from user where id=#{id}
</select>
</mapper>
// 4. 全局配置文件: mybatis.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="dev">
<environment id="dev">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8" />
<property name="username" value="root" />
<property name="password" value="..." />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>
UserMapper.xml 構成ファイルでは、インターフェイスと SQL ステートメントの間のマッピング関係のみを定義し、クラス (UserDo) フィールドとデータベース テーブル (ユーザー) フィールドの間のマッピング関係を明示的に定義していないことに注意してください。 。実際、これは「構成よりも規約」という設計原則を体現しています。クラス フィールドとデータベース テーブル フィールドの間には、デフォルトのマッピング関係が使用されます。クラス フィールドは、データベース テーブル内の同じスペルを持つフィールドに 1 つずつマップされます。もちろん、1 対 1 のマッピングを行う方法がない場合は、それらの間のマッピング関係をカスタマイズすることもできます。
上記のコードと構成を使用すると、次のようにデータベース内のユーザー情報にアクセスできます。
public class MyBatisDemo {
public static void main(String[] args) throws IOException {
Reader reader = Resources.getResourceAsReader("mybatis.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sessionFactory.openSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
UserDo userDo = userMapper.selectById(8);
//...
}
}
コードから、MyBatis を使用した実装は、JdbcTemplate を使用した実装よりも柔軟であることがわかります。JdbcTemplateを使用した実装では、オブジェクトとデータベース内のデータ間の変換コードとSQL文が業務コードにハードコーディングされます。MyBatisを使用した実装では、クラスフィールドとデータベースフィールド間のマッピング関係、およびインターフェイスとSQL間のマッピング関係は、コードから分離されたXML設定ファイルに記述されるため、より柔軟かつ明確で保守が容易になります。 。
使いやすさ、パフォーマンス、柔軟性のバランスをとるにはどうすればよいでしょうか?
MyBatis フレームワークについて簡単に説明しました。次に、他の 2 つのフレームワーク、JdbcTemplate と Hibernate を比較してみましょう。私たちを比較することで、MyBatis がコードの使いやすさ、パフォーマンス、柔軟性をどのように評価しているかがわかります。
まず JdbcTemplate を見てみましょう。MyBatis と比較すると、JdbcTemplate は軽量です。JDBC 用の非常に単純なパッケージを作成するだけなので、パフォーマンスの低下は比較的小さいです。他の 2 つのフレームワークと比較して、最高のパフォーマンスを備えています。ただし、SQL とコードが結合していること、ORM の機能がないこと、データベース内のオブジェクトとデータのマッピング関係を分析するには独自のコードを記述する必要があるという欠点もあります。したがって、使いやすさの点では他の 2 つのフレームワークほど優れていません。
もう一度 Hibernate を見てみましょう。MyBatis と比較すると、Hibernate はより重量級です。Hibernate は、ビジネス ニーズに応じて SQL ステートメントを自動的に生成できる、より高度なマッピング機能を提供します。MyBatis のように SQL を自分で書く必要はありません。したがって、MyBatis を半自動 ORM フレームワーク、Hibernate を完全自動 ORM フレームワークと呼ぶこともあります。ただし、SQL の自動生成により開発は簡素化されますが、結局は的を絞った最適化が行われずに自動生成されます。パフォーマンスの観点からは、結果として得られる SQL はプログラマほど適切に記述されない可能性があります。同時に、プログラマが自分で SQL を書く柔軟性も失われます。
実際、どの実装方法が使用されても、データベースからデータを取得してオブジェクトに変換するプロセスに含まれるコード ロジックは基本的に同じです。さまざまな実装方法の違いは、コード ロジックのどの部分がどこに配置されるかだけです。一部のフレームワークはより強力な機能を提供しており、コード ロジックのほとんどはフレームワークによって完成され、プログラマはコードのごく一部を実装するだけで済みます。これにより、フレームワークが使いやすくなります。ただし、フレームワークに統合される機能が増えるほど、処理ロジックの共通化のために追加の処理コードが導入されます。特定の問題に対する特定のプログラミングと比較すると、パフォーマンスの低下は比較的大きくなります。
したがって、大まかに言えば、フレームワークの使いやすさとパフォーマンスは相反する場合があります。使いやすさを追求すると性能は悪くなります。逆に性能、使いやすさを追求すると悪くなる。さらに、使いやすくなればなるほど、柔軟性は低くなります。これは私たちが使っているカメラに似ています。コンデジはシャッターを押すだけで写真を撮ることができますが、複雑な一眼レフほど柔軟ではありません。
実際、JdbcTemplate、MyBatis、および Hibernate のフレームワークも、先ほど述べた法則を反映しています。
JdbcTemplate は、最も単純な関数、最悪の使いやすさ、最小のパフォーマンス損失、および最高のプログラミング パフォーマンスを提供します。Hibernate は最も完全な機能と最高の使いやすさを提供しますが、相対的に言えば、パフォーマンスの低下が最も大きくなります。MyBatis は 2 つの中間に位置し、使いやすさ、パフォーマンス、柔軟性の点でトレードオフを実現しています。プログラマが自分で SQL を書くことをサポートし、プログラマの SQL 知識の蓄積を継続できます。完全にブラックボックスである Hibernate と比較して、多くのプログラマーは MyBatis の半透明なフレームワークを好みます。このことは、過剰なカプセル化と過度に簡素化された開発手法も開発の柔軟性を失うことを思い出させます。
重要なレビュー
さて、今日の内容はここまでです。何に重点を置く必要があるのか、一緒にまとめて見直してみましょう。
Java と MyBatis に精通している場合は、JDBC、JdbcTemplate、MyBatis、および Hibernate の違いを今すぐマスターする必要があります。JDBC は、データベースにアクセスするための Java の開発仕様であり、抽象的で統一された開発インターフェイスのセットを提供し、さまざまなデータベースへのアクセスの詳細を隠します。
JdbcTemplate、MyBatis、および Hibernate はすべて、データベース開発をさらに簡素化するための JDBC の 2 次パッケージです。このうち、JdbcTemplate は、オブジェクトとデータベース データの相互変換を実現するためにプログラマ自身がプログラムする必要があるため、ORM フレームワークとは言えません。プログラマーが SQL を記述する必要すらない完全自動 ORM フレームワークである Hibernate と比較して、MyBatis は半自動 ORM フレームワークです。
Java と MyBatis に詳しくない場合は、背景の紹介として、MyBatis と ORM について簡単に理解できます。ただし、使い慣れた言語には対応する ORM フレームワークが存在するはずで、それを比較して分析することもできます。
今日のコンテンツでは、MyBatis の背景を説明するだけでなく、コードの使いやすさ、パフォーマンス、柔軟性の関係についても学びます。一般に、高度な機能を提供するほどパフォーマンスの低下は大きくなり、使いやすく開発方法が簡単なほど柔軟性は低下します。
クラスディスカッション
プロジェクト開発において、実際に開発効率を向上させ、不必要な手作業を削減できるフレームワークを使用したことがありますか?