医院信息化与智能化系统(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操作
- 添加操作
//添加操作@Testpublic 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);}
- 查询操作
@Testpublic void findALL(){List<User> all = mongoTemplate.findAll(User.class);System.out.println(all);}@Testpublic void findId(){User byId = mongoTemplate.findById("671f886ad9fb3d735196e141", User.class);System.out.println(byId);}
- 条件查询
@Testpublic 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
@Testpublic 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);}
- 分页查询
@Testpublic 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);
- 修改操作
@Testpublic 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();}
- 删除操作
@Testpublic 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
- 在测试类创建该接口的实现类
- 测试方法
//添加操作@Testpublic 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);}//全部查询@Testpublic void findALL(){List<User> all = userRepository.findAll();System.out.println(all);}//根据ID查询@Testpublic void findId(){User user = userRepository.findById("672038dfcd0e1e6c388b7316").get();System.out.println(user);}//条件查询@Testpublic 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);}//模糊查询@Testpublic 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);}//分页查询@Testpublic 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);}//修改操作@Testpublic 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);}//删除操作@Testpublic void deleteUser(){userRepository.deleteById("672038dfcd0e1e6c388b7316");}