粤嵌实训医疗项目(小组开发)--day05

目录

一、医生功能模块

------------前端实现------------

------------后端接口------------

功能一:分页查询医生基础信息(介绍MybatisPlus如何使用分页)

功能二:根据搜索栏名称查找对应医生(讲解自定义查询集)

功能三: 实现获取医生的详细信息

功能四:实现预约功能

功能五:根据医生科室查询医生

收获与反思


一、医生功能模块

模块需求:

粤嵌实训医疗项目(小组开发)--day05_第1张图片

本模块设计,我负责后端接口开发,另一位成员负责前端开发。

------------前端实现------------


  

  

------------后端接口------------

功能一:分页查询医生基础信息(介绍MybatisPlus如何使用分页)

//    接口
//    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.在控制层使用插件(通过案例代码解析插件使用步骤)

  1. 创建分页对象 Page page = new Page<>(pageNum, pageSize);

    • pageNum 表示当前页码,指定要查询的页数。
    • pageSize 表示每页显示的记录数,指定每页要展示多少条数据。通过这两个参数,可以确定分页查询的起始位置和返回的记录数量。
  2. 执行分页查询 IPage doctorIPage = doctorService.page(page);

    • doctorService.page(page) 是调用 doctorService 中的 page 方法来执行分页查询操作。
    • IPage 是 MyBatis-Plus 框架提供的分页结果对象,其中包含了分页查询的结果数据和总记录数。
  3. 从分页对象中获取分页数据和总记录数:

    • List pageInfoList = doctorIPage.getRecords(); 获取当前页的数据列表。
    • long total = doctorIPage.getTotal(); 获取查询结果的总记录数。

总结:

  • Page 对象是 MyBatis-Plus 提供的分页对象,用于指定当前页码和每页显示的记录数。
  • IPage 对象是分页查询的结果对象,包含了分页查询的数据列表和总记录数。
  • 通过 getRecords() 方法可以获取当前页的数据列表。
  • 通过 getTotal() 方法可以获取查询结果的总记录数。

下面介绍IPage的常用方法获取分页信息:

方法 描述
long getTotal() 获取查询结果的总记录数。
List getRecords() 获取当前页的数据列表。
int getCurrent() 获取当前页码。
int getSize() 获取每页显示的记录数。
int getPages() 获取总页数。
default boolean hasPrevious() 判断是否有上一页。
default boolean hasNext() 判断是否有下一页。
List orders() 获取排序的字段和排序方式。可以用于在分页查询时设置排序规则。

Api接口测试结果:

粤嵌实训医疗项目(小组开发)--day05_第2张图片

前端功能显示:

3条每页展示

粤嵌实训医疗项目(小组开发)--day05_第3张图片

8条每页展示

粤嵌实训医疗项目(小组开发)--day05_第4张图片


功能二:根据搜索栏名称查找对应医生(讲解自定义查询集)

//  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调试结果:

粤嵌实训医疗项目(小组开发)--day05_第5张图片

前端功能显示:

粤嵌实训医疗项目(小组开发)--day05_第6张图片


功能三: 实现获取医生的详细信息

代码如下:

//    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测试结果:

粤嵌实训医疗项目(小组开发)--day05_第7张图片

前端功能实现展示:
 

粤嵌实训医疗项目(小组开发)--day05_第8张图片


功能四:实现预约功能

@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);
    }
}

粤嵌实训医疗项目(小组开发)--day05_第9张图片


功能五:根据医生科室查询医生

//  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测试:

粤嵌实训医疗项目(小组开发)--day05_第10张图片

注意:

由于这里没有和前端沟通好,前端直接使用了elementUi中自带的种类查询,这样会导致一个问题,那就是后端给的数据在前端筛选,导致分页功能无法正常使用。

如图:

粤嵌实训医疗项目(小组开发)--day05_第11张图片

3条每页的数据只有两条,甚至一条或者空,这是因为,在前端访问后端并返回数据时候,这个页面是固定数据的3条每一页。而elementUi在此基础上进行筛选,三条数据中major==外科手术的只有两条,那么就保留两条。


收获与反思

收获:

本次我负责后端的接口开发,这次的模块功能开发,

1.让我了解了MybatisPlus的分页是如何实现的,与一般的MyBatis的区别之处。

2.然后就是自定义结果集(QueryWrapper)的基本使用。

3.MyBatisPlus提供的快速方法,进行一些基本的了解

反思:

  • 第一,代码需要规范,与前端交接时候,前端代码应该有条理性,前端模块开发中函数设计分区块,即前端自行处理的区块,和后端交互的函数区块需要分开。并且注意在函数前加上注释。否则若只给后端前端的代码,后端只能看到一坨捆绑的线团。不知所云。
  • 第二,并且需要基于事实实现对应的功能。根据数据库实际的列去实现,这里前端做的预约功能虽然看似合理,但是缺少了对应的信息填写表格。
  • 第三, 后端方面的问题,第一,返回的格式类型应该以map形式传递,这样能保证传输格式的灵活性。这里一开始就仅仅传递一个链表返回,并未考虑可能有其它参数需要返回。
  • 第四,如果写好了开发文档,请前端务必按照开发文档中来做,这里我后端其实还实现一个功能,根据科室进行查找对应的医生,但是前端中使用组件的方式,
  • 最后,在前后端的开发中一定一定要保持交流,任何的改动都需要跟对方谈好,否则会给双方带来极大的困扰!!!

你可能感兴趣的:(SpringBoot,java,开发语言)