欢迎来到DIVCSS5查找CSS资料与学习DIV CSS布局技术!
  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