【Java开发】 Spring 03:云服务器 Docker 环境下安装 MongoDB 并连接 Spring 项目实现简单 CRUD:
创始人
2024-01-27 06:06:34
0

接下来介绍一下 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{@Beanpublic MongoClient mongoClient() {return MongoClients.create("mongodb://账号:密码@127.0.0.1:27017/");}@Beanpublic MongoTemplate mongoTemplate() {return new MongoTemplate(mongoClient(),"数据库");}}

③添加实体类

路径:src/main/java/com/yinyu/mongodemo/mongopojo/User.java

@Builder
@Data
@Document("User")
@AllArgsConstructor
@NoArgsConstructor
public class User {@Idprivate String id;@Indexedprivate 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(, 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 👇

 @Autowiredprivate 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 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 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 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 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 {}

② 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 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查询

@Test
public void findExampleTest1() {User user = User.builder().name("yinyu").age(18).build();Example userExample = Example.of(user);List 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 userExample = Example.of(user,matcher);List userList = userRepository.findAll(userExample);System.out.println(userList);
}


参考文章

SpringBoot 2.5 整合MongoDB踩坑记录及解决方法_HellHellNo的博客-CSDN博客

SpringBoot整合MongoDB及简单的操作_活跃的咸鱼的博客-CSDN博客_springboot+mongodb项目创建

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...