黑马程序员JavaWeb+AI Day11自己完成部分
记录黑马程序员JavaWeb+AI Day11自己完成部分的完成思路还有重点
班级管理
条件分页查询接口(难)
首先查看接口文档了解请求方式,路径还有参数

准备对应的Controller层,Service,Mapper层
Controller:
@RestController注解含@Controller说明为controller,@ResponseBody把结果封装成json,参数声明一个类来接受前端参数

把需要的参数封装成一个类,因需要把前端传过来的String类型转换成LocalDate类型需要@DateTimeFormat

观察响应格式,知道需要返回两个参数total,rows与PageHelper插件相关,利用之前写好的类来封装
total保存数据量
rows封装数据集合,这里就封装班级信息的集合
!


Service层
ClazzService接口,ClazzServiceImpl实现类(@service)

因为要给controller层返回PageResult形式,则需要获得total,和rows。
通过clazzMapper返回一个集合,再把集合强转为Page方法来调用getToal,getResult来获得两个参数进行返回。
studentsQueryParam.getPage():指定当前页码(从1开始)studentsQueryParam.getPageSize():指定每页显示的记录数
Mapper层
ClazzMapper(@Mapper)

XML:同包同名的xml文件

由AI生成sql语句
注意XML里不允许直接用<>=等符号要用

