一. 本次目标
完成springboot整合mongodb完成CRUD操作
二. 具体实现
1.导入坐标
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
2.application.yml配置mongodb连接
server:
port: 31001
spring:
application:
name: sc-multipl-manage-cms
data:
mongodb:
uri: mongodb://localhost:27017
database: sc_cms
3.在resources下新建logback-spring.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--定义日志文件的存储地址,使用绝对路径-->
<property name="LOG_HOME" value="d:/logs"/>
<!-- Console 输出设置 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>utf8</charset>
</encoder>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<fileNamePattern>${LOG_HOME}/xc.%d{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 异步输出 -->
<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
<discardingThreshold>0</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
<queueSize>512</queueSize>
<!-- 添加附加的appender,最多只能添加一个 -->
<appender-ref ref="FILE"/>
</appender>
<!-- 输出mongodb日志 -->
<logger name="org.springframework.data.mongodb.core" level="DEBUG"/>
<logger name="org.apache.ibatis.cache.decorators.LoggingCache" level="DEBUG" additivity="false">
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="org.springframework.boot" level="DEBUG"/>
<root level="info">
<!--<appender-ref ref="ASYNC"/>-->
<appender-ref ref="FILE"/>
<appender-ref ref="CONSOLE"/>
</root>
</configuration>
4.在实体类上添加注解标签
@Document(collection = "集合名称")
5.确认数据库对应集合的_class列(没有则创建改列)包路径是否与上面实体类路径一致,没有则更新命令如下
db.cms_page.update({"id":"abc"},{$set:{"_class":"com.chen.domain.page"}},{multi:true})
6.dao层创建 Repository接口并继承MongoRepository
MongoRepository接口已经帮我们实现了常用的增删改查方法,只要继承改接口就可以直接调用,同时也支持我们自定义一些查询方法,通过findByName1AndName2方式实现,例如
public interface CmsPageRepository extends MongoRepository<CmsPage, String> {
//根据页面名称查询
CmsPage findByPageName(String pageName);
//根据页面名称、站点Id、页面webpath查询
CmsPage findByPageNameAndSiteIdAndPageWebPath(String pageName,String siteId,String pageWebPath);
}
7.在service调用对应的方法
@Service
public class CmsPageServiceImpl implements CmsPageService {
@Autowired
CmsPageRepository cmsPageRepository;
@Override
public QueryResponseResult findAll() {
List<CmsPage> all = cmsPageRepository.findAll();
QueryResult queryResult = new QueryResult();
queryResult.setList(all);//数据列表
queryResult.setTotal(all.size());//数据总记录数
QueryResponseResult queryResponseResult = new QueryResponseResult(CommonCode.SUCCESS,queryResult);
return queryResponseResult;
}
/**
* 页面查询方法
* @param page 页码,从1开始记数
* @param size 每页记录数
* @param queryPageRequest 查询条件
* @return
*/
public QueryResponseResult findList(int page, int size, QueryPageRequest queryPageRequest){
if(queryPageRequest == null){
queryPageRequest = new QueryPageRequest();
}
//自定义条件查询
//定义条件匹配器
ExampleMatcher exampleMatcher = ExampleMatcher.matching()
.withMatcher("pageAliase", ExampleMatcher.GenericPropertyMatchers.contains());
//条件值对象
CmsPage cmsPage = new CmsPage();
//设置条件值(站点id)
if(StringUtils.isNotEmpty(queryPageRequest.getSiteId())){
cmsPage.setSiteId(queryPageRequest.getSiteId());
}
//设置模板id作为查询条件
if(StringUtils.isNotEmpty(queryPageRequest.getTemplateId())){
cmsPage.setTemplateId(queryPageRequest.getTemplateId());
}
//设置页面别名作为查询条件
if(StringUtils.isNotEmpty(queryPageRequest.getPageAliase())){
cmsPage.setPageAliase(queryPageRequest.getPageAliase());
}
//定义条件对象Example
Example<CmsPage> example = Example.of(cmsPage,exampleMatcher);
//分页参数
if(page <=0){
page = 1;
}
page = page -1;
if(size<=0){
size = 10;
}
Pageable pageable = PageRequest.of(page,size);
Page<CmsPage> all = cmsPageRepository.findAll(example,pageable);//实现自定义条件查询并且分页查询
QueryResult queryResult = new QueryResult();
queryResult.setList(all.getContent());//数据列表
queryResult.setTotal(all.getTotalElements());//数据总记录数
QueryResponseResult queryResponseResult = new QueryResponseResult(CommonCode.SUCCESS,queryResult);
return queryResponseResult;
}
//新增页面
public CmsPageResult add(CmsPage cmsPage){
//校验页面名称、站点Id、页面webpath的唯一性
//根据页面名称、站点Id、页面webpath去cms_page集合,如果查到说明此页面已经存在,如果查询不到再继续添加
CmsPage cmsPage1 = cmsPageRepository.findByPageNameAndSiteIdAndPageWebPath(cmsPage.getPageName(), cmsPage.getSiteId(), cmsPage.getPageWebPath());
if(cmsPage1==null){
//调用dao新增页面
cmsPage.setPageId(null);
cmsPageRepository.save(cmsPage);
return new CmsPageResult(CommonCode.SUCCESS,cmsPage);
}
//添加失败
return new CmsPageResult(CommonCode.FAIL,null);
}
//根据页面id查询页面
public CmsPage getById(String id){
Optional<CmsPage> optional = cmsPageRepository.findById(id);
if(optional.isPresent()){
CmsPage cmsPage = optional.get();
return cmsPage;
}
return null;
}
//修改页面
public CmsPageResult update(String id,CmsPage cmsPage){
//根据id从数据库查询页面信息
CmsPage one = this.getById(id);
if(one!=null){
//准备更新数据
//设置要修改的数据
//更新模板id
one.setTemplateId(cmsPage.getTemplateId());
//更新所属站点
one.setSiteId(cmsPage.getSiteId());
//更新页面别名
one.setPageAliase(cmsPage.getPageAliase());
//更新页面名称
one.setPageName(cmsPage.getPageName());
//更新访问路径
one.setPageWebPath(cmsPage.getPageWebPath());
//更新物理路径
one.setPagePhysicalPath(cmsPage.getPagePhysicalPath());
//提交修改
cmsPageRepository.save(one);
return new CmsPageResult(CommonCode.SUCCESS,one);
}
//修改失败
return new CmsPageResult(CommonCode.FAIL,null);
}
//根据id删除页面
public ResponseResult delete(String id){
//先查询一下
Optional<CmsPage> optional = cmsPageRepository.findById(id);
if(optional.isPresent()){
cmsPageRepository.deleteById(id);
return new ResponseResult(CommonCode.SUCCESS);
}
return new ResponseResult(CommonCode.FAIL);
}
}
8.controller测试
@RestController
@RequestMapping("/cms/page")
public class PageController implements CmsPageControllerApi {
@Autowired
CmsPageService pageService;
@Override
@GetMapping("/findAll")
public QueryResponseResult findAll() {
return pageService.findAll();
}
@Override
@GetMapping("/list/{page}/{size}")
public QueryResponseResult findList(@PathVariable("page") int page, @PathVariable("size")int size, QueryPageRequest queryPageRequest) {
//调用service
return pageService.findList(page,size,queryPageRequest);
}
@Override
@GetMapping("/get/{id}")
public CmsPage findById(@PathVariable("id") String id) {
return pageService.getById(id);
}
@Override
@PostMapping("/add")
public CmsPageResult add(@RequestBody CmsPage cmsPage) {
return pageService.add(cmsPage);
}
@Override
@PutMapping("/edit/{id}")//这里使用put方法,http 方法中put表示更新
public CmsPageResult edit(@PathVariable("id")String id, @RequestBody CmsPage cmsPage) {
return pageService.update(id,cmsPage);
}
@Override
@DeleteMapping("/del/{id}")
public ResponseResult delete(@PathVariable("id") String id) {
return pageService.delete(id);
}
}
三. 遇到的问题:使用example查不到数据:
- 具体情况:
调用Repository的findAll或findById都可以查到数据,但是一用上example使用条件查询就查不到数据. - 问题原因:
spring mongodb可以通过在实体类添加 @Document标签和在集合添加_class类实现映射关系,example也是通过这个实现条件匹配的,如果_class路径错误,就会导致查不到数据 - 解决方案:
查看数据库中 _class 列数据是否与实体类路径一致