[Spring Boot] MyBatis アノテーションを使用してデータベース操作を実装する

MyBatis アノテーションを使用してデータベース操作を実装する

MyBatis ではアノテーション方式も提供しており、XML 方式に比べてシンプルで便利であり、XML 設定ファイルを作成する必要がありません。次に、アノテーションの使用方法を詳しく見てみましょう。

1. XML とアノテーションの類似点と相違点

1) アノテーションモードは使いやすく開発効率は高いですが、メンテナンスが面倒で、SQLの修正には再コンパイルやパッケージ化が必要です。

2) XML モードは保守が容易で、SQL とコードが分離されており、コードが明確で理解しやすいですが、アノテーション モードを使用すると、メソッドの前にさまざまなアノテーションや SQL ステートメントを追加する必要があり、コードが読みにくくなります。

3) XML モードは、複雑な SQL ステートメントを実装するための完全なタグを提供しますが、Java コードでスプライシングを直接判断するほど単純かつ便利ではありません。

4) XML モード: SQL は XML ファイルで構成されているため、一部の特殊文字をエスケープする必要があるため、使用が面倒でエラーが発生しやすくなります。

2. MyBatis アノテーションを使用してデータ クエリを実装する

MyBatis アノテーション モードの最大の特徴は、Mapper の XML 構成が解除されることであり、SQL 文は Mapper インターフェイスのメソッドまたは SQLProvider のメソッド内で @Insert、@Update、@Select、@Delete などのアノテーションによって定義されるため、 XML 設定ドキュメントが必要です。これらの注釈とパラメーターの使用は、基本的に、mapper.xml 構成ファイルと一致します。MyBatis アノテーションを使用してデータ クエリを実装する方法を示します。

2.1 設定ファイルの変更

まず Spring Boot プロジェクトを作成します。MyBatis を統合するプロセスは XML 構成と同じです。

アノテーション方式を使用する場合は、application.propertiesにエンティティクラスのパッケージパスを指定するだけで、他は変更されない構成例は以下のとおりです。

#mapper.xml mapper接口的包路径
MyBatis.type-aliases-package=com.example.ysxq

#数据库连接
spring.datasource.url=jdbc:mysql://Localhost:3306/ceshi?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

上記の例では、マッパー インターフェイスのパッケージ パスとデータ ソースが設定されており、mapper.xml ファイルのパスを設定する必要はありません。

2.2 マッパーインターフェースの追加

MyBatis が提供する SQL ステートメント注釈を使用するには、mapper.xml マッピング ファイルを作成し、マッパー インターフェイス クラスを作成して、関連メソッドを追加する必要はありません。

public interface StudentMapper {
    
    
    @Select("select * from student")
    List<Student> selectAll();
}

上記の例では、 @Select アノテーションを使用して SQL クエリ文を定義することで、mapper.xml マッピング ファイルを定義せずに、全学生のリストをクエリする機能を実現できます。

2.3 検証試験

単体テスト メソッドを追加して、有効かどうかを確認します。サンプルコードは次のとおりです。

@Test
    public void testSelectAll() {
    
    
        // 查询
        List<Student> students = studentMapper.selectAll();
        for (Student stu : students) {
    
    
            System.out.println("name:"+stu.getName()+", age:"+stu.getAge());
        }
    }

[テストの実行] をクリックするか、メソッドを右クリックして ['testSelectAll' の実行] を選択し、単体テストの結果を表示します。実行結果は図に示すとおりです。

ここに画像の説明を挿入します
結果は、単体テスト メソッド testSelectAll が正常に実行され、対応するクエリ結果が出力されたことを示しています。これは、すべての学生情報を照会する機能がアノテーションを使用して正常に実装されていることを示しています。

3.パラメータの受け渡し

「MyBatis はどのようにパラメータを SQL に渡すのですか? パラメータを渡すさまざまな方法は何ですか?」という疑問を持つ人も多いと思います。MyBatis アノテーションのパラメータ受け渡しメソッドを一つずつ紹介していきます。

3.1 パラメータを直接渡す

単純なパラメーターの場合は、#{id} を直接使用して、同じ名前の変数パラメーターを受け取ることができます。サンプルコードは次のとおりです。

@Select("SELECT * FROM student where id=#{id,jdbcType=VARCHAR}")
Student selectOne(Long id);

