目录
员工管理:
删除员工:
明确三层架构职责:
Controller层:
1.接受参数(ID值)
2.调用Service层
3.响应结果
Service层:
1.调用Mapper接口方法,批量删除员工基本信息
2.调用Mapper接口方法,批量删除员工的工作经历信息
Mapper接口:
执行SQL语句
接受参数的两种方式:
方式一:在Controller方法中通过数组来接收
@DeleteMapping
public Result delete(Integer[] ids){
log.info("根据id删除员工:{}",ids);
return Result.success();
}
方法二:在Controller方法中通过集合来接收
public Result delete(@RequestParam List<Integer> ids){
log.info("根据id批量删除员工:{}",ids);
return Result。success();
}
Service层:
@Transactional(rollbackFor = {Exception.class})
public void deleteByIds(List<Integer> ids){
//1.根据ID删除员工基本信息
empMapper.deleteByIds(ids);
//2.根据ID删除员工的工作经历
empExprMapper.deleteByEmpIds(ids);
}
Mapper层xml:
//根据ID批量删除员工信息
<delete id="deleteByIds">
delete from emp where id in
<foreach collection="ids" item="id" separator="," open="(" close=")">
#{id}
</foreach>
</delete>
//根据员工ID批量删除员工工作经历信息
<delete id="deleteByEmpIds">
delete from emp_expr where emp_id in
<foreach collection="empIds" item="empId" separator="," open="(" close=")"
#{empId}
</foreach>
</delete>
修改员工:
查询回显:
明确三层架构职责:
Controller层:
1.接受参数(ID值)
2.调用Service层
3.响应结果
Service层:
1.调用Mapper接口方法,查询员工详细信息
Mapper接口:
执行SQL语句
方法实现:
Controller层:
//根据ID查询员工信息
@GetMapping("/{id}")
public Result getInfo(@PathVariable Integer id){
log.info("根据ID查询员工信息:{}",id);
Emp emp = empService.getInfo(id);
return Result.success(emp);
}
Service层:
@Override
public Emp getInfo(Integer id){
return empMapper.getById(id);
}
Mapper层:
//根据ID查询员工基本信息及员工的工作经历信息
<select id="empResultMap" resultType="包名">
select e.*,ee.id ee_id,ee.emp_id ee_empid,ee.begin ee_end,ee.end ee_end,ee.companyee_company, ee.job ee_job from emp e left join emp_expr ee on e.id = ee.emp_id where e.id = #{id}
</select>
//定义ResultMap手动封装属性
<resultMap id="empResultMap" type="包名"/>
<id column="id" property="id"/>
<result cloumn="username" property="username"/>
<result cloumn="password" property="password"/>
<result cloumn="name" property="name"/>
<result cloumn="gender" property="gender"/>
<result cloumn="phone" property="phone"/>
<result cloumn="job" property="job"/>
<result cloumn="salary" property="salary"/>
<result cloumn="image" property="image"/>
<result cloumn="entry_date" property="entry_date"/>
<result cloumn="dept_id" property="dept_id"/>
<result cloumn="create_time" property="create_time"/>
<result cloumn="update_time" property="update_time"/>
//封装工作经历信息
<collection property="exprList" ofType="包名">
<id cloumn="ee_id" property="id"/>
<result cloumn="ee.empid" property="ee.empid"/>
<result cloumn="ee_begin" property="ee_begin"/>
<result cloumn="ee_end" property="ee_end"/>
<result cloumn="ee_company" property="ee_company"/>
<result cloumn="ee_job" property="ee_job"/>
</collection>
</resultMap>
因为实体类里面有对象也有属性所以需要resultMap手动封装
如果查询返回的字段名与实体的属性名可以直接对应上,用resultType
如果查询返回的字段名和实体的属性名对应不上,或实体属性比较复杂,也可以通过resultMap手动封装
修改数据:
明确三层架构职责:
Controller层:
1.接受参数
2.调用Service层
3.响应结果
Service层:
1.根据ID修改员工的基本信息
2.根据ID修改工作经历信息(先删除再添加)
Mapper接口:
执行SQL语句
方法实现:
Controller层:
@PutMapping
public Result update(@RequestBody Emp emp){
log.info("修改员工:{}",emp);
empService.update(emp);
return Result.success();
}
Service层:
@Override
public void update(Emp emp){
//1.根据ID修改员工的基本信息
emp.setUpdateTime(LocalDateTime.now());
empMapper.updateById(emp);
//2.根据ID修改员工的工作经历信息
//2.1 先根据员工ID删除原有的工作经历
empExprMapper.deleteByEmpIds(Arrays.asList(emp.getId()));
//2.2 再添加这个员工新的工作经历
List<EmpExpr> exprList = emp.getExprList();
if(!CollectionUtils.isEmpty(exprList)){
exprList.forEach(empExpr -> empExpr.setEmpId(emp.getId)));
empExprMapper.insertBatch(exprList);
}
}
Mapper层:
//根据ID更新员工基本信息
<update id="updateById">
UPDATE emp
SET
username = #{username}
password = #{password}
name = #{name}
gender = #{gender}
phone = #{phone}
job = #{job}
salary = #{salary}
image = #{image}
entry_date = #{entryDate}
dept_id = #{deptId}
update_time = #{updateTime}
WHERE id = #{id}
</update>
程序优化:
使用set标签:自动生成set关键字,自动删掉更新字段后多余的逗号
<update id="updateById">
UPDATE emp
<set>
<if test="username != null and username !=''">username = #{username},</if>
<if test="password != null and password !=''">password = #{password},</if>
<if test="name != null and name !=''">name = #{name},</if>
<if test="gender != null">gender = #{gender},</if>
<if test="phone != null and phone !=''">phone = #{phone},</if>
<if test="salary != null">salary = #{salary},</if>
<if test="image != null and image !=''">image = #{image},</if>
<if test="entryDate !=null">entry_date = #{entryDate},</if>
<if test="deptId != null">dept_id = #{deptId},</if>
<if test="updateTime != null">update_time = #{updateTime},</if>
</set>
WHERE id = #{id}
</update>
全局异常处理器:
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler{
@ExceptionHandler
public Result handleException(Exception e){
log.errpr("全局异常处理,拦截到异常",e);
return Result.error("对不起,服务器异常,请稍后重试");
}
}
@RestControllerAdvice = @ControllerAdvice + @ResponseBody
员工信息统计:
case函数:
case when 条件表达式1 then result1 when 条件表达式2 then result2 ... else ... end
职位统计开发
明确三层架构职责:
Controller层:
1.接受参数
2.调用Service层
3.响应结果
Service层:
1.调用mapper方法获取职位统计数据
2.解析数据封装统计结果(JobOption)
Mapper接口:
执行SQL语句
Controller层:
@GetMapping("/empJobDate")
public Result getEmpJobDate(){
log.info("统计各个职位的员工人数");
JobOption jobOption = reportService.getEmpJobData();
return Reult.success(jobOption);
}
Service层:
public JobOption getEmpJobData(){
List<Map<String,Object>> list = empMapper.countEmpJobData();
List<Object> jobList = list.stream().map(dataMap -> dataMap.get("pos")).toList();
List<Object> dataList = list.stream().map(dataMap -> dataMap.get(""num)).toList();
return new JobOption(jobList,dataList);
}
Mapper层:
<select id="countEmpJobData" resultType="包名">
select
(case when job =1 then '班主任'
when job =2 then '讲师'
when job =3 then '学工主管'
when job =4 then '教研主管'
when job =5 then '咨询师'
else '其他'end) as pos,
from emp
group by job order by num
</select>
性别统计:
Controller层:
@GetMapping("/empGenderData")
public Result getEmpGenderData(){
log.info("统计员工信息");
List<Map> genderList = reportService.getEmpGenderData();
return Result.success(genderList);
}
Service层:
@Override
public List<Map> getEmpGenderData(){
return empMapper.countEmpGenderData();
}
Mapper层:
//统计员工的性别信息
<select id="countEmpGenderData" resultType="包名"
select
if(gender = 1,'男','女') name,
count(*) value
from emp group by gender;
</select>
if流程控制函数:
if(expr,val1,val2):如果表达式expr成立,取val1,否则取val2
ifnull(expr,val):如果expr不为null,取自身,否则取val1