MyBatisのクイックガイド

MyBatisのクイックガイド

1. 前書き

MyBatisは、Javaアプリケーションでのデータベースアクセスの実装を簡素化するオープンソースの永続性フレームワークです。 カスタムSQL、ストアドプロシージャ、さまざまな種類のマッピング関係のサポートを提供します。

簡単に言えば、JDBCとHibernateの代替手段です。

2. Mavenの依存関係

MyBatisを利用するには、pom.xml:に依存関係を追加する必要があります


    org.mybatis
    mybatis
    3.4.4

依存関係の最新バージョンはhereにあります。

3. Java API

3.1. SQLSessionFactory

SQLSessionFactoryは、すべてのMyBatisアプリケーションのコアクラスです。 このクラスは、構成XMLファイルをロードするSQLSessionFactoryBuilder'sbuilder()メソッドを使用してインスタンス化されます。

String resource = "mybatis-config.xml";
InputStream inputStream Resources.getResourceAsStream(resource);
SQLSessionFactory sqlSessionFactory
  = new SqlSessionFactoryBuilder().build(inputStream);

Java構成ファイルには、データソース定義、トランザクションマネージャーの詳細、エンティティ間の関係を定義するマッパーのリストなどの設定が含まれ、これらを一緒に使用してSQLSessionFactoryインスタンスを構築します。

public static SqlSessionFactory buildqlSessionFactory() {
    DataSource dataSource
      = new PooledDataSource(DRIVER, URL, USERNAME, PASSWORD);

    Environment environment
      = new Environment("Development", new JdbcTransactionFactory(), dataSource);

    Configuration configuration = new Configuration(environment);
    configuration.addMapper(PersonMapper.class);
    // ...

    SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
    return builder.build(configuration);
}

3.2. SQLSession

SQLSessionには、データベース操作の実行、マッパーの取得、およびトランザクションの管理のためのメソッドが含まれています。 SQLSessionFactoryクラスからインスタンス化できます。 このクラスのインスタンスはスレッドセーフではありません。

データベース操作を実行した後、セッションを閉じる必要があります。 SqlSessionAutoCloseableインターフェイスを実装しているため、try-with-resourcesブロックを使用できます。

try(SqlSession session = sqlSessionFactory.openSession()) {
    // do work
}

4. マッパー

マッパーは、メソッドを対応するSQLステートメントにマップするJavaインターフェイスです。 MyBatisは、データベース操作を定義するための注釈を提供します。

public interface PersonMapper {

    @Insert("Insert into person(name) values (#{name})")
    public Integer save(Person person);

    // ...

    @Select(
      "Select personId, name from Person where personId=#{personId}")
    @Results(value = {
      @Result(property = "personId", column = "personId"),
      @Result(property="name", column = "name"),
      @Result(property = "addresses", javaType = List.class,
        column = "personId", [email protected](select = "getAddresses"))
    })
    public Person getPersonById(Integer personId);

    // ...
}

5. MyBatisアノテーション

MyBatisが提供する主な注釈のいくつかを見てみましょう。

  • *@Insert, @Select, @Update, @Delete* –これらのアノテーションは、アノテーション付きメソッドを呼び出すことによって実行されるSQLステートメントを表します。

    @Insert("Insert into person(name) values (#{name})")
    public Integer save(Person person);
    
    @Update("Update Person set name= #{name} where personId=#{personId}")
    public void updatePerson(Person person);
    
    @Delete("Delete from Person where personId=#{personId}")
    public void deletePersonById(Integer personId);
    
    @Select("SELECT person.personId, person.name FROM person
      WHERE person.personId = #{personId}")
    Person getPerson(Integer personId);
  • @Results –データベース列がJavaクラス属性にマップされる方法の詳細を含む結果マッピングのリストです。

    @Select("Select personId, name from Person where personId=#{personId}")
    @Results(value = {
      @Result(property = "personId", column = "personId")
        // ...
    })
    public Person getPersonById(Integer personId);
  • @Result@Results.から取得した結果のリストからのResultの単一インスタンスを表します。データベース列からJava Beanプロパティへのマッピング、プロパティのJavaタイプ、また、他のJavaオブジェクトとの関連付け:

    @Results(value = {
      @Result(property = "personId", column = "personId"),
      @Result(property="name", column = "name"),
      @Result(property = "addresses", javaType =List.class)
        // ...
    })
    public Person getPersonById(Integer personId);
  • *@Many* –は、あるオブジェクトから他のオブジェクトのコレクションへのマッピングを指定します。

    @Results(value ={
      @Result(property = "addresses", javaType = List.class,
        column = "personId",
        [email protected](select = "getAddresses"))
    })

    ここで、getAddressesは、Addressテーブルにクエリを実行してAddressのコレクションを返すメソッドです。

    @Select("select addressId, streetAddress, personId from address
      where personId=#{personId}")
    public Address getAddresses(Integer personId);

    @Manyアノテーションと同様に、オブジェクト間の1対1のマッピング関係を指定する@Oneアノテーションがあります。

  • *@MapKey* –これは、レコードのリストを、value属性で定義されたキーを持つレコードのMapに変換するために使用されます。

    @Select("select * from Person")
    @MapKey("personId")
    Map getAllPerson();
  • *@Options* –この注釈は、定義するさまざまなスイッチと構成を指定するため、他のステートメントでそれらを定義する代わりに、@Optionsでそれらを定義できます。

    @Insert("Insert into address (streetAddress, personId)
      values(#{streetAddress}, #{personId})")
    @Options(useGeneratedKeys = false, flushCache=true)
    public Integer saveAddress(Address address);

6. 動的SQL

ダイナミックSQLは、MyBatisが提供する非常に強力な機能です。 これにより、複雑なSQLを正確に構築できます。

従来のJDBCコードでは、SQLステートメントを記述し、それらの間のスペースの精度でそれらを連結し、適切な場所にコンマを配置する必要があります。 大規模なSQLステートメントの場合、これは非常にエラーが発生しやすく、デバッグが非常に困難です。

アプリケーションで動的SQLを使用する方法を見てみましょう。

@SelectProvider(type=MyBatisUtil.class, method="getPersonByName")
public Person getPersonByName(String name);

ここで、最終的なSQLを実際に構築および生成するクラスとメソッド名を指定しました。

public class MyBatisUtil {

    // ...

    public String getPersonByName(String name){
        return new SQL() {{
            SELECT("*");
            FROM("person");
            WHERE("name like #{name} || '%'");
        }}.toString();
    }
}

動的SQLは、すべてのSQL構造をクラスとして提供します。 SELECTWHEREなど。 これにより、WHERE句の生成を動的に変更できます。

7. ストアドプロシージャのサポート

@Selectアノテーションを使用してストアドプロシージャを実行することもできます。 ここでは、ストアドプロシージャの名前とパラメータリストを渡し、そのプロシージャに明示的なCallを使用する必要があります。

@Select(value= "{CALL getPersonByProc(#{personId,
  mode=IN, jdbcType=INTEGER})}")
@Options(statementType = StatementType.CALLABLE)
public Person getPersonByProc(Integer personId);

8. 結論

このクイックチュートリアルでは、MyBatisが提供するさまざまな機能と、データベース向けアプリケーションの開発を容易にする方法について説明しました。 また、ライブラリによって提供されるさまざまな注釈も確認しました。

この記事の完全なコードはover on GitHubで入手できます。