当前位置 博文首页 > RtxTitanV的博客:SpringBoot2.x 集成 SpringDataMongoDB
本文主要对SpringBoot2.x集成SpringDataMongoDB及其基本使用进行简单总结,其中SpringBoot使用的2.4.5
版本。
MongoDB是一个通用的、基于文档的分布式数据库,它将数据存储在类似JSON的文档中。
Spring Data MongoDB是Spring Data项目的一部分,该项目旨在为新的数据存储提供熟悉且一致的基于Spring的编程模型,同时保留存储的特定特性和功能。Spring Data MongoDB项目提供与MongoDB文档数据库的集成。Spring Data MongoDB的关键功能领域是以POJO为中心的模型,用于与MongoDB的DBCollection交互并轻松编写Repository风格的数据访问层。
通过maven新建一个名为springboot-data-mongodb
的项目。
<!-- Spring Data MongoDB 起步依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- lombok插件 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
</dependency>
在application.yml
中进行如下配置:
spring:
data:
mongodb:
# MongoDB的uri连接
# 集群可以配置为mongodb://username:password@ip:port,ip:port,ip:port
uri: mongodb://root:root@localhost:27017/admin
# 数据库
database: test
# 输出nosql日志
logging:
level:
org:
springframework:
data:
mongodb:
core: debug
package com.rtxtitanv.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.bson.types.ObjectId;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;
import java.time.LocalDateTime;
/**
* @author rtxtitanv
* @version 1.0.0
* @name com.rtxtitanv.model.User
* @description 用户实体类
* @date 2021/5/26 18:34
*/
@Accessors(chain = true)
@AllArgsConstructor
@NoArgsConstructor
@Data
@Document(collection = "user")
public class User {
@Id
private ObjectId id;
@Field(name = "username")
private String username;
@Field(name = "password")
private String password;
@Field(name = "realname")
private String realname;
@Field(name = "gender")
private String gender;
@Field(name = "age")
private Integer age;
@Field(name = "email")
private String email;
@Field(name = "user_point")
private Integer userPoint;
@Field(value = "user_level")
private Byte userLevel;
@Field(name = "birthday")
private LocalDateTime birthday;
}
MongoDB要求要为所有文档的设置一个_id
字段(field)。如果没有提供,驱动程序将会一个分配一个带有生成值的ObjectId
。用@Id
(org.springframework.data.annotation.Id
)注解的属性或域(field)会映射到_id
字段。没有注解但名为id
的属性或域也会映射到_id
字段。
几个常用的映射注解:
@Id
:应用于域上,以标记用于身份识别的字段(主键)。@MongoId
:应用于域上,以标记用于身份识别的字段(主键)。接受一个可选的FieldType
来自定义id转换。@Document
:应用于类上,表示这个类是映射到数据库的候选。可以指定存储数据的集合的名称。@Indexed
:应用于域上,描述如何对字段进行索引。@CompoundIndex
(可重复):应用于类上,声明复合索引。@Transient
:默认情况下,所有实例域都被映射到文档中。这个注解排除了它所应用的实例域被存储在数据库中。Transient属性不能在持久化构造函数中使用,因为转换器不能为构造函数参数具体化一个值。@Field
:应用于域上,它允许描述字段的名称和类型。@Version
:应用于域上,用于乐观锁,并在保存操作中检查是否有修改。初始值为0(原始类型为1),在每次更新时都会自动增加。package com.rtxtitanv.repository;
import com.rtxtitanv.model.User;
import org.bson.types.ObjectId;
import org.springframework.data.mongodb.repository.MongoRepository;
/**
* @author rtxtitanv
* @version 1.0.0
* @name com.rtxtitanv.repository.UserRepository
* @description UserRepository用来操作用户集合,此处的集合是MongoDB中的术语
* @date 2021/5/26 18:34
*/
public interface UserRepository extends MongoRepository<User, ObjectId> {}
MongoRepository<User, ObjectId>
中的类型参数User
为实体类型,ObjectId
为主键类型。
package com.rtxtitanv;
import com.rtxtitanv.repository.UserRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
/**
* @author rtxtitanv
* @version 1.0.0
* @name com.rtxtitanv.MongodbTest
* @description SpringDataMongoDB单元测试类
* @date 2021/5/26 18:11
*/
@SpringBootTest
class MongodbTest {
@Resource
private UserRepository userRepository;
private static Logger logger = LoggerFactory.getLogger(MongodbTest.class);
}
MongoRepository
接口中常用的数据操作方法:
继承MongoRepository
接口之后就可以直接使用这些方法。在进行测试之前MongoDB的test数据库中没有Collection:
保存5条测试文档:
/**
* 保存测试,这里保存5条测试文档,一次插入一条文档
* 使用方法 <S extends T> S save(S var1)
*/
@Test
void testSave() {
User user;
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
user = userRepository.save(new User().setUsername("guanyuchang123").setPassword("a123456").setRealname("关羽")
.setGender("男").setAge(28).setEmail("yunchang@xxx.com").setUserPoint(100).setUserLevel(Byte.valueOf("1"))
.setBirthday(LocalDateTime.parse("1992-10-01 17:15:20", dateTimeFormatter)));
logger.info(user.toString());
user = userRepository.save(new User().setUsername("qiaolaoda888").setPassword("ss0635gh").setRealname("大乔")
.setGender("女").setAge(20).setEmail("daqiao@xxx.com").setUserPoint(360).setUserLevel(Byte.valueOf("1"))
.setBirthday(LocalDateTime.parse("2000-12-25 13:22:32", dateTimeFormatter)));
logger.info(user.toString());
user = userRepository.save(new User().setUsername("feige45").setPassword("qwer1234aa").setRealname("张飞")
.setGender("男").setAge(25).setEmail("yide@xxx.com").setUserPoint(1000).setUserLevel(