Springboot統合MongoDB baseDaoモードを使用
共通インタフェースをbaseDaoでカプセル化
1.依存の追加
2.アプリケーションton.yml構成
ここでポートは37017に変更され、MongoDBプロファイルを作成することでログ、データベース、ポートなどの構成を変更できます
3.BaseDaoインタフェースの作成
4.BaseDaoImpl実装
BaseDaoサブクラスは汎用型を入力することによって、反射して対応するエンティティcollectionNameを集合名(データベーステーブルの概念として理解できる)とし、MongoTemplateのapiでcollectionNameを送信しない場合、集合名はデフォルトでエンティティ名となる.EntityClassは、汎用エンティティに渡されるクラスオブジェクトです.
5.サブクラスDao実装
ここでは、パラメータ構造を使用してコレクション名collectionNameを入力します.他の操作があれば、ここでメソッドを拡張できます.
6._classドメイン問題
MongoTemplateエンティティを挿入すると、自動的にデータベースにフィールドが追加されます:class,valueは現在のエンティティのフルパスクラス名です.必要でない場合は、手動でMappingMongoConverterを構成し、DefaultMongoType Mapperの構造パラメータをnullに設定します.
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;
}