一、数据库简介
1、数据库
- 数据库是按照数据结构来组织、存储和管理数据的仓库;
- 我们的程序都是在内存中运行的,一旦程序运行结束或者计算机断电,程序运行中的数据都会丢失;
- 所以我们就需要将一些程序运行的数据持久化到硬盘中,以确保数据的安全性,而数据库就是数据持久化的最佳选择;
- 数据库就是存储数据的仓库;
2、数据库分类
数据库主要分为两种:关系型数据库、非关系型数据库
(1)关系型数据库
- MySQL、Oracle、DB2、SQL Server …
- 关系数据库中全都是表
(2)非关系型数据库
- MongoDB、Redis …
- 键值对数据库
- 文档数据库MongoDB
3、MongoDB简介
- MongoDB是为了快速开发互联网web应用而设计的数据库系统;
- MongoDB是设计目标是极简、灵活、作为web应用栈的一部分;
- MongoDB的数据模型是面向文档的,所谓文档是一种类似于JSON的结构,简单理解MongoDB的这个数据库中存的是各种各样的JSON(BSON:二进制JSON);
4、三个概念
- 数据库:数据库是一个仓库,在仓库中可以存放集合;
- 集合:集合类似于数组,在集合中可以存放文档;
- 文档:文档数据库中的最小单位,我们存储和操作的内容都是文档;
5、MongoDB下载安装
环境变量添加: 你的MongoDB的bin目录的路径添加到path中即可。
cmd测试:
网页测试:
5、相关命令
- mongod 用来启动服务器
- mongo 用来启动客户端
二、数据库操作
1、userRepository 和 mongoTemplate
userRepository 和 mongoTemplate 都是 Spring Data MongoDB 提供的访问 MongoDB 数据库的方式,但是它们的使用方式和适用场合有所不同。
userRepository 是 Spring Data MongoDB 提供的一个高级抽象层,可用于在 MongoDB 中执行 CRUD 操作,每一个 userRepository 都相当于一个仓库。你可以定义一个接口继承自 MongoRepository<T,ID> 类,其中 T 代表实体类,ID 代表该实体类的 ID,Spring Data MongoDB 会自动生成对应的实现类。在自动生成的实现类中,你可以使用多种查询方式,如 findXXByXX 等,它们将返回一个或者多个匹配的实体类列表。userRepository 提供了一种更简洁的方式组织和使用查询,对于单表操作可以方便的完成常规操作。
mongoTemplate 是 MongoDB 原生 Java 驱动的封装。它提供了更为底层的访问方式,可通过它执行各种 MongoDB 原生命令,例如 update、remove 等。当在 MongoDB 操作需要使用类似的聚合操作或在使用 MongoDB 4.4 引入的一些高级特性的时候,则需要使用 mongoTemplate。与 userRepository 不同,mongoTemplate 对查询语句没有任何限制,处理起复杂操作更为方便。但是需要开发人员自己编写查询语句。
简单来说,如果你仅需要在 MongoDB 中执行常规的单表 CRUD 操作,则可以考虑使用userRepository,如果需要进行更复杂的操作,则可以使用 mongoTemplate。
2、mongoTemplated 的相关操作代码
import com.example.mongdb.entity.User;
import com.mongodb.client.result.DeleteResult;
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.domain.PageRequest;
import org.springframework.data.domain.Sort;
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.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
@SpringBootTest
class MongdbApplicationTests {
@Autowired
private MongoTemplate mongoTemplate;
//添加
@Test
public void createUser() {
User user = new User();
user.setAge(10000);
user.setName("李世民");
user.setEmail("4932200@qq.com");
User user1 = mongoTemplate.insert(user);
System.out.println(user1);
}
//查询所有
@Test
public void findUser() {
List<User> userList = mongoTemplate.findAll(User.class);
System.out.println(userList);
}
//根据id查询
@Test
public void getById() {
User user = mongoTemplate.findById("64560ce42c90521b42090b8d", User.class);
System.out.println(user);
}
//条件查询
@Test
public void findUserList() {
Query query = new Query(Criteria
.where("name").is("test")
.and("age").is(20));
List<User> userList = mongoTemplate.find(query, User.class);
System.out.println(userList);
}
//模糊查询
@Test
public void findUsersLikeName() {
String name = "est";
String regex = String.format("%s%s%s", "^.*", name, ".*$");
Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
Query query = new Query(Criteria.where("name").regex(pattern));// regex 类似正则
List<User> userList = mongoTemplate.find(query, User.class);
System.out.println(userList);
// ----------------------------------------------------------------------------------------
// 使用 MongoDB 的 Java 驱动程序提供的 Criteria 和 PageRequest 类来实现
Criteria criteria = new Criteria();
criteria.and("name").regex("三");
criteria.and("email").regex("22");
// 使用PageRequest分页 并设置age降序排序
PageRequest page = PageRequest.of(0, 10, Sort.by("age").descending());
List<User> products = mongoTemplate.find(Query.query(criteria).with(page), User.class);
System.out.println(products);
}
//分页查询
@Test
public void findUsersPage() {
String name = "est";
int pageNo = 1;
int pageSize = 10;
Query query = new Query();
String regex = String.format("%s%s%s", "^.*", name, ".*$");
Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
query.addCriteria(Criteria.where("name").regex(pattern));
int totalCount = (int) mongoTemplate.count(query, User.class);
List<User> userList = mongoTemplate.find(query.skip((pageNo - 1) * pageSize).limit(pageSize), User.class);
Map<String, Object> pageMap = new HashMap<>();
pageMap.put("list", userList);
pageMap.put("totalCount",totalCount);
System.out.println(pageMap);
}
//修改
@Test
public void updateUser() {
// 根据id查询
User user = mongoTemplate.findById("64560ce42c90521b42090b8d", User.class);
// 设置修改值
user.setName("杨贵妃");
user.setAge(25);
user.setEmail("493220990@qq.com");
Query query = new Query(Criteria.where("_id").is(user.getId()));
Update update = new Update();
update.set("name", user.getName());
update.set("age", user.getAge());
update.set("email", user.getEmail());
// 调用方法实现修改
UpdateResult result = mongoTemplate.upsert(query, update, User.class);
long count = result.getModifiedCount();
System.out.println(count);
}
//删除操作
@Test
public void delete() {
Query query =
new Query(Criteria.where("_id").is("64560d1037499b2f6352a6b9"));
DeleteResult result = mongoTemplate.remove(query, User.class);
long count = result.getDeletedCount();
System.out.println(count);
}
}
3、userRepository 的相关操作代码
import com.example.mongdb.entity.User;
import com.example.mongdb.repository.UserRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.*;
import java.util.List;
@SpringBootTest
public class DemomogoApplicationTests1 {
@Autowired
private UserRepository userRepository;
//添加
@Test
public void createUser() {
User user = new User();
user.setAge(22);
user.setName("王三");
user.setEmail("3332200@qq.com");
User user1 = userRepository.save(user);
System.out.println(user1);
}
//查询所有
@Test
public void findUser() {
List<User> userList = userRepository.findAll();
System.out.println(userList);
}
//id查询
@Test
public void getById() {
User user = userRepository.findById("64561d604656851f9ff9235b").get();
System.out.println(user);
}
//条件查询
@Test
public void findUserList() {
User user = new User();
user.setName("张三");
user.setAge(20);
Example<User> userExample = Example.of(user);
List<User> userList = userRepository.findAll(userExample);
System.out.println(userList);
}
//模糊查询
@Test
public void findUsersLikeName() {
//创建匹配器,即如何使用查询条件
ExampleMatcher matcher = ExampleMatcher.matching() //构建对象
.withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING) //改变默认字符串匹配方式:模糊查询
.withIgnoreCase(true); //改变默认大小写忽略方式:忽略大小写
User user = new User();
user.setName("三");
Example<User> userExample = Example.of(user, matcher);
List<User> userList = userRepository.findAll(userExample);
System.out.println(userList);
}
//分页查询
@Test
public void findUsersPage() {
// Sort sort = Sort.by(Sort.Direction.DESC, "age");
// //0为第一页
// Pageable pageable = PageRequest.of(0, 5, sort);
// //创建匹配器,即如何使用查询条件
// ExampleMatcher matcher = ExampleMatcher.matching() //构建对象
// .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING) //改变默认字符串匹配方式:模糊查询
// .withIgnoreCase(true); //改变默认大小写忽略方式:忽略大小写
// User user = new User();
// user.setName("三");
// //创建实例
// Example<User> example = Example.of(user, matcher);
// Page<User> pages = userRepository.findAll(example, pageable);
// System.out.println(pages);
// Pageable pageable = PageRequest.of(0, 10); // 每页查询10条数据,查询第1页
// List<User> users = userRepository.findUsers(pageable);
// System.out.println(users);
String keyword = "三"; // 搜索关键字
Pageable pageable = PageRequest.of(0, 2); // 每页查询10条数据,查询第1页
List<User> users = userRepository.findUsersByRegex(keyword, pageable);
System.out.println(users);
}
//修改
@Test
public void updateUser() {
User user = userRepository.findById("64561d604656851f9ff9235b").get();
user.setName("张三_1");
user.setAge(25);
user.setEmail("883220990@qq.com");
User save = userRepository.save(user);
System.out.println(save);
}
//删除
@Test
public void delete() {
userRepository.deleteById("64561d604656851f9ff9235b");
}
}
UserRepository 接口
import com.example.mongdb.entity.User;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.mongodb.repository.Query;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface UserRepository extends MongoRepository<User,String> {
// 分页查询
@Query("{}")
List<User> findUsers(Pageable pageable);
// 模糊查询并分页
@Query("{name: {$regex: ?0, $options: 'i'}}")
List<User> findUsersByRegex(String keyword, Pageable pageable);
}
User 实体类
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
@Data
@Document("User")
public class User {
@Id
private String id;
private String name;
private Integer age;
private String email;
private String createDate;
}