Spring Data MongoDB
spring-data对MongoDB做了支持,使用spring-data-mongodb可以简化MongoDB的操作。
1、创建工程
创建sl-express-mongodb
工程对Spring Data MongoDB的使用做基本的学习。导入依赖:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.sl-express</groupId>
<artifactId>sl-express-parent</artifactId>
<version>1.4</version>
</parent>
<groupId>com.sl-express.mongodb</groupId>
<artifactId>sl-express-mongodb</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
</dependencies>
</project>
2、配置
spring:
application:
name: sl-express-mongodb
data:
mongodb:
host: 192.168.150.101
port: 27017
database: sl
authentication-database: admin #认证数据库
username: sl
password: "123321"
auto-index-creation: true #自动创建索引
3、Entity
package com.sl.mongo.entity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.bson.types.ObjectId;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.geo.GeoJsonPoint;
import org.springframework.data.mongodb.core.index.GeoSpatialIndexType;
import org.springframework.data.mongodb.core.index.GeoSpatialIndexed;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Document("sl_person") //指定表名
public class Person {
@Id // 标识为主键
private ObjectId id;
@Indexed //标识索引字段
private String name;
private int age;
/**
* 用户位置
* x: 经度,y:纬度
*/
@GeoSpatialIndexed(type = GeoSpatialIndexType.GEO_2DSPHERE)
private GeoJsonPoint location;
//存储嵌套对象数据
private Address address;
}
package com.sl.mongo.entity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.mongodb.core.mapping.Document;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Document("sl_address") //指定表名
public class Address {
private String street;
private String city;
private String zip;
}
4、Service
package com.sl.mongo.service;
import com.sl.mongo.entity.Person;
import java.util.List;
public interface PersonService {
/**
* 新增数据
*
* @param person 数据
*/
void savePerson(Person person);
/**
* 更新数据
*
* @param person 数据
*/
void update(Person person);
/**
* 根据名字查询用户列表
*
* @param name 用户名字
* @return 用户列表
*/
List<Person> queryPersonListByName(String name);
/**
* 分页查询用户列表
*
* @param page 页数
* @param pageSize 页面大小
* @return 用户列表
*/
List<Person> queryPersonPageList(int page, int pageSize);
/**
* 根据id删除用户
*
* @param id 主键
*/
void deleteById(String id);
}
接口实现类:
package com.sl.mongo.service.impl;
import com.sl.mongo.entity.Person;
import com.sl.mongo.service.PersonService;
import org.bson.types.ObjectId;
import org.springframework.data.domain.PageRequest;
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.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class PersonServiceImpl implements PersonService {
@Resource
private MongoTemplate mongoTemplate;
@Override
public void savePerson(Person person) {
this.mongoTemplate.save(person);
}
@Override
public void update(Person person) {
//条件
Query query = Query.query(Criteria.where("id").is(person.getId()));
//更新的数据
Update update = Update.update("age", person.getAge())
.set("name", person.getName())
.set("location", person.getLocation())
.set("address", person.getAddress());
//更新数据
this.mongoTemplate.updateFirst(query, update, Person.class);
}
@Override
public List<Person> queryPersonListByName(String name) {
Query query = Query.query(Criteria.where("name").is(name)); //构造查询条件
return this.mongoTemplate.find(query, Person.class);
}
@Override
public List<Person> queryPersonPageList(int page, int pageSize) {
PageRequest pageRequest = PageRequest.of(page - 1, pageSize);
Query query = new Query().with(pageRequest);
return this.mongoTemplate.find(query, Person.class);
}
@Override
public void deleteById(String id) {
Query query = Query.query(Criteria.where("id").is(new ObjectId(id)));
this.mongoTemplate.remove(query, Person.class);
}
}
5、启动类
package com.sl.mongo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MongoApplication {
public static void main(String[] args) {
SpringApplication.run(MongoApplication.class, args);
}
}
6、测试
package com.sl.mongo.service;
import com.sl.mongo.entity.Address;
import com.sl.mongo.entity.Person;
import org.bson.types.ObjectId;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.mongodb.core.geo.GeoJsonPoint;
import javax.annotation.Resource;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest
class PersonServiceTest {
@Resource
PersonService personService;
@Test
void savePerson() {
Person person = Person.builder()
.id(ObjectId.get())
.name("张三")
.age(20)
.location(new GeoJsonPoint(116.343847, 40.060539))
.address(new Address("人民路", "上海市", "666666")).build();
this.personService.savePerson(person);
}
@Test
void update() {
Person person = Person.builder()
.id(new ObjectId("632283c08139e535c2bd7579"))
.name("张三")
.age(22) //修改数据
.location(new GeoJsonPoint(116.343847, 40.060539))
.address(new Address("人民路", "上海市", "666666")).build();
this.personService.update(person);
}
@Test
void queryPersonListByName() {
List<Person> personList = this.personService.queryPersonListByName("张三");
personList.forEach(System.out::println);
}
@Test
void queryPersonPageList() {
List<Person> personList = this.personService.queryPersonPageList(1, 10);
personList.forEach(System.out::println);
}
@Test
void deleteById() {
this.personService.deleteById("632283c08139e535c2bd7579");
}
}
数据: