Spring Boot 使用docker整合MongoDB
关注可以查看更多粉丝专享blog~
前言
前面简单介绍了如何使用docker安装ElasticSearch、elasticsearch-head、elasticsearch ik和elasticsearch pinyin,今天学习一下MongoDB,都是一些现在用途非常广泛的一些中间件。
ElasticSearch传送门:
Davids实操笔记:Spring Boot 使用docker整合ElasticSearch
Davids实操笔记:Spring Boot使用docker整合ElasticSearch ik分词搜索和拼音搜索
简介
MongoDB是一个文档数据库,这意味着它将数据存储在类似JSON的文档中。我们认为,这是考虑数据的最自然方法,比传统的行/列模型更具表现力和功能。
- 丰富的JSON文档
- 处理数据的最自然,最有效的方式。
- 支持数组和嵌套对象作为值。
- 允许灵活和动态的模式。
- 强大的查询语言
- 丰富而富有表现力的查询语言,无论您在文档中有多嵌套,都可以按任何字段进行过滤和排序。
- 支持聚合和其他现代用例,例如基于地理的搜索,图形搜索和文本搜索。
- 查询本身就是JSON,因此很容易组合。不再需要连接字符串来动态生成SQL查询。
- 关系数据库的所有功能,以及更多…
- 具有快照隔离的分布式多文档ACID事务。
- 支持查询联接。
- 两种类型的关系,而不是一种:引用和嵌入式。
适用场景
MongoDB 的主要目标是在键/值存储方式(提供了高性能和高度伸缩性)和传统的RDBMS 系统(具有丰富的功能)之间架起一座桥梁。
- 网站数据:Mongo 非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
- 缓存:由于性能很高,Mongo 也适合作为信息基础设施的缓存层。在系统重启之后,由Mongo 搭建的持久化缓存层可以避免下层的数据源过载。
- 大尺寸、低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储。
- 高伸缩性的场景:Mongo 非常适合由数十或数百台服务器组成的数据库,Mongo 的路线图中已经包含对MapReduce 引擎的内置支持。
- 用于对象及JSON 数据的存储:Mongo 的BSON 数据格式非常适合文档化格式的存储及查询。
安装MongoDB
// 拉取镜像
docker pull mongo
// 查看是否拉取成功
docker images
// 运行镜像,创建容器指定端口27017
docker run -itd --name mongo -p 27017:27017 mongo
// 检查容器是都启动成功
docker ps
// 进入容器
docker exec -it mongo mongo
// 创建数据库
use mydb
// 创建collection
db.createCollection('test')
// 插入数据
db.test.insert({id:1,name:'david',age:18})
前面拉取操作就不截图了,下面是启动和设置部分的截图参考
我们使用可视化工具看一下,数据已经插入成功了。
Spring Boot 整合 MongoDB
- 使用IDEA新建一个Spring Boot工程,选择web和mongodb
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
- 配置文件内容修改
application.yml
spring:
data:
mongodb:
uri: mongodb://127.0.0.1:27017/
database: mydb
application:
name: mongo-demo
server:
port: 8080
- 正常启动,下面我们编写一些代码操作MongoDB看看。
- 编写代码操作MongoDB
UserEntity代码
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Document(collection = "test")
public class UserEntity {
@Id
private Long id;
private String name;
private Integer age;
}
UserRepository 代码
import com.example.mongo.entity.UserEntity;
import org.springframework.data.mongodb.repository.MongoRepository;
import java.util.List;
public interface UserRepository extends MongoRepository<UserEntity, Long> {
List<UserEntity> findByNameLike(String name);
}
UserService 代码
import com.example.mongo.entity.UserEntity;
import java.util.List;
public interface UserService {
void save( UserEntity userEntity );
void save( List<UserEntity> userEntity );
void delete( Long id );
List<UserEntity> findByName( String name );
UserEntity findById( Long id );
}
UserServiceImpl 代码
import com.example.mongo.entity.UserEntity;
import com.example.mongo.repository.UserRepository;
import com.example.mongo.service.UserService;
import org.springframework.stereotype.Service;
import java.util.List;
import javax.annotation.Resource;
@Service
public class UserServiceImpl implements UserService {
@Resource
private UserRepository userRepository;
@Override
public void save( UserEntity userEntity ) {
userRepository.save(userEntity);
}
@Override
public void save( List<UserEntity> userEntity ) {
userRepository.saveAll(userEntity);
}
@Override
public void delete( Long id ) {
userRepository.deleteById(id);
}
@Override
public List<UserEntity> findByName( String name ) {
return userRepository.findByNameLike(name);
}
@Override
public UserEntity findById( Long id ) {
return userRepository.findById(id).orElse(new UserEntity());
}
}
MongoApplicationTests
@SpringBootTest
class MongoApplicationTests {
@Resource
private UserService userService;
@Test
void save() {
List<UserEntity> users = new ArrayList<>();
for (int i = 1; i <= 20; i++) {
UserEntity user = UserEntity.builder().id((long) i).name("Davids" + i).age(i).build();
users.add(user);
}
userService.save(users);
}
@Test
void find() {
UserEntity byId = userService.findById(1L);
System.out.println(byId);
List<UserEntity> dav = userService.findByName("1");
dav.forEach(System.out::print);
}
@Test
void update() {
userService.save(UserEntity.builder().id(1L).name("Davids edit").age(16).build());
}
@Test
void delete() {
userService.delete(1L);
}
}
总结
MongoDB使用Repository的时候我们可以如下图一样自由通过方法名来编写方法比如findByNameLike
就是根据名称模糊查询,还挺有趣的,希望大家能学以致用,共勉~