Jdbi: SqlObjectミックスインとその使用方法を文書化する

作成日 2016年12月16日  ·  5コメント  ·  ソース: jdbi/jdbi

それに関するドキュメントの欠如は私に不思議に思います

doc

最も参考になるコメント

こんにちは@Shujito

ミックスインは、SQLオブジェクトタイプに実装/拡張して、SQLオブジェクトにメソッドを追加できるインターフェイスです。 GetHandleTransactionalの2つのミックスインがあります。

GetHandleは、単一のメソッドHandle getHandle() $を提供します。 アノテーションで実行できるよりも複雑なクエリがある場合(たとえば、フォールドを使用したマルチテーブル結合)、 GetHandleを実装/拡張し、SQLメソッドを具象/デフォルトメソッドにします。 メソッド内でgetHandle()を呼び出して、SQLオブジェクトに関連付けられたHandle $を取得できます。

interface ContactDao extends GetHandle {
  default List<Contact> getFullContacts() {
    return getHandle().createQuery(
        "select * from contact c left join phones p on c.id = p.contactId")
        .fold(new LinkedHashMap<Integer,Contact>(), (map, rs, ctx) -> {
          // etc
        })
        .values()
        .stream()
        .collect(toList());
}

Transactionalは、トランザクションを管理するためのいくつかの方法を提供します。

interface ContactDao extends Transactional {
  default void createFullContact(Contact contact) {
    begin();
    try {
      int contactId = createContact(contact.getName());
      createPhones(contact.getPhones());
      commit();
    }
    catch (Exception e) {
      rollback();
    }
  }

  @SqlUpdate("insert into contact(id, name) values (nextval('contact_seq'), :name)")
  <strong i="20">@GetGeneratedKeys</strong>
  int createContact(<strong i="21">@BindBean</strong> Contact contact);

  @SqlBatch("insert into phone(id, contact_id, phone_type, phone_number) " +
      "values (nextval('phone_seq'), :contactId, :phoneType, :phoneNumber)")
  void createPhones(<strong i="22">@BindBean</strong> List<Phone> phones);
}

全てのコメント5件

こんにちは@Shujito

ミックスインは、SQLオブジェクトタイプに実装/拡張して、SQLオブジェクトにメソッドを追加できるインターフェイスです。 GetHandleTransactionalの2つのミックスインがあります。

GetHandleは、単一のメソッドHandle getHandle() $を提供します。 アノテーションで実行できるよりも複雑なクエリがある場合(たとえば、フォールドを使用したマルチテーブル結合)、 GetHandleを実装/拡張し、SQLメソッドを具象/デフォルトメソッドにします。 メソッド内でgetHandle()を呼び出して、SQLオブジェクトに関連付けられたHandle $を取得できます。

interface ContactDao extends GetHandle {
  default List<Contact> getFullContacts() {
    return getHandle().createQuery(
        "select * from contact c left join phones p on c.id = p.contactId")
        .fold(new LinkedHashMap<Integer,Contact>(), (map, rs, ctx) -> {
          // etc
        })
        .values()
        .stream()
        .collect(toList());
}

Transactionalは、トランザクションを管理するためのいくつかの方法を提供します。

interface ContactDao extends Transactional {
  default void createFullContact(Contact contact) {
    begin();
    try {
      int contactId = createContact(contact.getName());
      createPhones(contact.getPhones());
      commit();
    }
    catch (Exception e) {
      rollback();
    }
  }

  @SqlUpdate("insert into contact(id, name) values (nextval('contact_seq'), :name)")
  <strong i="20">@GetGeneratedKeys</strong>
  int createContact(<strong i="21">@BindBean</strong> Contact contact);

  @SqlBatch("insert into phone(id, contact_id, phone_type, phone_number) " +
      "values (nextval('phone_seq'), :contactId, :phoneType, :phoneNumber)")
  void createPhones(<strong i="22">@BindBean</strong> List<Phone> phones);
}

したがって、これらを使用して、より複雑なオブジェクトを照会できます。
この例では、ここにある多くの電話と一緒に連絡先を取得できますよね?

そうです、そうです。 ただし、クエリをどのように作成するかによって異なります。

これですべてが明らかになりました。必要性がわかり次第、この機能を悪用します。
ちなみにここに記入するとよいでしょう:http: //jdbi.org/sql_object_mixins/
ありがとう

#802で追跡

このページは役に立ちましたか?
0 / 5 - 0 評価

関連する問題

keith-miller picture keith-miller  ·  3コメント

raderio picture raderio  ·  6コメント

Romqa picture Romqa  ·  5コメント

kkrgwbj picture kkrgwbj  ·  4コメント

anjeyy picture anjeyy  ·  3コメント