使用简介:
1、MongoDB不支持事务
2、复杂查询sql较多尽量不用MongoDB
3、MongoDB插入时不需要建表,数据库会根据类进行表建立 同时表字段新增无需手动更改表结构;
4、MongoDB用于保存数据量较大数据如监控数据
1、项目集成
1.1 、pom文件中引入mongo配置信息
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
1.2 、配置文件中新增mongo的配置文件
无密码配置 ip :127.0.0.1: 端口 27000 数据库名称 test_demo
application.properties配置文件如下
spring.data.mongodb.uri=mongodb://127.0.0.1:27000/test_demo?maxPoolSize=256
yml 配置如下
spring:
data:
mongodb:
uri: mongodb://127.0.0.1:27000/test_demo?maxPoolSize=256
2、查询 包含如下功能点
2.1、模糊查询功能
2.2、分页查询功能
2.3、查询数量
2.4、范围查询
2.5、排序查询
具体代码及注释如下
package com.example.demo.controller;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* mongo测试类
*/
@RestController
public class MongoTestController {
@Autowired
private MongoTemplate mongoTemplate;
@RequestMapping
public MongoResponse queryList(@RequestBody MongoRequest request) {
MongoResponse response = new MongoResponse();
Query query = getQuery(request);
// 查询数量需要过滤分页参数信息
long count = mongoTemplate.count(query, MongoDemo.class);
// 查询条件设置分页参数
query.skip((request.getPageIndex() - 1) * request.getPageSize()).limit(request.getPageSize());
// query:查询条件 MongoDemo:查询的表名,主要是根据实体类的名字来进行识别
List<MongoDemo> mongoDemos = mongoTemplate.find(query, MongoDemo.class);
response.setList(mongoDemos);
response.setCount((int) count);
return response;
}
private Query getQuery(MongoRequest request) {
// 按照排序字段设置排序,
Query query = new Query();
// 单个字段排序
// query.with(new Sort(Sort.Direction.ASC, request.getSortField()));
//多个字段排序 排序类型 字段一 字段二
if ("ASC".equals(request.getSortType())) {
query.with(new Sort(Sort.Direction.ASC, request.getSortField(), "createDate"));
} else {
query.with(new Sort(Sort.Direction.DESC, request.getSortField(), "createDate"));
}
/**
* 范围查询
*/
if (null != request.getDates() && request.getDates().length == 2) {
query.addCriteria(Criteria.where("changeDate").gte(request.getDates()[0]).lte(request.getDates()[1]));
}
/**
* 名称模糊查找
*/
if (StringUtils.isNotBlank(request.getName())) {
query.addCriteria(Criteria.where("name").regex(".*?\\" + request.getName() + ".*"));
}
/**
* 唯一编码精确查询
*/
if (StringUtils.isNotBlank(request.getUniqueCode())) {
query.addCriteria(Criteria.where("uniqueCode").is(request.getUniqueCode()));
}
return query;
}
}
3、新增
新增有两个方法 insert和save
MongoDemo mongoDemo = new MongoDemo();
mongoTemplate.insert(mongoDemo);
mongoTemplate.save(mongoDemo);
save方法有更新和插入两种功能
insert: 若新增数据的主键已经存在,则会抛 org.springframework.dao.DuplicateKeyException 异常提示主键重复,不保存当前数据。
save: 若新增数据的主键已经存在,则会对当前已经存在的数据进行修改操作。
4、附录 附上上面代码中其他类信息
package com.example.demo.controller;
import lombok.Data;
import java.util.Date;
/**
* @Desc: mongo保存数据库对象信息
*/
@Data
public class MongoDemo {
// 名称
private String name;
// 唯一编码
private String uniquerCode;
// 创建时间
private Date createDate;
// 数据源时间信息
private Date changeDate;
//主键 可不传
private String _id;
}
package com.example.demo.controller;
import lombok.Data;
import java.util.List;
/**
* @Desc: mongo返回对象信息
*/
@Data
public class MongoResponse {
//数量
private int count;
//返回列表
private List<MongoDemo> list;
// 返回码
private String code = "success";
// 返回信息
private String msg;
}
package com.example.demo.controller;
import lombok.Data;
import java.util.Date;
/**
* @Desc: mongo请求参数信息
*/
@Data
public class MongoRequest {
/**
* 示例用于模糊查找
*/
private String name;
/**
* 示例用于精确查找
*/
private String uniqueCode;
/**
* 示例用于时间范围查找
*/
private Date[] dates;
/**
* 排序字段默认改变时间 只能是 MongoDemo 里面的某一个字段
*/
private String sortField = "changeDate";
/**
* 排序类型 默认降序 只能是DESC 或者ASC
*/
private String sortType = "DESC";
/**
* 页数 默认第一页
*/
private Integer pageIndex = 1;
/**
* 每页数量
*/
private Integer pageSize = 10;
}
网友评论