MongoDB是最流行的NoSQL数据库之一
关系数据库和MongoDB对比
SQL 术语/概念 | MongoDB 术语/概念 | 解释/说明 |
DataBase | DataBase | 数据库 |
Table | Collection | 数据库表/集合 |
Row | Document | 数据记录行/文档 |
Column | Field | 数据字段/域 |
index | index | 索引 |
Table joins | 表连接,MongoDB 不支持 | |
primary key | primary key | 主键,MongoDB 自动将 _id 字段设置为主键 |
MongoDB 和关系数据库一样有库的概念,一个 MongoDB 数据库可以有很多数据库,MongoDB 中的集合就相当于我们关系数据库中的表,文档就相当于关系数据库中的行,域就相当于关系数据库中的列,MongoDB 也支持各种索引有唯一主键,但不支持表连接查询。
1. 安装MongoDB
1.1. 使用宝塔面板在服务器上安装MongoDB
1.2. 安装后修改配置将绑定端口127.0.0.1改为0.0.0.0
127.0.0.1 只能本机程序访问
0.0.0.0 其他都可以访问
1.3. 开启安全验证
1.4. 新建数据库test1
1.5. 宝塔添加安全端口
1.6. 阿里云安全组添加端口27017
2. 使用Navicat连接MongoDB
3. idea新建一个项目测试对MongoDB进行增删改查
3.1. 创建项目 选择依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
3.2. 修改配置文件application.porperties 添加MongoDB服务器连接信息
application.porperties
spring.data.mongodb.uri=mongodb://test1:test1_123*@101.132.251.114:27017/test1
3.3. 新建实体类User
pojo/User.java
package com.example._17mongodb.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Long id;
private String username;
private String password;
}
3.4. 在测试类中编写测试,先测试增加数据
package com.example._17mongodb;
import com.example._17mongodb.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.mongodb.core.MongoTemplate;
@SpringBootTest
class ApplicationTests {
@Test
void contextLoads() {
}
// 注入MongoTemplate,用于操作MongoDB数据库
@Autowired
private MongoTemplate mongoTemplate;
@Test
void testSave() {
User user = new User(1L, "zhangsan", "123456");
System.out.println(mongoTemplate.save(user));
user = new User(2L, "lisi", "123456");
System.out.println(mongoTemplate.save(user));
}
}
3.5. 测试执行
通过宝塔面板也可以查看文档数量
3.6. 编写测试删改查数据
package com.example._17mongodb;
import com.example._17mongodb.pojo.User;
import com.mongodb.client.result.UpdateResult;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import java.util.List;
@SpringBootTest
class ApplicationTests {
@Test
void contextLoads() {
}
// 注入MongoTemplate,用于操作MongoDB数据库
@Autowired
private MongoTemplate mongoTemplate;
// 测试增加
@Test
void testSave() {
User user = new User(1L, "zhangsan", "123456");
System.out.println(mongoTemplate.save(user));
user = new User(2L, "lisi", "123456");
System.out.println(mongoTemplate.save(user));
user = new User(3L, "wangwu", "123456");
System.out.println(mongoTemplate.save(user));
}
// 测试查找
@Test
void testFind() {
// 查询单个
// User user = mongoTemplate.findById(1L, User.class);
// System.out.println(user);
// 查询所有
// mongoTemplate.findAll(User.class).forEach(System.out::println);
// 根据条件查询单个
// Query query = new Query(Criteria.where("username").is("zhangsan"));
// User user = mongoTemplate.findOne(query, User.class);
// 根据条件查询多个
Query query = new Query(Criteria.where("password").is("123456"));
List<User> users = mongoTemplate.find(query, User.class);
users.forEach(System.out::println);
}
// 测试删除
@Test
void testDelete() {
Query query = new Query(Criteria.where("id").is(3));
System.out.println(mongoTemplate.remove(query, User.class));
}
// 测试更新
@Test
void testUpdate() {
// 方式1
// Query query = new Query(Criteria.where("id").is(1));
// User user = mongoTemplate.findOne(query, User.class);
// user.setUsername("zhangsan1");
// mongoTemplate.save(user);
// 方式2
Query query = new Query(Criteria.where("id").is(1));
Update update = new Update().set("username", "zhangsan1").set("password", "111111");
UpdateResult result = mongoTemplate.updateFirst(query, update, User.class);
// UpdateResult result = mongoTemplate.updateMulti(query, update, User.class);
System.out.println(result.getMatchedCount());
}
}
3.7. 使用MongoRepository
MongoRepository类似JPA,可以根据方法名自动生成查询
3.7.1. 新建一个接口UserRepository继承MongoRepository
package com.example._17mongodb.repository;
import com.example._17mongodb.pojo.User;
import org.springframework.data.mongodb.repository.MongoRepository;
public interface UserRepository extends MongoRepository<User, Long> {
User findByUsername(String username);
}
3.7.2. 在测试类中测试UserRepository
UserRepository 提供了增删改查的方法,并按照自定义的格式生成查询
@Autowired
private UserRepository userRepository;
@Test
void testRepositoryAdd()
// 测试添加
// User user = new User(4L, "liubei", "123456");
// System.out.println(userRepository.save(user));
// user = new User(5L, "guanyu", "123456");
// System.out.println(userRepository.save(user));
// user = new User(6L, "zhangfei", "123456");
// System.out.println(userRepository.save(user));
// 测试自定义方法
// User u = userRepository.findByUsername("zhangsan");
// System.out.println(u);
for (long i = 0; i < 100; i++) {
User user = new User(i, "zhangsan" + i, "123456");
userRepository.save(user);
}
}
// 测试分页
@Test
public void testPage1() {
for (long i = 0; i < 100; i++) {
User user = new User(i, "zhangsan" + i, "123456");
userRepository.save(user);
}
}
@Test
public void testPage2() {
// List<Sort.Order> orders = new ArrayList<Sort.Order>();
// orders.add(new Sort.Order(Sort.Direction.DESC, "id"));
Sort sort = Sort.by(new Sort.Order(Sort.Direction.DESC, "id"));
Pageable pageable = PageRequest.of(2, 10, sort);
Page page = userRepository.findAll(pageable);
System.out.println("users: " + page.getContent().toString());
}