前言
博主今天花了几个小时学习了苍穹外卖Day2的内容(实际上大部分时间都在排错),准备总结下一天所学
一,补充新建员工相关内容
1,愚蠢的错误
(a)addEmployee方法失效
原因及解决方法:传入Controller中的方法的参数光顾着用自动补全,本来应该是EmployeeDTO粗心变成了EmployeeLoginDTO
(b)报SQL异常:org.apache.ibatis.reflection.ReflectionException: There is no getter for property named ‘id_number’ in ‘class com.sky.entity.Employee’
原因及解决方法:原因是因为在sql语句没有注意传入形参的名字,下面给出错误的sql语句(大约长这样,下午忘记记录的)
@Insert("insert into employee(name, username, password, phone, sex, id_number, create_time, update_time, create_user, update_user) " +
"values "+
"(#{name},#{username},#{password}, #{phone}, #{sex}, #{id_Number}, #{create_Time}, #{update_Time}, #{create_User}, #{update_User})")
事实上,sql语句中传入的形参应当与传入对象的名字或者对象的属性的名字相同,以id_number字段为例子,后面应该为#{idNumber},因为这才是对象中对应属性的名字
感谢@Barry&&Alan用户!
2,新增员工中的setCreateUser,setUpdateUser的设置
黑马讲,每一次请求都是一次独立的线程,按照我的理解,想将一个数据在不同的方法间传播可以利用ThreadLocal的共享空间,所以有
employee.setCreateUser(BaseContext.getCurrentId());
employee.setUpdateUser(BaseContext.getCurrentId());
其中BaseContext是对ThreadLocal的一个包装工具类
二,分页查询相关内容
1,返回数据类型
黑马说:当你需要返回数据的时候,就应该将返回值的Result类型改为泛型并调用Result.succes<PageResult>,其中PageResult是经过封装处理的数据,包装了返回的页面查询结果和总记录数
2,关于service的实现的细节
(a)PageHelper的使用
这是一个很好用的插件,可以帮助我们的sql语句动态生成sql,所以我们的使用原则也要遵守它的方法
public PageResult pageQuery(EmployeePageQueryDTO employeePageQueryDTO) {
int pageNum = employeePageQueryDTO.getPage();
int pageSize = employeePageQueryDTO.getPageSize();
//!!PageHelper可以更好地帮助我们实现一个分页查询,需要在POM引入插件
PageHelper.startPage(pageNum,pageSize);
Page<Employee> page=employeeMapper.pageQuery(employeePageQueryDTO);
long total = page.getTotal();
List<Employee> records = page.getResult();
//将查询到的结果进行一个封装,封装到PageResult
return new PageResult(total,records);
}
剩下的跟着黑马即可
三,员工状态更改
1,怎么实现的更改
在Service层创建一个新对象,把要更改的属性进行一个赋值操作,如下
Employee employee = Employee.builder()
.status(status)
.id(id)
.build();//新的创建对象方法,其他都为空,防止误改
有个很难排查的问题也是sql问题,我是用AI按规律生成的SQL语句,但是死活不行,最后发现where怎么写进set标签了(已崩溃)
四,编辑员工信息
1,先实现根据ID查询员工的接口
很简单的sql语句,唯一要注意的是在Sevice层要更改返回的employee的密码改为"****"
2,更改员工信息
类似上面的更改状态,唯一不一样的是Service构造对象那一步,要用到一个工具类的拷贝方法
//需要把DTO变为employee
Employee employee = new Employee();
//把DTO已有的数据存进去,非常重要
BeanUtils.copyProperties(employeeDTO,employee);
employee.setUpdateTime(LocalDateTime.now());
//注意当前已经使用了ThreadLocal以及Jwt令牌解密获得了当前的控制者ID
employee.setUpdateUser(BaseContext.getCurrentId());
四,一些其他错误及问题
1,Swagger页面和Apifox都有的一个小问题
令牌过期后需要更改,事实上即使在全局参数更改了,也要去接口的请求头上更改
2,数据库直接更改后要提交事务,否则要回滚
总发现他老变化,原来是忘记提交事务了
3,不要长时间挂着程序
会触发一个异常discard long time none received connection.
五,自己的一些感想
1,总遇到好多小错误
被这些错误折磨得死去活来,但都很小,个人感觉不错的排错方法
检查异常信息->用AI或者互联网搜索对应的异常名字->调试->一比一对比源码
2,博客写的久,不知道写的主次,内容
我写这个博客写了一个小时多,但是不知道写什么,感觉很多都是黑马讲的,写上去有点剽窃的感觉(怪怪的),但我确实也有点自己的收获
感谢你的观看!