医院信息化与智能化系统(12)
医院信息化与智能化系统(12)
这里只描述对应过程,和可能遇到的问题及解决办法以及对应的参考链接,并不会直接每一步详细配置
如果你想通过文字描述或代码画流程图,可以试试PlantUML
,告诉GPT你的文件结构,让他给你对应的代码
预约挂号微服务模块搭建
前端知识点补充,此章节不会详细讲具体前端的每个知识点
1、MongoDB基本概念与操作
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
文档
MongoDB 的文档采用 BSON
(Binary JSON)格式存储,允许在同一个集合中的不同文档具有不同的结构。每个文档是一组键值对,
灵活性:
在关系型数据库中,每个表的结构是固定的,所有行必须包含相同的列。而在 MongoDB 中,集合中的文档可以有不同的字段,这为数据建模提供了极大的灵活性。
不同数据类型:
即使在同一个文档中,同一个字段也可以存储不同的数据类型,例如字符串、数字、数组或对象。
// 文档 1
{
"_id": 1,
"name": "Alice",
"age": 30,
"email": "alice@example.com",
"address": {
"city": "New York",
"zip": "10001"
}
}
// 文档 2
{
"_id": 2,
"name": "Bob",
"age": 25,
"email": "bob@example.com",
"hobbies": ["reading", "traveling"]
}
集合
在 MongoDB 中,集合
(Collection) 类似于关系型数据库中的表
,但有显著的不同。集合是 MongoDB 中数据存储的基本单位,用于存储一组文档
。
2、Spring boot集成mongodb
新建一个项目学习mongodb
正常创建maven项目,导入依赖,在application.properties
文件添加配置:
spring.data.mongodb.uri=mongodb://192.168.x.xx:27017/test
接着创建对应的实体类,在实体类上添加注解@Document("User")
,用于将 Java 类映射到 MongoDB 集合;同时,在字段id上添加@Id
注解用于标记该字段为文档的主键(唯一标识符)。
spring-data-mongodb提供了MongoTemplate
与MongoRepository
两种方式访问mongodb,MongoRepository操作简单,MongoTemplate操作灵活。
MongoTemplate操作
- 添加操作
//添加操作
@Test
public void demo1(){
User user = new User();
user.setAge(20);
user.setName("test");
user.setEmail("123@qq.com");
User user1 = mongoTemplate.insert(user);
System.out.println(user1);
}
- 查询操作
@Test
public void findALL(){
List<User> all = mongoTemplate.findAll(User.class);
System.out.println(all);
}
@Test
public void findId(){
User byId = mongoTemplate.findById("671f886ad9fb3d735196e141", User.class);
System.out.println(byId);
}
- 条件查询
@Test
public void findUserList(){
//查找name为“test”,同时age为20的结果
Query query = new Query(Criteria.where("name").is("test").and("age").is(20));
List<User> users = mongoTemplate.find(query, User.class);
System.out.println(users);
}
- 模糊查询
String regex = String.format("%s%s%s", "^.*", name, ".*$");:
创建一个正则表达式,用于匹配包含 name 的字符串。该表达式的组成部分为:
^.*:
表示字符串开头的任意字符(包括零个字符)。name:
插入变量 name 的值。.*$:
表示字符串结尾的任意字符(包括零个字符)。
Pattern.compile
编译正则表达式,创建一个不区分大小写的正则表达式模式 pattern。
Query(Criteria.where("name").regex(pattern)):
创建一个MongoDB查询对象,指定要查找的字段为 name,并应用前面定义的正则表达式 pattern
@Test
public void findLikeUserList(){
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));
List<User> users = mongoTemplate.find(query, User.class);
System.out.println(users);
}
- 分页查询
@Test
public void findPageUserList(){
int pageNo = 1;
int pageSize = 3;
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));
//分页构建
//查询记录数
long count = mongoTemplate.count(query, User.class);
//分页
List<User> users = mongoTemplate.find(
query.skip((pageNo - 1) * pageSize).limit(pageSize), User.class);
- 修改操作
@Test
public void updateUser(){
//根据id查询
User user = mongoTemplate.findById("67202a8ef326a746bb6b5740", User.class);
//设置修改值
user.setName("test_1");
user.setAge(50);
user.setEmail("000@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 upsert = mongoTemplate.upsert(query, update, User.class);
//影响行数
long count = upsert.getModifiedCount();
}
- 删除操作
@Test
public void deleteUser(){
Query query = new Query(Criteria.where("_id").is("67202a8ef326a746bb6b5740"));
DeleteResult remove = mongoTemplate.remove(query, User.class);
long count = remove.getDeletedCount();
System.out.println(count);
}
基于MongoRepository开发CRUD
- 创建接口(interface),继承
MongoRepository
- 在测试类创建该接口的实现类
- 测试方法
//添加操作
@Test
public void create(){
User user = new User();
user.setAge(30);
user.setName("张三");
user.setEmail("3332200@qq.com");
User user1 = userRepository.save(user);
System.out.println(user1);
}
//全部查询
@Test
public void findALL(){
List<User> all = userRepository.findAll();
System.out.println(all);
}
//根据ID查询
@Test
public void findId(){
User user = userRepository.findById("672038dfcd0e1e6c388b7316").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 findLikeUserList(){
//创建匹配器,即如何使用查询条件
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 findPageUserList(){
Sort sort = Sort.by(Sort.Direction.DESC, "age");
//设置分页参数,0 代表第一页
Pageable pageable = PageRequest.of(0, 3, sort);
//创建匹配器,即如何使用查询条件
ExampleMatcher matcher = ExampleMatcher.matching() //构建对象
.withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING) //改变默认字符串匹配方式:模糊查询
.withIgnoreCase(true); //改变默认大小写忽略方式:忽略大小写
User user = new User();
user.setName("三");
Example<User> userExample = Example.of(user, matcher);
//创建实例
Example<User> example = Example.of(user, matcher);
Page<User> pages = userRepository.findAll(example, pageable);
System.out.println(pages);
}
//修改操作
@Test
public void updateUser(){
User user = userRepository.findById("672038dfcd0e1e6c388b7316").get();
user.setName("张三_1");
user.setAge(25);
user.setEmail("883220990@qq.com");
User save = userRepository.save(user);
System.out.println(save);
}
//删除操作
@Test
public void deleteUser(){
userRepository.deleteById("672038dfcd0e1e6c388b7316");
}