接下来介绍一下 NoSQL ,相比于 Mysql 等关系型的数据库,NoSQL (文档型数据库)由于存储的数据之间无关系,因此具备大数据量,高性能等特点,用于解决大规模数据集合多重数据种类带来的挑战,而 MongoDB 正是其中的代表,下一篇文章会介绍同类型的 Redis。
目录
1 Docker 环境下安装 MongoDB
1.1 腾讯云服务器系统选择
1.2 通过 Docker 启动 MongoDB
①获取镜像
②创建容器
③安全组
④测试连接
2 SpringBoot 连接 MongoDB 及实现简单操作
2.1 环境搭建
①创建项目
②添加配置(二选一)
③添加实体类
2.2 基于 MongoTemplate 实现 CRUD
① MongoTemplate 常用操作
② Query对象
③ MongoTemplate 测试
2.3 基于 MongoRepository 实现 CRUD
① 添加Repository类
② MongoRepository 测试
1 Docker 环境下安装 MongoDB
1.1 腾讯云服务器系统选择
趁着学生优惠购进了腾讯云轻量服务器,然后就倒腾各种服务器的配置了,为了简化搭建时的工作,直接上 Docker 容器,初次选择系统和重装系统都可以选择 Docker 镜像:
1.2 通过 Docker 启动 MongoDB
①获取镜像
docker pull mongo
输出下载 mongo 的信息👇
②创建容器
docker run --name mongo -p 27017:27017 -v ~/docker-data/mongo:/data/db -e MONGO_INITDB_ROOT_USERNAME=root -e MONGO_INITDB_ROOT_PASSWORD=root -d mongo
反馈信息👇
③安全组
④测试连接
使用 navicat 测试连接是否成功👇,这就大功告成了,Windows的话过程类似(前提是有Docker环境)~
然后在 navicat 新建数据库👇
2 SpringBoot 连接 MongoDB 及实现简单操作
2.1 环境搭建
①创建项目
通过编译器 IDEA 实现:
ⅠNew Project
Ⅱ 添加 MongoDB 依赖
也可在之前的项目的 pom.xml 文件中直接添加,Spring 是对 MongoDB 做了进一步封装,放在Spring Data。
②添加配置(二选一)
Ⅰ配置properties
若 Spring Boot 版本合适,那么配置完 properties 后,就可以实现自动注入了
路径:application.properties
#springboot MongoDB配置
spring.data.mongodb.username=root
spring.data.mongodb.password=root
spring.data.mongodb.authentication-database=root
spring.data.mongodb.database=test
spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
spring.data.mongodb.auto-index-creation=true
Ⅱ 配置properties
不过很可惜,由于我的 Spring Boot 版本过高-2.7.5,不支持自动注入MongoTemplate,因此需要手动创建 MongoDB 配置类👇
路径:src/main/java/com/yinyu/mongodemo/config/MongoDBConfig.java
@Configuration
public class MongoDBConfig{
@Bean
public MongoClient mongoClient() {
return MongoClients.create("mongodb://账号:密码@127.0.0.1:27017/");
}
@Bean
public MongoTemplate mongoTemplate() {
return new MongoTemplate(mongoClient(),"数据库");
}
}
③添加实体类
路径:src/main/java/com/yinyu/mongodemo/mongopojo/User.java
@Builder
@Data
@Document("User")
@AllArgsConstructor
@NoArgsConstructor
public class User {
@Id
private String id;
@Indexed
private String name;
private Integer age;
private String email;
private String createDate;
}
2.2 基于 MongoTemplate 实现 CRUD
① MongoTemplate 常用操作
- 新增
mongoTemplate.insert(User)
- 根据query内的查询条件删除
mongoTemplate.remove(query, User.class)
- 如果数据存在就更新,否则插入新的数据
mongoTemplate.upsert(query, update, User.class)
- 查询User文档的全部数据
mongoTemplate.findAll(User.class)
- 根据 id 查询User文档的数据
mongoTemplate.findById(<id>, User.class)
- 根据query内的查询条件查询
mongoTemplate.find(query, User.class)
② Query对象
- 形式如下👇(query 对象用来封装所有条件对象,criteria对象用来构建条件)
Query query = new Query(Criteria.where("name").is("yinyu").and("age").is(18));
Ⅰ精准条件:Criteria.and(“key”).is(“条件”)
Ⅱ 模糊条件:Criteria.and(“key”).regex(“条件”)
Ⅲ 大于:Criteria.where(“key”).gt(“条件”)
Ⅳ 小于:Criteria.where(“key”).lt(“条件”)
Ⅵ 排序:query.with(new Sort(Sort.Direction.ASC, "age"). and(new Sort(Sort.Direction.DESC, "date")))
Ⅶ 添加封装条件:一个query中只能有一个andOperator(),其中 criteria 可为多个
query.addCriteria(new Criteria().andOperator(Criteria.where("name").is("yinyu")));
③ MongoTemplate 测试
首先注入 MongoTemplate 👇
@Autowired
private MongoTemplate mongoTemplate;
Ⅰinsert 新增
@Test
public void createUser() {
User user = User.builder()
.age(18)
.name("yinyu")
.email("yinyu@163.com")
.createDate(new Date().toString()).build();
User user1 = mongoTemplate.insert(user);
System.out.println(user1);
}
可以看到数据插入成功,id 自动生成 👇 ,属于 User 类!
Ⅱ findAll 查询所有
@Test
public void findAllUser() {
List<User> userList = mongoTemplate.findAll(User.class);
userList.forEach(System.out::println);
}
查询成功👇
Ⅲ findById 根据 Id 查询
@Test
public void findByIdUser() {
User user = mongoTemplate.findById("6374e0b28c8fca48987da076",User.class);
System.out.println(user);
}
Ⅳ find 根据query内的查询条件
查询 name 包含 yin 、 age 大于 18 的记录:
@Test
public void findUser1() {
Query query = new Query(Criteria
.where("name").regex("yin")
.and("age").gt(18));
List<User> userList = mongoTemplate.find(query, User.class);
System.out.println(userList);
}
Ⅴ 添加封装条件
查询 name = yinyu 、 age = 18 的记录,可能这样会好理解一些
@Test
public void findUser2() {
Query query = new Query();
query.addCriteria(new Criteria().andOperator(Criteria.where("name").is("yinyu"),Criteria.where("age").is(18)));
List<User> userList = mongoTemplate.find(query, User.class);
System.out.println(userList);
}
@Test
public void findUser3() {
Criteria criteria = new Criteria();
criteria.andOperator(Criteria.where("name").is("yinyu"),Criteria.where("age").is(18));
List<User> userList = mongoTemplate.find(new Query(criteria), User.class);
System.out.println(userList);
}
查询成功:👇
2.3 基于 MongoRepository 实现 CRUD
Spring Data 提供了对 mongodb 数据访问的支持,我们只需要继承 MongoRepository 类,按照 Spring Data 规范就可以了。
① 添加Repository类
路径:src/main/java/com/yinyu/mongodemo/repository/UserRepository.java
@Repository
public interface UserRepository extends MongoRepository<User,String> {
}
② MongoRepository 测试
首先注入 MongoRepository 👇
@Autowired
private UserRepository userRepository;
Ⅰsave 新增
@Test
public void saveTest(){
User user = User.builder()
.age(12)
.name("yinyinyu")
.email("yinyu@163.com")
.createDate(new Date().toString()).build();
User user1 = userRepository.save(user);
System.out.println(user1);
}
新增成功👇
Ⅱ findAll 查询所有
和 MongoTemplate 不一样是,MongoRepository 的 findAll 不需要入参,因为在 Repository 类已经指定 User 类
@Test
public void findAllTest() {
List<User> userList = userRepository.findAll();
userList.forEach(System.out::println);
}
查询成功👇
Ⅲ findById 根据 id 查询
注:结尾需要加 .get 才能获得获得数据,同时也可加 isPresent 用于判断该数据是否存在
@Test
public void getByIdTest1() {
//获取数据
User user = userRepository.findById("6374e0b28c8fca48987da076").get();
System.out.println(user);
}
@Test
public void getByIdTest2() {
//判断该数据是否存在
Boolean b = userRepository.findById("6374e0b28c8fca48987da076").isPresent();
System.out.println(b);
}
Ⅳ findAll 根据Example<User>查询
@Test
public void findExampleTest1() {
User user = User.builder().name("yinyu").age(18).build();
Example<User> userExample = Example.of(user);
List<User> userList = userRepository.findAll(userExample);
userList.forEach(System.out::println);
}
Ⅴ findAll 添加匹配器-matcher 模糊查询
@Test
public void findExampleTest2() {
User user = User.builder().name("yinyu").age(18).build();
//创建匹配器,即如何使用查询条件
ExampleMatcher matcher = ExampleMatcher.matching()
.withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING) //改变默认字符串匹配方式:模糊查询
.withIgnoreCase(true); //改变默认大小写忽略方式:忽略大小写
Example<User> userExample = Example.of(user,matcher);
List<User> userList = userRepository.findAll(userExample);
System.out.println(userList);
}
参考文章
SpringBoot 2.5 整合MongoDB踩坑记录及解决方法_HellHellNo的博客-CSDN博客
SpringBoot整合MongoDB及简单的操作_活跃的咸鱼的博客-CSDN博客_springboot+mongodb项目创建