MyBatisを使用してDBへの呼び出しをいくつか集計しようとしていますが、これまでのところ壁に衝突しました。インターフェイスの汎用タイプと多相
public interface Entity {
<T extends Entity> Class<Insertable<T>> mapper();
}
public interface Insertable<T extends Entity> {
void insert(T entity);
}
public interface ClientMapper extends Insertable<Client> {
void insert(Client client);
}
public interface CampaignMapper extends Insertable<Campaign> {
void insert(Campaign campaign);
}
public class Client implements Entity {
private final Long id;
public Client(final Long id) {
this.id = id;
}
@Override
public <T extends Entity> Class<Insertable<T>> mapper() {
return ClientMapper.class; // Incompatible types error
}
私はClientMapper
がClient
Entity
のタイプである、タイプInsertable<Client>
であるにも関わらず、このコンパイルエラーを取得しています:
のは、私は、エンティティとマッパーこれを持っているとしましょう。
目的は次のタイプセーフなコードになっている:
public class MapperOperation {
public static void insert(Entity entity) {
insert(entity, entity.mapper());
}
private static <V extends Entity, K extends Insertable<V>> void insert(V entity, Class<K> mapperClass) {
try (SqlSession session = PersistenceManager.get().openSession()) {
K mapper = session.getMapper(mapperClass);
mapper.insert(entity);
session.commit();
} catch (Exception e) {
log.error("Could not insert entity {}", entity, e);
}
}
}
この方法では、私はただのEntity
のインスタンスとメソッドinsert
を呼び出し、次にように私に彼mapper
を与えるために彼を求めることができます私はそれを挿入することができます。
これは可能ですか?私は何か間違っているのですか?
私は「話題から外れている」という疑問を持っています。「ClientMapper」と「CampaignMapper」のインターフェースは何ですか?つまり、同じシグネチャで挿入メソッドを再宣言するだけです。 –
Mybatisの仕組み(私が知る限り)です。各インタフェースには、実行されるクエリに関連付けられたXMLがあります。セッションを使用してそのインターフェース(マッパー)のインスタンスを取得し、メソッドを呼び出すと、Mybatisがその魔法を行います。 – carcaret