WebFlux集成Thymeleaf、Mongodb实践-SpringBoot(六)
这是泥瓦匠的第105篇原创
文章工程:
JDK1.8
Maven3.5.2
SpringBoot2.1.3.RELEASE
工程名:springboot-webflux-5-thymeleaf-mongodb
工程地址:见文末
前言
本小章节,主要还是总结下上面两讲的操作,并实现下复杂查询的小案例。那么没装MongoDB的可以进行下面的安装流程。
Docker安装MognoDB并启动如下:
1、创建挂载目录
dockervolumecreatemongo_data_db
dockervolumecreatemongo_data_configdb
2、启动MognoDB
dockerrun-d\
--namemongo\
-vmongo_data_configdb:/data/configdb\
-vmongo_data_db:/data/db\
-p27017:27017\
mongo\
--auth
3、初始化管理员账号
dockerexec-itmongomongoadmin
//容器名//mongo命令数据库名
#创建最高权限用户
db.createUser({user:'admin',pwd:'admin',roles:[{role:"root",db:"admin"}]});
4、测试连通性
dockerrun-it--rm--linkmongo:mongomongomongo-uadmin-padmin--authenticationDatabaseadminmongo/admin
MognoDB基本操作:
类似MySQL命令,显示库列表:
showdbs
使用某数据库
useadmin
显示表列表
showcollections
如果存在city表,格式化显示city表内容
db.city.find().pretty()
如果已经安装后,只要重启即可。
查看已有的镜像
dockerimages
file
然后dockerstartmogno即可,mongo是镜像唯一名词。
结构
类似上面讲的工程搭建,新建一个工程编写此案例。工程如图:
file
目录核心如下
pom.xmlMaven依赖配置
application.properties配置文件,配置mongo连接属性配置
dao数据访问层
controller展示层实现
新增POM依赖与配置
在pom.xml配置新的依赖:
<!--SpringBoot响应式MongoDB依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
</dependency>
<!--模板引擎Thymeleaf依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
类似配了MySQL和JDBC驱动,肯定得去配置数据库。在application.properties配置下上面启动的MongoDB配置:
数据库名为admin、账号密码也为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
MongoDB数据访问层CityRepository
修改CityRepository类,代码如下:
importorg.spring.springboot.domain.City;
importorg.springframework.data.mongodb.repository.ReactiveMongoRepository;
importorg.springframework.stereotype.Repository;
@Repository
publicinterfaceCityRepositoryextendsReactiveMongoRepository<City,Long>{
Mono<City>findByCityName(StringcityName);
}
CityRepository接口只要继承ReactiveMongoRepository类即可。
这里实现了通过城市名找出唯一的城市对象方法:
Mono<City>findByCityName(StringcityName);
复杂查询语句实现也很简单,只要依照接口实现规范,即可实现对应mysql的where查询语句。这里findByxxx,xxx可以映射任何字段,包括主键等。
接口的命名是遵循规范的。常用命名规则如下:
关键字::方法命名
And::findByNameAndPwd
Or::findByNameOrSex
Is::findById
Between::findByIdBetween
Like::findByNameLike
NotLike::findByNameNotLike
OrderBy::findByIdOrderByXDesc
Not::findByNameNot
处理器类Handler和控制器类Controller
修改下Handler,代码如下:
@Component
publicclassCityHandler{
privatefinalCityRepositorycityRepository;
@Autowired
publicCityHandler(CityRepositorycityRepository){
this.cityRepository=cityRepository;
}
publicMono<City>save(Citycity){
returncityRepository.save(city);
}
publicMono<City>findCityById(Longid){
returncityRepository.findById(id);
}
publicFlux<City>findAllCity(){
returncityRepository.findAll();
}
publicMono<City>modifyCity(Citycity){
returncityRepository.save(city);
}
publicMono<Long>deleteCity(Longid){
cityRepository.deleteById(id);
returnMono.create(cityMonoSink->cityMonoSink.success(id));
}
publicMono<City>getByCityName(StringcityName){
returncityRepository.findByCityName(cityName);
}
}
新增对应的方法,直接返回Mono对象,不需要对Mono进行转换,因为Mono本身是个对象,可以被View层渲染。继续修改下控制器类Controller,代码如下:
@Autowired
privateCityHandlercityHandler;
@GetMapping(value="/{id}")
@ResponseBody
publicMono<City>findCityById(@PathVariable("id")Longid){
returncityHandler.findCityById(id);
}
@GetMapping()
@ResponseBody
publicFlux<City>findAllCity(){
returncityHandler.findAllCity();
}
@PostMapping()
@ResponseBody
publicMono<City>saveCity(@RequestBodyCitycity){
returncityHandler.save(city);
}
@PutMapping()
@ResponseBody
publicMono<City>modifyCity(@RequestBodyCitycity){
returncityHandler.modifyCity(city);
}
@DeleteMapping(value="/{id}")
@ResponseBody
publicMono<Long>deleteCity(@PathVariable("id")Longid){
returncityHandler.deleteCity(id);
}
privatestaticfinalStringCITY_LIST_PATH_NAME="cityList";
privatestaticfinalStringCITY_PATH_NAME="city";
@GetMapping("/page/list")
publicStringlistPage(finalModelmodel){
finalFlux<City>cityFluxList=cityHandler.findAllCity();
model.addAttribute("cityList",cityFluxList);
returnCITY_LIST_PATH_NAME;
}
@GetMapping("/getByName")
publicStringgetByCityName(finalModelmodel,
@RequestParam("cityName")StringcityName){
finalMono<City>city=cityHandler.getByCityName(cityName);
model.addAttribute("city",city);
returnCITY_PATH_NAME;
}
新增getByName路径,指向了新的页面city。使用@RequestParam接受GET请求入参,接受的参数为cityName,城市名称。视图返回值Mono或者String都行。
Tymeleaf视图
然后编写两个视图city和cityList,代码分别如下:
city.html:
<!DOCTYPEhtml>
<htmllang="zh-CN">
<head>
<metacharset="UTF-8"/>
<title>城市</title>
</head>
<body>
<div>
<table>
<legend>
<strong>城市单个查询</strong>
</legend>
<tbody>
<tdth:text="${city.id}"></td>
<tdth:text="${city.provinceId}"></td>
<tdth:text="${city.cityName}"></td>
<tdth:text="${city.description}"></td>
</tbody>
</table>
</div>
</body>
</html>
cityList.html:
<!DOCTYPEhtml>
<htmllang="zh-CN">
<head>
<metacharset="UTF-8"/>
<title>城市列表</title>
</head>
<body>
<div>
<table>
<legend>
<strong>城市列表</strong>
</legend>
<thead>
<tr>
<th>城市编号</th>
<th>省份编号</th>
<th>名称</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<trth:each="city:${cityList}">
<tdth:text="${city.id}"></td>
<tdth:text="${city.provinceId}"></td>
<tdth:text="${city.cityName}"></td>
<tdth:text="${city.description}"></td>
</tr>
</tbody>
</table>
</div>
</body>
</html>
运行工程
一个CRUD的SpringBootWebflux工程就开发完毕了,下面运行工程验证下。使用IDEA右侧工具栏,点击MavenProjectTab,点击使用下Maven插件的install命令。或者使用命令行的形式,在工程根目录下,执行Maven清理和安装工程的指令:
cdspringboot-webflux-5-thymeleaf-mongodb
mvncleaninstall
在控制台中看到成功的输出:
...省略
[INFO]------------------------------------------------------------------------
[INFO]BUILDSUCCESS
[INFO]------------------------------------------------------------------------
[INFO]Totaltime:01:30min
[INFO]Finishedat:2017-10-15T10:00:54+08:00
[INFO]FinalMemory:31M/174M
[INFO]------------------------------------------------------------------------
在IDEA中执行Application类启动,任意正常模式或者Debug模式。可以在控制台看到成功运行的输出:
...省略
2018-04-1008:43:39.932INFO2052---[ctor-http-nio-1]r.ipc.netty.tcp.BlockingNettyContext:StartedHttpServeron/0:0:0:0:0:0:0:0:8080
2018-04-1008:43:39.935INFO2052---[main]o.s.b.web.embedded.netty.NettyWebServer:Nettystartedonport(s):8080
2018-04-1008:43:39.960INFO2052---[main]org.spring.springboot.Application:StartedApplicationin6.547seconds(JVMrunningfor9.851)
打开POSTMAN工具,开发必备。进行下面操作:
如需转载,请注明文章出处和来源网址:http://www.divcss5.com/html/h56899.shtml