MyBatis 永続層フレームワークの詳細な解釈: Mapper プロキシ開発

1 はじめに

前回のMyBatis Quick Startの記事では、MyBatisのネイティブ開発方式でデータベースを運用することで、JDBCでデータベースを運用する際のハードコーディングや煩雑な操作の問題を解決しました。実際、Java プロジェクトでは Mapper エージェントの開発方法を使用することが多くなっています。

画像-20230126233131746

2つの方法の違いは何ですか?

基本的な方法でデータベースを操作する場合は、sqlSession のネイティブ メソッド selectList を使用して sql ステートメントを実行し、結果セット オブジェクトを処理します。例:

List<Student> students = sqlSession.selectList("test.selectAll"); //参数是一个字符串,该字符串必须是映射配置文件的 namespace.id

このメソッドのパラメータは sql マッピング構成ファイルname.idでなければならず、文字列の形でこのメソッドに渡されるため、ここでハードコーディングの問題があり、ここで id を使用する方法は便利な設計ではありません。コーディング時には、対応するマッピング構成ファイルで id を見つける必要もあるため、Mapper プロキシ開発メソッドはこの問題を解決するようです。

Mapper プロキシ開発メソッドを使用してデータベースを操作する場合、SqlSession クラス オブジェクトを介して Mapper インターフェースを指定する Mapper プロキシ オブジェクトを取得し、プロキシ オブジェクトを使用して対応する Mapper インターフェース内のメソッドを呼び出し、このメソッドはマッピング構成ファイルを使用して、SQL を見つけて実行し、最終的に結果セット オブジェクトを処理します。例:

//3. 执行sql
//3.1 获取StudentMapper接口的代理对象
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
List<Student> students = studentMapper.selectAll();

一般に、Mapper プロキシ方式には次の 2 つの利点があります。

  • ネイティブモードでのハードコーディングの問題を解決
  • 単純化された実行後 sql

2. Mapper エージェントの開発

上記の例から、Mapper プロキシを使用する方法にはより多くの利点があることがわかります.まず第一に、文字列のリテラル値に依存しないため、より便利で安全です. 次に、IDE にコードの自動補完機能がある場合、対応する ID に依存せずに、マッピング ファイルの sql ステートメントをすばやく選択するのに役立ちます。

Mapper プロキシ開発方法を使用するには、次の手順を実行する必要があります。

  1. Mapper インターフェースを SQL マッピング構成ファイルと同じ名前で定義し、Mapper インターフェースと SQL マッピング構成ファイルが同じディレクトリーに入らないようにします。
  2. SQL マッピング ファイルの名前空間属性を Mapper インターフェースの完全修飾名に設定します。
  3. Mapper インターフェイスでメソッドを定義します。メソッド名は SQL マッピング ファイル内の SQL ステートメントの ID であり、パラメータの型と戻り値の型は同じにします。

次の例では、マッパー エージェントの開発プロセスを理解するためにケースを使用しています。このケースでは、入門の章で学生情報をクエリし、それをオブジェクトとしてカプセル化し、コレクションに格納しています。

最初のステップ:

org.chengzi.mapperpackageの下にStudentMapper を作成します。例:

public interface StudentMapper {
    
    
    List<Student> selectAll();
    Student selectById(int id);
}

resources の下にorg / chengzi / mapperディレクトリー作成し、このファイル・ディレクトリーの下に StudentMapper.xml 構成ファイルを作成します。そうすることで、Mapper インターフェイスと SQL マッピング構成ファイルが同じファイル ディレクトリにあることが保証されます。

ステップ 2 : SQL マッピング ファイルの名前空間属性を、Mapper インターフェースの完全修飾名と一致するように設定します。例:

<!--
    namespace:名称空间。必须是对应接口的全限定名
-->
<mapper namespace="org.chengzi.mapper.StudentMapper">
    <select id="selectAll" resultType="org.chengzi.pojo.User">
        select *
        from student;
    </select>
