1前書き


MyBatis

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

簡単に言えば、これはJDBCとHibernateに代わるものです。


2 Mavenの依存関係

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

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.4.4</version>
</dependency>

依存関係の最新版はhttps://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22mybatis%22[ここ]にあります。


3 Java API


3.1.

SQLSessionFactory



SQLSessionFactory

は、すべてのMyBatisアプリケーションのコアクラスです。

このクラスは、構成XMLファイルをロードする

__SQLSessionFactoryBuilderの

builder()__メソッドを使用してインスタンス化されます。

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

クラスからインスタンス化することができます。このクラスのインスタンスはスレッドセーフではありません。

データベース操作を実行した後、セッションを閉じる必要があります。


SqlSession



AutoCloseable

インターフェースを実装しているので、

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が提供する主な注釈をいくつか見てみましょう。

  • __

    @挿入、@選択、@更新、@削除

    – これらの注釈が表す

アノテーション付きメソッドを呼び出すことによって実行されるSQLステートメント

+[source、java、gutter:、true]

@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クラス属性にマップされる方法の詳細

+[source、java、gutter:、true]

@Select("Select personId, name from Person where personId=#{personId}")
@Results(value = {
  @Result(property = "personId", column = "personId")
   //...
})
public Person getPersonById(Integer personId);



  • @ Result


    – これは、

    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);



  • @多数



    1つのオブジェクトのコレクションへのマッピングを指定します。

他のオブジェクト:

@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

アノテーションと同様に、オブジェクト間の一対一のマッピング関係を指定する

@ One

アノテーションがあります。



  • @ MapKey

    – これは、レコードのリストを

    Map__ ofに変換するために使用されます。


value

属性で定義されたキーを持つレコード

+[source、java、gutter:、true]

@Select("select **  from Person")
@MapKey("personId")
Map<Integer, Person> 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構成をクラスとして提供する。

SELECT



WHERE

などこれで、

WHERE

句の生成を動的に変更できます。


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


@ Select

アノテーションを使用してストアドプロシージャを実行することもできます。

ここではストアドプロシージャの名前、パラメータリストを渡し、そのプロシージャに明示的な

Call

を使用する必要があります。

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


8結論

このクイックチュートリアルでは、MyBatisが提供するさまざまな機能と、それがどのようにデータベース対応アプリケーションの開発を容易にするかを見てきました。私達はまた図書館によって提供された様々な注釈を見ました。

この記事の完全なコードはhttps://github.com/eugenp/tutorials/tree/master/mybatis[GitHubで利用可能]です。