MongoDB
MongoDB是 open-source NoSQL 文档数据库,它使用 JSON-like schema 而不是传统的 table-based 关系数据。 Spring Boot 提供了一些使用 MongoDB 的便利,包括spring-boot-starter-data-mongodb
和spring-boot-starter-data-mongodb-reactive
“Starters”。
连接到 MongoDB 数据库
要访问 Mongo 数据库,可以 inject auto-configured org.springframework.data.mongodb.MongoDbFactory
。默认情况下,实例尝试在mongodb://localhost/test
处连接到 MongoDB 服务器。以下 example 显示如何连接到 MongoDB 数据库:
import org.springframework.data.mongodb.MongoDbFactory; import com.mongodb.DB; @Component public class MyBean { private final MongoDbFactory mongo; @Autowired public MyBean(MongoDbFactory mongo) { this.mongo = mongo; } // ... public void example() { DB db = mongo.getDb(); // ... } }
您可以设置spring.data.mongodb.uri
property 来更改 URL 并配置其他设置,例如副本集,如以下 example 所示:
spring.data.mongodb.uri=mongodb://user:[emailprotected]:12345,mongo2.example.com:23456/test
或者,当您使用 Mongo 2.x 时__,您可以指定host
/port
。例如,您可以在application.properties
中声明以下设置:
spring.data.mongodb.host=mongoserver
spring.data.mongodb.port=27017
如果你已经定义了自己的MongoClient
,它将被用于 auto-configure 一个合适的MongoDbFactory
。支持com.mongodb.MongoClient
和com.mongodb.client.MongoClient
。
如果使用 Mongo 3.0 Java 驱动程序,则不支持
spring.data.mongodb.host
和spring.data.mongodb.port
。在这种情况下,应使用spring.data.mongodb.uri
来提供所有 configuration。
如果未指定
spring.data.mongodb.port
,则使用默认值27017
。您可以从前面显示的 example 中删除此 line。
如果你不使用 Spring Data Mongo,你可以 inject
com.mongodb.MongoClient
beans 而不是MongoDbFactory
。如果要完全控制建立 MongoDB 连接,还可以声明自己的MongoDbFactory
或MongoClient
bean。
如果您使用 reactive 驱动程序,则 SSL 需要 Netty。如果 Netty 可用,则 auto-configuration 会自动配置此工厂,并且尚未自定义要使用的工厂。
MongoTemplate
Spring Data MongoDB提供了MongoTemplate class,其设计与 Spring 的JdbcTemplate
非常相似。与JdbcTemplate
,Spring Boot auto-configures _ bean 一样,您可以 inject 模板,如下所示:
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.stereotype.Component; @Component public class MyBean { private final MongoTemplate mongoTemplate; @Autowired public MyBean(MongoTemplate mongoTemplate) { this.mongoTemplate = mongoTemplate; } // ... }
Spring Data MongoDB Repositories
Spring Data 包括 MongoDB 的 repository 支持。与前面讨论的 JPA repositories 一样,基本原则是基于方法名称自动构造查询。
实际上,Spring Data JPA 和 Spring Data MongoDB 共享相同的 common 基础结构。您可以从之前获取 JPA example,假设City
现在是 Mongo 数据 class 而不是 JPA @Entity
,它的工作方式相同,如下面的示例所示:
package com.example.myapp.domain; import org.springframework.data.domain.*; import org.springframework.data.repository.*; public interface CityRepository extends Repository<City, Long> { Page<City> findAll(Pageable pageable); City findByNameAndStateAllIgnoringCase(String name, String state); }
创建用户
[root@topcheer ~]# docker exec -it mongo mongo admin MongoDB shell version v4.2.1 connecting to: mongodb://127.0.0.1:27017/admin?compressors=disabled&gssapiServiceName=mongodb Implicit session: session { "id" : UUID("7ff60ffe-767d-4982-bd97-6a872157cc05") } MongoDB server version: 4.2.1 > db.createUser({ user:'admin',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'}]}); Successfully added user: { "user" : "admin", "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] } > db.auth('admin', '123456') 1 > use test; switched to db test > db.createUser({ user: 'test', pwd:'123456', roles: [ {role:"dbOwner",db:"test"}]}); Successfully added user: { "user" : "test", "roles" : [ { "role" : "dbOwner", "db" : "test" } ] } > exit bye
配置
spring: application: name: spring-boot-mongodb data: mongodb: uri: mongodb://test:123456@192.168.180.113:27017/test
构建项目
我们使用IDEA
创建一个新的SpringBoot
项目,在pom.xml
配置文件内添加我们本章所需要的依赖,如下所示:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
根据mongodb
的依赖我们可以看到Spring
家族式的设计,把所有操作数据的依赖都进行归类到spring-boot-starter-data-xxx
下,我们比较常用到的如:spring-boot-starter-data-jpa
、spring-boot-starter-data-redis
等。
MongoRepository
spring-boot-starter-data-mongodb
确实采用了跟spring-boot-starter-data-jpa
同样的方式来完成接口代理类的生成,并且提供了一些常用的单个对象操作的公共方法,MongoRepository
接口作用与JPARepository
一致,继承了该接口的业务数据接口
就可以提供一个被Spring IOC
托管的代理实现类,这样我们在注入业务数据接口
时就会完成代理实现类的注入。
废话不多说了,下面我们直接来创建一个名为UserRepository 的数据接口,该接口继承MongoRepository<T,PK>
,如下所示:
public interface UserRepository extends MongoRepository<UserInfo,Long> { }
MongoRepository <T,PK>
同样也是采用了两个泛型参数,T
:实体类类型。PK
:T
实体类内的主键类型,如:Long。
自定义实体类
public class UserInfo { @Id private Long id; private String username; private String password; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public UserInfo(Long id, String username, String password) { this.id = id; this.username = username; this.password = password; } }
测试
@RestController public class UserController { @Autowired private UserRepository userRepository; //http://localhost:8080/save @GetMapping("save") public String save(){ UserInfo userInfo = new UserInfo(System.currentTimeMillis(),"用户"+System.currentTimeMillis(),"123"); userRepository.save(userInfo); return "success"; } //http://localhost:8080/getUserList @GetMapping("getUserList") public List<UserInfo> getUserList(){ List<UserInfo> userInfoList = userRepository.findAll(); return userInfoList; } //http://localhost:8080/delete?id=1525503798382 @GetMapping("delete") public String delete(Long id){ userRepository.deleteById(id); return "success"; } //http://localhost:8080/update?id=1525503912550&username=111&password=222 @GetMapping("update") public String update(Long id,String username,String password){ UserInfo userInfo = new UserInfo(id,username,password); userRepository.save(userInfo); return "success"; } }