目录
一、医生功能模块
------------前端实现------------
------------后端接口------------
功能一:分页查询医生基础信息(介绍MybatisPlus如何使用分页)
功能二:根据搜索栏名称查找对应医生(讲解自定义查询集)
功能三: 实现获取医生的详细信息
功能四:实现预约功能
功能五:根据医生科室查询医生
收获与反思
模块需求:
本模块设计,我负责后端接口开发,另一位成员负责前端开发。
- 历史搜索
-
清空历史记录
{{ search.name }}
- 热门搜索
- {{ search }}
- {{ search }}
{{ form.name }}
{{ form.introduction }}
{{ data.day.split("-")[2] }}
{{ scope.row.time }}
人数: {{ scope.row.Remain }}
{{ scope.row.Remain }}
预约
查看
预约
// 接口
// TODO:接口功能:查询医生一般信息
@RequestMapping("/list")
public String query(@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "2") Integer pageSize) throws JsonProcessingException {
// 创建分页对象
Page page = new Page<>(pageNum, pageSize);
// 执行分页查询
IPage doctorIPage = doctorService.page(page);
// 从分页对象中获取分页数据和总记录数
List pageInfoList = doctorIPage.getRecords();
long total = doctorIPage.getTotal();
// 构造返回的医生信息列表
List doctorSummaryList = new ArrayList<>();
for (Doctor doctor:pageInfoList){
doctorSummaryList.add(new DoctorSummary(doctor.getHostId(),doctor.getName(),doctor.getPhone(),doctor.getImage(),doctor.getMajor()));
}
// 返回医生不敏感信息的信息
return JsonTool.writeValueAsString(doctorSummaryList);
}
收获:MyBatis-Plus的分页插件与MyBatis的PageHelper的区别和使用。
区别:
使用范围:
- MyBatis-Plus 是一个全面的持久层框架,提供了更多的 CRUD 操作和通用的数据库操作,同时包含了一些方便的工具类和增强功能。
- PageHelper 是一个简单且专注于分页功能的插件,主要用于处理基本的分页查询需求,不包含其他复杂的数据库操作。
使用方式:
- MyBatis-Plus 的分页插件是内置在框架中的,无需额外引入依赖,可以直接使用其中的
Page
类进行分页查询,并且提供了丰富的分页查询方法。- PageHelper 需要单独引入依赖,根据具体的项目和需求选择相应的版本。使用 PageHelper 需要在 MyBatis 的配置文件中进行配置,并通过拦截器实现分页功能。
API 和功能支持:
- MyBatis-Plus 提供了更多的 API 和功能,如分页查询、排序、条件查询、自定义查询等。同时也支持 Lambda 表达式来简化条件查询的编写。
- PageHelper 的功能相对较为简单,主要提供了基本的分页功能,可以通过设置分页参数进行分页查询。
使用MyBatisPlus的方法,如下:
1.引入mybatis-plus依赖
com.baomidou
mybatis-plus-boot-starter
3.3.1.tmp
2.进行配置,在config包下写对应配置类,按照如下代码进行配置
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
// 创建 MybatisPlusInterceptor 对象
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 创建并添加 PaginationInnerInterceptor 分页拦截器
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
interceptor.addInnerInterceptor(paginationInnerInterceptor);
// 返回 MybatisPlusInterceptor 对象,作为一个 Bean 注入到 Spring 容器中
return interceptor;
}
}
3.在控制层使用插件(通过案例代码解析插件使用步骤)
创建分页对象 Page
:
pageNum
表示当前页码,指定要查询的页数。pageSize
表示每页显示的记录数,指定每页要展示多少条数据。通过这两个参数,可以确定分页查询的起始位置和返回的记录数量。执行分页查询 IPage
:
doctorService.page(page)
是调用 doctorService
中的 page
方法来执行分页查询操作。IPage
是 MyBatis-Plus 框架提供的分页结果对象,其中包含了分页查询的结果数据和总记录数。从分页对象中获取分页数据和总记录数:
List pageInfoList = doctorIPage.getRecords();
获取当前页的数据列表。long total = doctorIPage.getTotal();
获取查询结果的总记录数。总结:
Page
对象是 MyBatis-Plus 提供的分页对象,用于指定当前页码和每页显示的记录数。IPage
对象是分页查询的结果对象,包含了分页查询的数据列表和总记录数。- 通过
getRecords()
方法可以获取当前页的数据列表。- 通过
getTotal()
方法可以获取查询结果的总记录数。
下面介绍IPage的常用方法获取分页信息:
方法 | 描述 |
---|---|
long getTotal() |
获取查询结果的总记录数。 |
List |
获取当前页的数据列表。 |
int getCurrent() |
获取当前页码。 |
int getSize() |
获取每页显示的记录数。 |
int getPages() |
获取总页数。 |
default boolean hasPrevious() |
判断是否有上一页。 |
default boolean hasNext() |
判断是否有下一页。 |
List |
获取排序的字段和排序方式。可以用于在分页查询时设置排序规则。 |
Api接口测试结果:
前端功能显示:
3条每页展示
8条每页展示
// TODO:根据搜索栏查找对应医生
@RequestMapping("/SerchByName")
public String SerchByName(@RequestParam("name")String name,
@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "8") Integer pageSize) throws JsonProcessingException {
// 创建分页对象
Page page = new Page<>(pageNum,pageSize);
// 自定义查询
QueryWrapper wrapper = new QueryWrapper<>();
wrapper.eq("name",name);
// 创建分页结果对象
IPage iPage = doctorService.page(page,wrapper);
List list = iPage.getRecords();
List doctorSummaryList = new ArrayList<>();
for (Doctor doctor:list){
doctorSummaryList.add(new DoctorSummary(doctor.getHostId(),doctor.getName(),doctor.getPhone(),doctor.getImage(),doctor.getMajor()));
}
return JsonTool.writeValueAsString(doctorSummaryList);
}
收获:学习查询模块的使用(QueryWrapper)
使用步骤(三层框架)
1.首先创建QueryWrapper对象
2.通过调用对象内部方法完善自定义查询的条件,以下是常用的方法
方法名 | 说明 |
---|---|
eq | 设置等于条件 |
ne | 设置不等于条件 |
gt | 设置大于条件 |
ge | 设置大于等于条件 |
lt | 设置小于条件 |
le | 设置小于等于条件 |
between | 设置范围条件 |
like | 设置模糊查询条件 |
in | 设置包含在列表中的条件 |
orderByAsc | 设置升序排序字段 |
orderByDesc | 设置降序排序字段 |
and | 设置并且连接的条件 |
or | 设置或者连接的条件 |
last | 直接拼接在 SQL 语句的最后 |
select | 设置要查询的字段 |
groupBy | 设置分组字段 |
having | 设置聚合条件 |
3.通过自动注入对应的service层,实现对应的操作
MyBatisPlus扩展下service层的所有快捷方法:
方法名 | 作用 |
---|---|
save | 保存实体对象到数据库 |
saveBatch | 批量保存实体对象到数据库 |
removeById | 根据ID删除数据库中的记录 |
removeByMap | 根据条件删除数据库中的记录 |
remove | 根据条件删除数据库中的记录 |
removeByIds | 根据ID列表批量删除数据库中的记录 |
updateById | 根据ID更新数据库中的记录 |
update | 根据条件更新数据库中的记录 |
updateBatchById | 根据ID列表批量更新数据库中的记录 |
saveOrUpdate | 如果存在则更新,否则保存实体对象到数据库 |
getById | 根据ID从数据库中查询对应的记录 |
listByIds | 根据ID列表从数据库中查询对应的记录 |
listByMap | 根据条件从数据库中查询对应的记录 |
getOne | 根据条件从数据库中查询一条记录 |
getMap | 根据条件从数据库中查询一条记录,并返回Map形式的结果 |
getObj | 根据条件从数据库中查询一条记录,并通过自定义函数进行映射转换 |
count | 计算数据库中符合条件的记录数量 |
list | 根据条件从数据库中查询多条记录 |
page | 根据条件从数据库中分页查询记录 |
listMaps | 根据条件从数据库中查询多条记录,并以Map形式返回结果 |
listObjs | 根据条件从数据库中查询多条记录,并返回Object类型的结果列表 |
pageMaps | 根据条件从数据库中分页查询记录,并以Map形式返回结果 |
getBaseMapper | 获取基础的Mapper接口,用于执行底层的数据库操作 |
getEntityClass | 获取实体类的Class对象 |
query | 创建一个QueryChainWrapper对象,用于构建查询条件 |
lambdaQuery | 创建一个LambdaQueryChainWrapper对象,用于构建Lambda表达式查询条件 |
ktQuery | 创建一个KtQueryChainWrapper对象,用于构建Kotlin DSL查询条件 |
ktUpdate | 创建一个KtUpdateChainWrapper对象,用于构建Kotlin DSL更新条件 |
update | 创建一个UpdateChainWrapper对象,用于构建更新条件 |
lambdaUpdate | 创建一个LambdaUpdateChainWrapper对象,用于构建Lambda表达式更新条件 |
saveOrUpdate | 如果存在则根据条件更新数据库中的记录,否则保存实体对象到数据库 |
api调试结果:
前端功能显示:
代码如下:
// TODO:获取医生的详细信息
@RequestMapping("/getDetail")
public String getDetail(@RequestParam("id") Integer id) throws JsonProcessingException {
QueryWrapper wrapper = new QueryWrapper<>();
wrapper.eq("id",id);
Doctor doctorServiceById = doctorService.getOne(wrapper);
DoctorDetailSummary doctorDetailSummary =
new DoctorDetailSummary(doctorServiceById.getHostId(),
doctorServiceById.getName(),
doctorServiceById.getPhone(),
doctorServiceById.getImage(),
doctorServiceById.getMajor(),
doctorServiceById.getSchool());
return JsonTool.writeValueAsString(doctorDetailSummary);
}
这个功能需要前端在展示医生基础数据时候,还能进行查看更多详细但是不敏感的信息。
api测试结果:
前端功能实现展示:
@RestController
@RequestMapping("/vaccinum/registration")
public class RegistrationController {
@Autowired
IRegistrationService registrationService;
ObjectMapper JSon_Tool = new ObjectMapper();
@RequestMapping("/insert")
public String register(Registration registration) throws JsonProcessingException {
HashMap map = new HashMap();
boolean save = registrationService.save(registration);
map.put("flag",save);
return JSon_Tool.writeValueAsString(map);
}
}
// TODO:根据医院的科室查询对应医生
@RequestMapping("/SerchByMajor")
public String SerchByMajor(@RequestParam("major") String major,
@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "8") Integer pageSize) throws JsonProcessingException {
HashMap map = new HashMap<>();
Page page = new Page<>(pageNum,pageSize);
QueryWrapper wrapper = new QueryWrapper<>();
wrapper.eq("major",major);
IPage iPage = doctorService.page(page,wrapper);
List list = iPage.getRecords();
// 获取信息
List doctorSummaryList = new ArrayList<>();
for (Doctor doctor:list){
doctorSummaryList.add(new DoctorSummary(doctor.getHostId(),doctor.getName(),doctor.getPhone(),doctor.getImage(),doctor.getMajor()));
}
map.put("list",doctorSummaryList);
map.put("total",iPage.getTotal());
return JsonTool.writeValueAsString(doctorSummaryList);
}
Apifox测试:
注意:
由于这里没有和前端沟通好,前端直接使用了elementUi中自带的种类查询,这样会导致一个问题,那就是后端给的数据在前端筛选,导致分页功能无法正常使用。
如图:
3条每页的数据只有两条,甚至一条或者空,这是因为,在前端访问后端并返回数据时候,这个页面是固定数据的3条每一页。而elementUi在此基础上进行筛选,三条数据中major==外科手术的只有两条,那么就保留两条。
收获:
本次我负责后端的接口开发,这次的模块功能开发,
1.让我了解了MybatisPlus的分页是如何实现的,与一般的MyBatis的区别之处。
2.然后就是自定义结果集(QueryWrapper)的基本使用。
3.MyBatisPlus提供的快速方法,进行一些基本的了解
反思:
- 第一,代码需要规范,与前端交接时候,前端代码应该有条理性,前端模块开发中函数设计分区块,即前端自行处理的区块,和后端交互的函数区块需要分开。并且注意在函数前加上注释。否则若只给后端前端的代码,后端只能看到一坨捆绑的线团。不知所云。
- 第二,并且需要基于事实实现对应的功能。根据数据库实际的列去实现,这里前端做的预约功能虽然看似合理,但是缺少了对应的信息填写表格。
- 第三, 后端方面的问题,第一,返回的格式类型应该以map形式传递,这样能保证传输格式的灵活性。这里一开始就仅仅传递一个链表返回,并未考虑可能有其它参数需要返回。
- 第四,如果写好了开发文档,请前端务必按照开发文档中来做,这里我后端其实还实现一个功能,根据科室进行查找对应的医生,但是前端中使用组件的方式,
- 最后,在前后端的开发中一定一定要保持交流,任何的改动都需要跟对方谈好,否则会给双方带来极大的困扰!!!