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";
}
}
来源:https://www.cnblogs.com/dalianpai/p/11925496.html |