上記の例では、#{id} を使用して変数パラメーターを渡します。これにより、複数のパラメーターの受け渡しがサポートされます。#{} を使用して定義されたパラメータ名は、メソッド内のパラメータ名と一致している必要があることに注意してください。

3.2 @Param アノテーションを使用する

@Param アノテーションの機能はパラメータに名前を付けることであり、パラメータに名前を付けた後は、その名前に従ってパラメータ値を照合し、パラメータを SQL ステートメントに正しく渡すことができます。たとえば、注釈が @Param("person") の場合、パラメータの名前は #{person} になります。サンプルコードは次のとおりです。

@Select("select * from student where name=#{name} and sex=#{sex}")
Student selectByNameAndSex(@Param("name") String name, @Param("sex") Integer sex);

メソッドに複数のパラメータがある場合、param をカスタマイズする必要はありません。MyBatis はメソッドのパラメータにカスタム名を付けることができます。パラメータには最初に「param」という接頭辞が付けられ、パラメータの位置はパラメータ エイリアスとして追加されます。たとえば、 、#{param1}、#{param2}。

// 默认使用param +参数序号或者0、1,值就是参数的值
@Select("select * from student where name=#{param1} and sex=#{param2}")
Student selectByNameAndSex(String name, Integer sex);

各パラメータに名前を付けたくない場合は、param パラメータを使用できます。デフォルトの形式は、param+パラメータ番号または 0、1 で、値はパラメータの値です。

3.3 マッピング値の転送

複数のパラメータを送信する必要がある場合は、マップ フォームの使用を検討することもできます。

@Select("select * from student where name=#{name} and sex=#{sex}")
Student selectByNameAndSex(Map<String, Object> map);

上記の例では、SQL ステートメントに必要なパラメータがマップ タイプを通じて渡されます。key はパラメータ名、value はパラメータ値です。MyBatis は、対応するマッピング内のパラメーター値を自動的に照合します。

呼び出すときは、パラメータをマッピングに順番に追加するだけです。

@Map param= new HashMap();
param.put("name", "ysxq");
param.put("sex", 1);
Student student = studentMapper.selectByNameAndSex(param);

3.4 pojo オブジェクトの使用

pojo オブジェクトを使用してパラメーターを渡すのは一般的なパラメーターの受け渡し方法であり、前に紹介した insert や update などのメソッドはすべてユーザー オブジェクトを直接渡します。

@Update({
    
    
     "update student",
     "set name = #{name,jdbcType=VARCHAR},",
     "age = #{age,jdbcType=INTEGER},",
     "sex = #{sex,jdbcType=INTEGER}",
     "where id =#{id,jdbcType=VARCHAR}"
})
void update(Student record);

insert や update などの多くのパラメータを持つメソッドの場合、pojo オブジェクトを使用してパラメータを渡すことができます。パラメータの名前とタイプは、pojo オブジェクトのプロパティと一致している必要があることに注意してください。

以上、MyBatis でパラメータを渡す 4 つの方法を説明しましたが、使用する場合は、メソッドのパラメータに応じて、適切な値の渡し方を選択するだけです。

4. 結果のマッピング

MyBatis はクエリ結果セットを返される必要のあるデータ型に自動的に変換しますが、処理する必要がある特殊なシナリオがいくつかあります。

これには、@Results および @Result アノテーションを使用する必要があります。これら 2 つのアノテーションは、データベースでクエリされた値を特定の属性または型に変換し、返された結果セットを変更できます。たとえば、クエリ オブジェクトの戻り値の属性名がフィールド名と一致しない場合や、列挙型がフィールド名と一致しない場合などです。オブジェクトの属性など。

    @Select({
    
    
            "select",
            "id, name as student_name,age, sex as student_sex",
            "from student",
            "where id = #{id,jdbcType=VARCHAR}"
    })
    @Results({
    
    
            @Result(column="id",property="id",jdbcType= JdbcType.VARCHAR,id=true),
            @Result(column="student_name",property="name",jdbcType=JdbcType.VARCHAR),
            @Result(column="student_sex",property="sex",jdbcType=JdbcType.TIMESTAMP)
    })
    Student selectById(Long id);

上記の例では、クエリ結果セットの Student_name フィールドの名前は、エンティティ クラス Student によって定義された name 属性と一致しないため、変換には Result が必要ですが、年齢名は一貫しているため、変換には Result は必要ありません。 。

おすすめ

転載: blog.csdn.net/weixin_45627039/article/details/132609088