<select id="queryClazzs" resultType="org.example.pojo.Clazz">
SELECT
c.id,
c.name,
c.room,
c.begin_date ,
c.end_date ,
c.master_id ,
e.name AS masterName,
c.subject,
c.create_time ,
c.update_time ,
CASE
WHEN CURDATE() > c.end_date THEN '已结课'
When CURDATE() < c.begin_date then '未开班'
ELSE '在读中'
END AS status
FROM clazz c
LEFT JOIN emp e ON c.master_id = e.id
<where>
<if test="name != null and name != ''">
AND c.name LIKE CONCAT('%', #{name}, '%')
</if>
<if test="subject != null">
AND c.subject = #{subject}
</if>
<if test="beginDate != null and endDate != null">
AND c.begin_date between #{beginDate} and #{endDate}
</if>
</where>
ORDER BY c.update_time DESC
</select>
返回Clazz组成的集合。
则在Mapper层就返回List<Clazz>

查询所有员工接口
Controller层:
参考响应结果和请求路径,响应json格式由@RequestMapping负责



Service层
创建接口

依次实现

Mapper层
需要返回List<Emp>类型

XML映射

新增班级信息接口
接口文档:
确定请求路径和方式:@PostMapping

提前准备好sql语句

Controller层
因需要接受json格式且请求头为Post的参数
需要@RequestBody


Service层
因不需要返回特殊值直接void实现就好了

这里注意到界面有最后修改时间,所以补全内容

Mapper层

XML映射时因传入的是clazz对象,要把准备好的sql语句values改为对应的变量名才能对应

根据ID查询班级接口
提前准备sql阅读接口文档,确定get请求头


确定返回的数据为Clazz对象

Controller层
要把路径参数绑定到路径中使用@PathVariable注解

Service层
需要返回Clazz对象,所以直接简单实现


Mapper层
传入一个id,返回Clazz对象

XML

修改班级信息接口
确定请求头,以及参数格式

响应数据

Controller层
因为json格式的参数,所以需要@RequestBody,且返回Result.success();

Service层
没有特别的返回内容,所以void即可


Mapper层

XML层:
if test里是条件。注意update语句格式:update 表名 set 字段 = ()where ...
<update id="update">
update clazz
<set>
<if test="name != null">
name = #{name},
</if>
<if test="room != null">
room = #{room},
</if>
<if test="beginDate != null">
begin_date = #{beginDate},
</if>
<if test="endDate != null">
end_date = #{endDate},
</if>
<if test="masterId != null">
master_id = #{masterId},
</if>
<if test="subject != null">
subject = #{subject},
</if>
</set>
where id = #{id}
</update>
删除班级信息接口(注意Service层的处理)
路径参数就用@PathVariable,且没有特殊返回

Controller层
注意使用@PathVariable把参数和路径参数绑定

Service层(重要)
要求

创建一个自定义异常来处理有学生不能删除的情况其中extends RuntimeException让这个异常用于捕获运行时异常,super(message)让传递的具体错误信息报告给父类RuntimeException

接口

实现类中定义hasStudents方法来判断是否有学生在该班级下,如果有就抛出自定义异常ClazzHasStudentException

在全局处理器类用 @RestControllerAdvice表明是全局处理器

具体的处理方法:
@ExceptionHandler注解,当异常被抛出时就被这个处理器捕获返回给前端

Mapper层
完成查询班级人数的接口和删除接口

XML层

学员管理
准备所有的Controller,Service,ServiceImpl,Mapper,XML


查询所有班级接口
请求头,响应数据


Controller层

Service层


Mapper层

XML

条件分页查询接口

根据参数准备Param类

Controller层
让准备的Param类当参数,根据响应数据使用之前准备好的PageResult类


Service层

设置分页的参数,用一个集合接受查询出来的集合,并强转成Page<Student>来调用方法

Mapper层

XML
因为使用了pageHelper插件所以不需要写偏移量

新增学生信息接口
Post是添加,请求参数是json的数据用RequestBody注解

Controller层

Service层


因为传的参数没有剩余数据,补全
Mapper层

XML

根据ID查询学生接口
Controller层

Service层


Mapper层

XML

修改学生信息接口
请求头put,参数是json数据,返回学生对象


Controller层
接受HTTP请求体中数据映射到参数用@RequestBody注解

Service层


Mapper层

XML

具体: upate 表名 <set>...</set> where
<update id="update">
UPDATE student
<set>
<!-- 更新字段 -->
<if test="name != null and name != ''">
name = #{name},
</if>
<if test="no != null and no != ''">
no = #{no},
</if>
<if test="gender != null">
gender = #{gender},
</if>
<if test="phone != null and phone != ''">
phone = #{phone},
</if>
<if test="idCard != null and idCard != ''">
id_card = #{idCard},
</if>
<if test="isCollege != null">
is_college = #{isCollege},
</if>
<if test="address != null and address != ''">
address = #{address},
</if>
<if test="degree != null">
degree = #{degree},
</if>
<if test="graduationDate != null">
graduation_date = #{graduationDate},
</if>
<if test="violationCount != null">
violation_count = #{violationCount},
</if>
<if test="violationScore != null">
violation_score = #{violationScore},
</if>
<if test="clazzId != null">
clazz_id = #{clazzId},
</if>
<!-- 最后一个字段不需要逗号 -->
<if test="updateTime != null">
update_time = #{updateTime}
</if>
</set>
WHERE id = #{id}
</update>
删除学生信息接口(重点是参数和XML格式控制)
路径参数是数组,delete请求头,响应不需要对象

Controller层
注意因为是传递的学员id数组,我们直接用List集合来封装

Service层


Mapper层

XML层
一定要用open,和close属性来控制格式,不然sql语句会出错会变成 where id in1,2,3正确应该是in(1,2,3)

违纪处理接口
路径参数,用于修改的请求头用put

Controller层
设置正确的请求路径

Service层


Mapper层

XML:

注意,不建议在service里单独增加违纪次数,需要再调用一次update方法才能保存进数据库,建议在xml中直接书写
在service里单独增加违纪次数写法:

学员信息统计
班级人数统计接口开发
get请求头,无参数


根据响应数据创建对应的类,方便返回数据

Controller层

Service层(注意泛型用Object比较方便)

因Mapper返回的是Map构成的集合,所以要把每一个键提出来,值也提出来,然后转换成List集合

Mapper层

XML

学员学历信息统计接口开发
请求头get,无参数

响应的是Map集合

Controller层

Service层


Mapper层

XML

需求:功能完善
删除部门时:如果部门下有员工,则不允许删除该部门,并给前端提示错误信息:对不起,当前部门下有员工,不能直接删除
和删除班级接口类似:创建判断部门下是否有员工的方法,自定义异常,抛出然后用全局处理器捕获
自定义的异常

根据方法判断是否有员工,然后抛出异常

全局处理器捕获

新方法的Mapper层

总结
1.学会了请求头get查询,delete删除,put修改,post新增
2.根据响应数据、参数、sql语句返回的数据,设计每个方法的返回类型
3.XML是在同包同名下能正确映射,若不是就要配置yml文件
更多推荐


所有评论(0)