WebFlux統合MongoDBの
序文
式地図データ構造のメモリに格納されたデータに関する講演。このようなデータは、我々はデータソースにWebFlux操作を実現するためにMongoDBを使用した紙を保持されません。
MongoDBは何ですか?
公式サイト:httpsを://www.mongodb.com/
MongoDBのは、高性能データ・ストレージ・ソリューションのためのスケーラブルなWebアプリケーションを提供するために設計されたC ++言語でコンパイルされた分散ファイル・ストレージ・データベースに基づいています。
MongoDBは、リレーショナルデータベースのような豊かな、最も間のリレーショナルデータベースと非リレーショナルデータベース、非リレーショナルデータベース機能との機能を持つ製品です。
操作の容易さのために、我々はMognoDBサービスドッカーで始まります。ドッカーがインストールされていない場合は、テキストを参照してください。ドッカーのインストールと基本的な操作https://www.jianshu.com/p/f272726db9c5
ドッカーMognoDBのインストールと、次のように起動します。
1.マウントディレクトリを作成します。
docker volume create mongo_data_db
docker volume create mongo_data_configdb复制代码
2、MognoDBを開始
docker run -d \
--name mongo \
-v mongo_data_configdb:/data/configdb \
-v mongo_data_db:/data/db \
-p 27017:27017 \
mongo \
--auth复制代码
3、管理者アカウントを初期化します
docker exec -it mongo mongo admin
// 容器名 // mongo命令 数据库名
# 创建最高权限用户
db.createUser({ user: 'admin', pwd: 'admin', roles: [ { role: "root", db: "admin" } ] });复制代码
4、テスト接続
docker run -it --rm --link mongo:mongo mongo mongo -u admin -p admin --authenticationDatabase admin mongo/admin复制代码
MognoDB基本的な操作:
同様にMySQLは、ライブラリの一覧を表示するコマンド:
show dbs复制代码
データベースを使用します
use admin复制代码
ディスプレイテーブルリスト
show collections复制代码
テーブルには、都市、都市のフォーマットテーブルの内容の表示が存在する場合
db.city.find().pretty()复制代码
構造
同様のエンジニアリング構造、新しいプロジェクトの作成この場合、前述しました。プロジェクト図:
コアディレクトリ以下のように
- pom.xml Mavenの設定
- application.propertiesプロフィール
- DAOデータアクセス層、この記事のポイント
新しいPOM依存性と設定
pom.xmlでの新しい構成の依存関係:
<!-- Spring Boot 响应式 MongoDB 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
</dependency>复制代码
同様にMySQL JDBCドライバを持つと確かにあなたは、構成データベースに行かなければなりません。application.propertiesではMongoDBの上記のスタートアップコンフィギュレーションを設定します。
名前のデータベース管理者、アカウントのパスワードもadminです。
spring.data.mongodb.host=localhost
spring.data.mongodb.database=admin
spring.data.mongodb.port=27017
spring.data.mongodb.username=admin
spring.data.mongodb.password=admin复制代码
私たちは、MySQLデータベースを使用していない理由は、大きな問題ですか?
答えは春データ反応リポジトリが現在モンゴ、カサンドラ、Redisの、Couchbaseのをサポートしていることです。それはどのような、なぜそれ、その後、MySQLをサポートしていませんか?これは、JDBCの間と春のデータの関係を示しています。
春データリポジトリ反応要点はそれが非ブロックで、反応性です。相違点は次のとおりです。
- そのような春データJPAとして春データのJDBCベースの実現は、ブロックされています。原理はに基づいてIOモデルをブロックしている
データベース・コールあたりのスレッドの消費量(接続) - java.sql.Connectionトランザクションでのみ、1つのトランザクションの動作を使用することができます。
そして、非同期JDBC新鮮なアイデアでも、非ブロッキングパッケージは、Scalaのライブラリスリック3はどのように実現されています。次のように単純な実装では動作します:
- トランザクション複数の操作は、その後のjava.sql.Connectionを共有しています。あなたはプログラミングモデルが通過するコールバックを使用して、透明なトランザクション管理を使用することができます
- 限られたアイドル状態の接続のまま
最後に、私はしっかりとすぐに、ノンブロッキングJDBCがあるだろうと信じています。だから我々は、MySQLを呼び出すために満足しています。
オブジェクト
街のエンティティ・オブジェクト・クラス内のパッケージをorg.spring.springboot.domain変更します。市(市)オブジェクト都市を変更し、次のように、コードは次のとおりです。
import org.springframework.data.annotation.Id;
/**
* 城市实体类
*
*/
public class City {
/**
* 城市编号
*/
@Id
private Long id;
/**
* 省份编号
*/
private Long provinceId;
/**
* 城市名称
*/
private String cityName;
/**
* 描述
*/
private String description;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getProvinceId() {
return provinceId;
}
public void setProvinceId(Long provinceId) {
this.provinceId = provinceId;
}
public String getCityName() {
return cityName;
}
public void setCityName(String cityName) {
this.cityName = cityName;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}复制代码
主キーまたは一意識別子に対応@Idアノテーションタグデータベーステーブル。これが私たちのDOであるため、データアクセスは、データストアに対1のマッピングオブジェクト。
MongoDBのデータアクセス層のCityRepository
CityRepository修飾クラスコードは次の通りであります:
import org.spring.springboot.domain.City;
import org.springframework.data.mongodb.repository.ReactiveMongoRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface CityRepository extends ReactiveMongoRepository<City, Long> {
}复制代码
インタフェースクラス限りCityRepositoryはReactiveMongoRepositoryを継承することができます。デフォルトでは、このようなCRUD実装と関連するクエリパラメータのリストとして多くの実装を提供します。インタフェースのReactiveMongoRepositoryデフォルトの実装は以下のとおりです。
<S extends T> Mono<S> insert(S var1);
<S extends T> Flux<S> insert(Iterable<S> var1);
<S extends T> Flux<S> insert(Publisher<S> var1);
<S extends T> Flux<S> findAll(Example<S> var1);
<S extends T> Flux<S> findAll(Example<S> var1, Sort var2);复制代码
示されているように、ReactiveMongoRepository統合クラスReactiveSortingRepositoryは、ReactiveCrudRepositoryは、多くの一般的なインタフェースを実現します:
図ReactiveCrudRepositoryインターフェイスに示すように:
また、それは見ることができる、という名前のインタフェース仕様に従うことです。次のように共通の命名規則は以下のとおりです。
- キーワード::という名前のメソッド
- そして:: findByNameAndPwd
- それとも:: findByNameOrSex
- です:: findById
- 間:: findByIdBetween
- 同様:: findByNameLike
- NotLike :: findByNameNotLike
- [並べ替え:: findByIdOrderByXDesc
- ない:: findByNameNot
次のように一般的な例では、コードは次のとおりです。
Flux<Person> findByLastname(String lastname);
@Query("{ 'firstname': ?0, 'lastname': ?1}")
Mono<Person> findByFirstnameAndLastname(String firstname, String lastname);
// Accept parameter inside a reactive type for deferred execution
Flux<Person> findByLastname(Mono<String> lastname);
Mono<Person> findByFirstnameAndLastname(Mono<String> firstname, String lastname);
@Tailable // Use a tailable cursor
Flux<Person> findWithTailableCursorBy();复制代码
ソースレベル
示すようにReactiveCrudRepository抽象化反応のパッケージ、:
ここでは、反応性のサポートもRxJavaをサポートしていることがわかります。古いCrudRepositoryに対応するReactiveCrudRepositoryインターフェースおよび様々なストレージの実装を追加しました。
そしてプロセッサベースのコントローラクラスハンドラコントローラ
変更ハンドラは、次のコード:
@Component
public class CityHandler {
private final CityRepository cityRepository;
@Autowired
public CityHandler(CityRepository cityRepository) {
this.cityRepository = cityRepository;
}
public Mono<City> save(City city) {
return cityRepository.save(city);
}
public Mono<City> findCityById(Long id) {
return cityRepository.findById(id);
}
public Flux<City> findAllCity() {
return cityRepository.findAll();
}
public Mono<City> modifyCity(City city) {
return cityRepository.save(city);
}
public Mono<Long> deleteCity(Long id) {
cityRepository.deleteById(id);
return Mono.create(cityMonoSink -> cityMonoSink.success(id));
}
}复制代码
モノラル、オブジェクトとしての彼にフラックス見知らぬ人がすることができないでください。次のように変更コントローラクラスのコントローラを続け、コードは次のとおりです。
@RestController
@RequestMapping(value = "/city")
public class CityWebFluxController {
@Autowired
private CityHandler cityHandler;
@GetMapping(value = "/{id}")
public Mono<City> findCityById(@PathVariable("id") Long id) {
return cityHandler.findCityById(id);
}
@GetMapping()
public Flux<City> findAllCity() {
return cityHandler.findAllCity();
}
@PostMapping()
public Mono<City> saveCity(@RequestBody City city) {
return cityHandler.save(city);
}
@PutMapping()
public Mono<City> modifyCity(@RequestBody City city) {
return cityHandler.modifyCity(city);
}
@DeleteMapping(value = "/{id}")
public Mono<Long> deleteCity(@PathVariable("id") Long id) {
return cityHandler.deleteCity(id);
}
}复制代码
プロジェクトを実行します
春ブーツWebfluxのCRUDが開発上のプロジェクトが完了すると、次は、検証の下でプロジェクトを実行します。ツールバーの右側を使用しIDEA、Mavenのプロジェクト]タブをクリックし、次の使用してMavenプラグインをクリックしinstall
、コマンドを。または命令Mavenのクリーンアップとインストールの実行、プロジェクトのルートディレクトリに、フォームのコマンドラインを使用します。
cd springboot-webflux-3-mongodb
mvn clean install复制代码
コンソールの出力の成功を参照してください。
... 省略
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:30 min
[INFO] Finished at: 2017-10-15T10:00:54+08:00
[INFO] Final Memory: 31M/174M
[INFO] ------------------------------------------------------------------------复制代码
行われるIDEA Application
クラスは、通常モードまたはデバッグモードを開始しました。コンソールに成功した実行の出力を見ることができます:
... 省略
2018-04-10 08:43:39.932 INFO 2052 --- [ctor-http-nio-1] r.ipc.netty.tcp.BlockingNettyContext : Started HttpServer on /0:0:0:0:0:0:0:0:8080
2018-04-10 08:43:39.935 INFO 2052 --- [ main] o.s.b.web.embedded.netty.NettyWebServer : Netty started on port(s): 8080
2018-04-10 08:43:39.960 INFO 2052 --- [ main] org.spring.springboot.Application : Started Application in 6.547 seconds (JVM running for 9.851)复制代码
必要な開発のためのオープンのPOST MANツール。次のアクションを実行します。
ニューシティ情報POST http://127.0.0.1:8080/city
MongoDBは、検証データを接続します
MongoDBの接続
docker run -it --rm --link mongo:mongo mongo mongo -u admin -p admin --authenticationDatabase admin mongo/admin复制代码
ライブラリーのリストを表示します。
show dbs复制代码
データベースを使用します
use admin复制代码
ディスプレイテーブルリスト
show collections复制代码
表が街を存在する場合は、市のフォーマットは、目次を表示しました:
db.city.find().pretty()复制代码
概要
ここでは、春WebFluxはMongoDBのを統合する方法について説明します。何が違うの上の他のストレージカサンドラ、Redisの、Couchbaseの、との統合。以下では、Thymeleaf、皆のためのより良いページ表示を統合することができるようになります。ところで、私たちは、Thymeleafの下で基本的な使い方を学ぶことになります。
ブログ記事複数のプラットフォームからこの記事OpenWriteリリース!