springboot整合MongoDB
导入依赖
<!--MongoDB数据库-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
配置
#默认无安全设置 如果有安全设置还得配置host、port、username、password
spring:
data:
mongodb:
uri: mongodb://localhost:27017/baicha
操作集合
集合创建
@SpringBootTest
class SpringBootMongodbDemoApplicationTests{
//注入MongoTemplate
@Autowired
private MongoTemplate mongoTemplate;
//添加CreateCollection方法 在baicha库中新建commodity商品集合
@Test
public void CreateCollection(){
mongoTemplate.createCollection("commodity");
}
}
@Test
public void CreateCollection(){
// 判断commodity集合是否存在
boolean Exists = mongoTemplate.collectionExists("commodity");
if (Exists!=true){ //集合不存在就创建,反之不创建 因为如果直接创建就会报错
mongoTemplate.createCollection("commodity");
}
}
集合删除
// 删除commodity文档
mongoTemplate.dropCollection("commodity");
文档添加
文档查询
如果我们需要吧pojo转为document,就在pojo类上添加@Document注解
如果我们要对pojo中的id字段映射成文档中的id 就在id字段上添加@Id
如果我们pojo中的字段想映射为文档中的字段,就在pojo字段上添加@Field
如果我们pojo中的字段为user但是想映射为username,所使用@Field
如果不打算吧字段映射到集合中就添加@Transient
编写User实体类并做文档适配操作
import java.util.Date;
@Document("user") //代表这个类为文档 并且数据在user集合中,不设置默认映射为实体类名
public class User {
@Id //吧这个类的id映射为文档的id
private Integer id;
@Field("username") //设置字段映射为username
private String name;
@Field
private Double salary;
@Field
private Date birthday;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getSalary() {
return salary;
}
public void setSalary(Double salary) {
this.salary = salary;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public User(Integer id, String name, Double salary, Date birthday) {
this.id = id;
this.name = name;
this.salary = salary;
this.birthday = birthday;
}
public User() {
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", salary=" + salary +
", birthday=" + birthday +
'}';
}
}
添加一条文档
// 添加一条文档
@Test
public void Add_OneDocument() {
// mongoTemplate.save(new User(1, "张三", 3200.0, new Date())); //save方法在有id的时候是更新数据
mongoTemplate.insert(new User(1, "张三", 3200.0, new Date())); //insert如果id已经存在会报错主键重复DuplicateKeyException
}
批量插入文档
// insert可以批量插入,但是save不行,只能for循环一条一条放
// 参数一:批量数据 参数二:放入哪个集合(直接字符串指定或者使用反射User.class)
mongoTemplate.insert(Arrays.asList(new User(2, "李四", 3200.0, new Date()),new User(3, "王五", 3200.0, new Date())),"user");
文档查询
查询全部文档
@Test
public void Find(){
// 查询所有
List<User> all = mongoTemplate.findAll(User.class);
all.forEach(System.out::println);
}
查询ById
@Test
public void FindById(){
// 查询一个通过id
User byId = mongoTemplate.findById(1, User.class);
System.out.println(byId);
}
条件查询
@Test
public void QueryFind(){
// 条件查询 为空就是全部查询出来
List<User> user = mongoTemplate.find(new Query(), User.class);
user.forEach(System.out::println);
}
查询包含张三的信息
@Test
public void QueryFind(){
// 条件查询 插叙name字段包张三的数据
Query query = new Query(Criteria.where("name").is("张三")); //name和username都可以,会自动转换
List<User> user = mongoTemplate.find(query, User.class);
user.forEach(System.out::println);
}
条件的种类
AND查询
@Test
public void QueryFind(){
//and查询
Query query = Query.query(Criteria.where("name").is("张三").and("salary").is(3200.0));
List<User> user = mongoTemplate.find(query, User.class);
user.forEach(System.out::println);
}
OR查询
or查询比较奇特,需要先把or的条件放到Criteria对象中再设置查询条件
@Test
public void QueryFind(){
Criteria criteria = new Criteria();
criteria.orOperator(
criteria.where("name").is("张三"),
criteria.where("name").is("李四")
);
//OR查询
Query query = Query.query(criteria);
List<User> user = mongoTemplate.find(query, User.class);
// User{id=1, name='张三', salary=3200.0, birthday=Wed Jun 15 20:45:12 CST 2022}
// User{id=2, name='李四', salary=3200.0, birthday=Wed Jun 15 20:52:12 CST 2022}
user.forEach(System.out::println);
}
AND+OR查询
@Test
public void QueryFind(){
Criteria criteria = new Criteria();
criteria.and("name").is("李四")
.orOperator(
criteria.where("name").is("张三"),
criteria.where("name").is("李四")
);
//AND+OR查询
Query query = Query.query(criteria);
List<User> user = mongoTemplate.find(query, User.class);
user.forEach(System.out::println);
}
排序查询
@Test
public void QueryFind(){
//通过salary顺序排序 asc为逆序
List<User> user = mongoTemplate.find(new Query().with(Sort.by(Sort.Order.desc("salary"))), User.class);
user.forEach(System.out::println);
}
分页查询
@Test
public void QueryFind(){
//分页查询 第0页 查询两条
List<User> user = mongoTemplate.find(new Query().with(Sort.by(Sort.Order.desc("salary"))).skip(0).limit(2), User.class);
user.forEach(System.out::println);
}
总条数查询
@Test
public void QueryFind() {
//总条数
long count = mongoTemplate.count(new Query(), User.class);
//查询name中为张三的总条数
long count1 = mongoTemplate.count(Query.query(Criteria.where("name").is("张三")), User.class);
System.out.println(count);
System.out.println(count1);
}
去重查询
@Test
public void QueryFind() {
//去重查询 参数1为条件 2为被去重字段 3为去重字段的类class 4为被去重字段的数据类型
List<Double> salary = mongoTemplate.findDistinct(new Query(), "salary", User.class, Double.class);
salary.forEach(System.out::println);
}
json查询
@Test
public void QueryFind() {
//使用json字符串查询 "{name:1}"为查询的只返回name,1为返回 0为不返回
List<User> users = mongoTemplate.find(new BasicQuery("{$or:[{name:'张三'},{name:'李四'}]}", "{name:1}"), User.class);
users.forEach(System.out::println);
}
文档更新
单条更新
@Test
public void update() {
//更新匹配的第一条数据
Update update = new Update();
update.set("name","baicha");
Query query = new Query(Criteria.where("id").is(1));
mongoTemplate.updateFirst(query, update, User.class);
}
批量更新
@Test
public void update() {
//更新匹配的第一条数据
Update update = new Update();
update.set("name", "baicha");
Query query = new Query(Criteria.where("id").is(1));
// 批量更新匹配的数据
mongoTemplate.updateMulti(query, update, User.class);
}
更新插入
@Test
public void update() {
//更新匹配的第一条数据
Update update = new Update();
update.set("name", "baicha");
// 使用自定义的id插入 不使用默认生成的
update.set("name", "baicha").setOnInsert("id",10);
Query query = new Query(Criteria.where("id").is(1));
// 更新匹配的数据,如果没有就插入
mongoTemplate.upsert(query, update, User.class);
}
文档删除
@Test
public void Reomve() {
// 删除所有
mongoTemplate.remove(new Query(),User.class);
// 删除name为王五对应的文档
mongoTemplate.remove(new Query(Criteria.where("name").is("王五")),User.class);
}