Springboot統合MongoDB baseDaoモードを使用


共通インタフェースをbaseDaoでカプセル化
1.依存の追加
       <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
            <version>2.0.3.RELEASE</version>
        </dependency>

2.アプリケーションton.yml構成
ここでポートは37017に変更され、MongoDBプロファイルを作成することでログ、データベース、ポートなどの構成を変更できます
spring:
  data:
    mongodb:
      uri: mongodb://localhost:37017/dota

3.BaseDaoインタフェースの作成
public interface BaseDao<T> {

    public List<T> findAll();

    public T findById(String id);

    public void insertEntity(T entity);

    public T getEntity(String name);

    public void deleteEntity(String name);
}


4.BaseDaoImpl実装
BaseDaoサブクラスは汎用型を入力することによって、反射して対応するエンティティcollectionNameを集合名(データベーステーブルの概念として理解できる)とし、MongoTemplateのapiでcollectionNameを送信しない場合、集合名はデフォルトでエンティティ名となる.EntityClassは、汎用エンティティに渡されるクラスオブジェクトです.
public class BaseDaoImpl<T> implements BaseDao<T> {

    private String collectionName;

    private Class<T> entityClass;

    public BaseDaoImpl(String collectionName) {
        ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
        this.entityClass = (Class<T>) pt.getActualTypeArguments()[0];
        this.collectionName = collectionName;
    }

    @Autowired
    private MongoTemplate mongoTemplate;

    @Override
    public List<T> findAll() {
        return mongoTemplate.findAll(entityClass, collectionName);
    }

    @Override
    public T findById(String id) {
        return mongoTemplate.findById(id, entityClass, collectionName);
    }

    @Override
    public void insertEntity(T entity) {
        mongoTemplate.save(entity, collectionName);
    }

    @Override
    public T getEntity(String name) {
        Query query = new Query(Criteria.where(entityClass.getSimpleName() + "Name").is(name));
        return mongoTemplate.findOne(query, entityClass, collectionName);
    }

    @Override
    public void deleteEntity(String name) {
        Query query = new Query(Criteria.where(entityClass.getSimpleName() + "Name").is(name));
        mongoTemplate.remove(query, entityClass, collectionName);
    }

}

5.サブクラスDao実装
ここでは、パラメータ構造を使用してコレクション名collectionNameを入力します.他の操作があれば、ここでメソッドを拡張できます.
@Repository
public class HeroDaoImpl extends BaseDaoImpl<Hero> implements HeroDao {

    public HeroDaoImpl() {
        super("hero");
    }

}

6._classドメイン問題
MongoTemplateエンティティを挿入すると、自動的にデータベースにフィールドが追加されます:class,valueは現在のエンティティのフルパスクラス名です.必要でない場合は、手動でMappingMongoConverterを構成し、DefaultMongoType Mapperの構造パラメータをnullに設定します.
    @Bean
    public MappingMongoConverter mappingMongoConverter(MongoDbFactory mongoDbFactory,
                                                       MongoMappingContext mongoMappingContext, BeanFactory beanFactory) {
        DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoDbFactory);
        MappingMongoConverter mappingMongoConverter = new MappingMongoConverter(dbRefResolver, mongoMappingContext);
        mappingMongoConverter.setCustomConversions(beanFactory.getBean(CustomConversions.class));

        //  DefaultMongoTypeMapper     null,  "_class" 
        mappingMongoConverter.setTypeMapper(new DefaultMongoTypeMapper(null));
        return mappingMongoConverter;
    }