</mapper>

ステップ 3 : SQL マッピング構成ファイルを MyBatis コア構成ファイルにロードします。例:

<mappers>
      <!--加载sql映射文件-->
      <mapper resource="org/chengzi/mapper/StudentMapper.xml"/>
</mappers>

注: 次の 2 つの手順では、ファイル パスの区切り記号/としてます

上記の 3 つの手順を完了すると、データベースを操作するためのテスト コードを記述し、関連する操作を完了することができます。例:

public class MyBatisDemo2 {
    
    

    public static void main(String[] args) throws IOException {
    
    

        //1. 加载mybatis的核心配置文件,获取 SqlSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //2. 获取SqlSession对象,用它来执行sql
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //3. 执行sql
        //3.1 获取StudentMapper接口的代理对象
        StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
        List<Student> students = studentMapper.selectAll();

        System.out.println(students);
        //4. 释放资源
        sqlSession.close();
    }
}

操作結果:

画像-20230128201911101

ここでは MyBatis の基本的なメソッドとは異なり、sqlSession オブジェクトに対応するメソッドを通じて StudentMapper インターフェイスのプロキシ オブジェクトを取得し、そのプロキシ オブジェクトを使用して sql ステートメントを実行し、結果セット オブジェクトをカプセル化します。プロキシ オブジェクトを返すプロセスは、MyBatis によって内部的に行われます。

Tips: MyBatis コア設定ファイルに sql マッピング設定ファイルを読み込む際、sql マッピング設定ファイルの数が多い場合、この手順も面倒ですが、MyBatis ではこの問題の解決策も提供しています。

Mapper インターフェースの名前が sql マッピング ファイルの名前と同じで、それらが同じディレクトリにある場合、パッケージ スキャンを使用して sql マッピング ファイルのロードを簡素化できます。コア構成ファイル内の sql マッピング構成ファイルを次のように変更します。

<mappers>
    <!--加载sql映射文件-->
    <!-- <mapper resource="org/chengzi/mapper/UserMapper.xml"/>-->
    <!--Mapper代理方式-->
    <package name="org.chengzi.mapper"/>
</mappers>

3. プロセス分析

Mapper プロキシ開発を使用する場合、SqlSessionFactory クラスの openSession() メソッドを通じて SqlSession クラス オブジェクトを取得し、SqlSession クラス オブジェクトを通じて指定された Mapper インターフェースの Mapper プロキシ オブジェクトを取得します。

Mapper プロキシ オブジェクトを取得すると、対応する Mapper インターフェースを見つけることができ、同じディレクトリで、インターフェースと同じ名前の対応する sql マッピング ファイルを見つけることができます。プロキシ オブジェクトを使用して、対応する Mapper インターフェイスのメソッドを呼び出します.このメソッドは、SQL マッピング構成ファイルの id 属性に対応します.id 属性を介して、対応する sql ステートメントを検索し、sql ステートメントを実行してカプセル化することができます結果セット オブジェクト。

たとえば、上記のケースでは、studentMapperプロキシ オブジェクトは selectAll() メソッドを実行し、List オブジェクトを返しますが、実際には、最下層は引き続き次のステートメントを実行します。

 List<User> users = sqlSession.selectList("test.selectAll"); 

4. まとめ

MyBatisのネイティブな方法で開発されているため、一部のプロセスは文字列定数値に依存しており、ハードコーディングされた問題があります. 同時に、SQLを実行するためのパラメータとしてコマンド空間とSQL固有識別子を使用することは、コードを記述するときに面倒です. Mapper プロキシを使用する方法には、より多くの利点があります. まず第一に、文字列のリテラル値に依存しないため、より便利で安全です。次に、IDE にコードの自動補完機能がある場合、対応する ID に依存せずに、マッピング ファイルの sql ステートメントをすばやく選択するのに役立ちます。

おすすめ

転載: blog.csdn.net/zhangxia_/article/details/128781725