柚子快報邀請碼778899分享:java 蒼穹外賣day02
柚子快報邀請碼778899分享:java 蒼穹外賣day02
員工管理,分類管理
新增員工
產(chǎn)品經(jīng)理需求分析
使用請求post去請求,按照json格式去提交,后端給前端返回result
Path: /admin/employee Method:post
請求的json就是包含上圖表單里面數(shù)據(jù) 返回的數(shù)據(jù)是后端給前端:
**在controller類里面增加方法,然后在service里面增加方法,再在impl里面實(shí)現(xiàn)方法(從DTO傳過來的參數(shù)賦值給new的employee,然后調(diào)用Mapper將數(shù)據(jù)記錄到數(shù)據(jù)庫之中)
其中的參數(shù)都是清一色的DTO(從前端接受的數(shù)據(jù))** 1、技巧 只用Spring的BeanUtils.copyProperties去拷貝類的屬性。 2. 設(shè)置常量類 Constant以便后期維護(hù),在set的時候都用常量屬性來set 3.返回Result.succes
@PostMapping
@ApiOperation("新增員工")
public Result save(@RequestBody EmployeeDTO employeeDTO){
System.out.println("當(dāng)前線程的id" + Thread.currentThread().getId());
log.info("新增員工:{}",employeeDTO);
employeeService.save(employeeDTO);
return Result.success();
}
也就是controller(return Result)- >service(只是定義一個方法名)- > impl(完成功能獲取employee的信息,轉(zhuǎn)到Mapper去執(zhí)行sql操作)- >Mapper(完成sql代碼)
public void save(EmployeeDTO employeeDTO){
Employee employee = new Employee();
//對象屬性拷貝 Spring封裝的
BeanUtils.copyProperties(employeeDTO,employee); //從前往后面拷貝
//設(shè)置賬號的狀態(tài)
employee.setStatus(StatusConstant.ENABLE); //就是寫了一個常量類
employee.setPassword(DigestUtils.md5DigestAsHex(PasswordConstant.DEFAULT_PASSWORD.getBytes()));
employee.setCreateTime(LocalDateTime.now());
employee.setUpdateTime(LocalDateTime.now());
//TODO 后期改成當(dāng)前登錄用戶的id 用戶名共同值了沒有異常處理
employee.setCreateUser(10L);
employee.setUpdateUser(10L);
employeeMapper.insert(employee); //專門的類去執(zhí)行sql語句的操作
}
解決用戶名重復(fù)的問題!寫異常處理類
@ExceptionHandler
public Result exceptionHandler(SQLIntegrityConstraintViolationException ex){
獲取ex.getMessage的內(nèi)容,處理內(nèi)容使用split,返回的是Result.error(處理的文本數(shù)據(jù)表示獲得的異常)
解決創(chuàng)建人id問題
在login的時候其實(shí)已經(jīng)生成了jwt令牌,但是需要在login里面把令牌保存下來,然后提供成service下面的其他方法使用,需要用到ThreadLocal保存下來
每一次請求其實(shí)都是單獨(dú)的線程,每個線程都有單獨(dú)的存儲空間,所以我們可以把數(shù)據(jù)存在里面,在不用的類(service類不同方法)共享這個數(shù)據(jù)
先在攔截器里調(diào)用
BaseContext.setCurrentId(empId);
其中操作很簡單,關(guān)鍵是ThreadLocal的概念
遇到bug&技巧
1.調(diào)用getset的時候沒有自動補(bǔ)全:下載插件lombok 2.在寫Mapper的時候用@Insert寫mysql代碼,沒有自動補(bǔ)全。Insert開頭黃色燈泡 3.調(diào)試的時候需要設(shè)置一下全局參數(shù),jwt令牌,先去登錄那邊獲取,然后在全局參數(shù)設(shè)置一個token的,為什么叫token去application.yml配置文件設(shè)置的 4.測試的時候發(fā)現(xiàn)返回500,查閱的時候發(fā)現(xiàn)
@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},#{idNumber},#{createTime},#{updateTime},#{createUser},#{updateUser})")
void insert(Employee employee);
values后面需要駝峰命名,前面一部分是mysql設(shè)置好的表的格式 5. ex.getMessage().var可以自動補(bǔ)全定義
員工分頁查詢
產(chǎn)品經(jīng)理需求分析
請求格式是Query不是json
需要返回一頁的數(shù)據(jù)
Controller
@GetMapping("/page")
@ApiOperation("分頁查詢")
public Result
log.info("員工分頁查詢,參數(shù)為:{}",employeePageQueryDTO);
PageResult pageResult = employeeService.pageQuery(employeePageQueryDTO);
return Result.success(pageResult);
}
@GetMapping(“/page”) 定義接口
impl
使用pagehelper插件(mybatis自帶的)
public PageResult pageQuery(EmployeePageQueryDTO employeePageQueryDTO){
//select * from employee limit 0,10
PageHelper.startPage(employeePageQueryDTO.getPage(),employeePageQueryDTO.getPageSize());
//是基于TreadLocal實(shí)現(xiàn)的,獲得Limit 自動拼接到Mapper.xml之中
Page
long total = page.getTotal();
List
return new PageResult(total,result); //
}
pageQuery是在Mapper里面實(shí)現(xiàn)的,然后實(shí)現(xiàn)方法是通過,EmployeeMapper.xml里面寫代碼
mapper namespace="com.sky.mapper.EmployeeMapper">
select * from employee
and name like concat('%',#(name),'%')
Preparing: SELECT count(0) FROM employee這部分是mybatisX插件幫助寫的
員工分頁查詢,參數(shù)為:EmployeePageQueryDTO(name=null, page=1, pageSize=10)
2024-07-05 14:48:02.595 DEBUG 26312 --- [nio-8080-exec-2] c.s.m.EmployeeMapper.pageQuery_COUNT : ==> Preparing: SELECT count(0) FROM employee
2024-07-05 14:48:02.595 DEBUG 26312 --- [nio-8080-exec-2] c.s.m.EmployeeMapper.pageQuery_COUNT : ==> Parameters:
2024-07-05 14:48:02.596 DEBUG 26312 --- [nio-8080-exec-2] c.s.m.EmployeeMapper.pageQuery_COUNT : <== Total: 1
2024-07-05 14:48:02.597 DEBUG 26312 --- [nio-8080-exec-2] com.sky.mapper.EmployeeMapper.pageQuery : ==> Preparing: select * from employee LIMIT ?
2024-07-05 14:48:02.597 DEBUG 26312 --- [nio-8080-exec-2] com.sky.mapper.EmployeeMapper.pageQuery : ==> Parameters: 10(Integer)
2024-07-05 14:48:02.598 DEBUG 26312 --- [nio-8080-exec-2] com.sky.mapper.EmployeeMapper.pageQuery : <== Total: 3
展示時間格式不對
第一種 按照注釋的方式
//@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
第二種 使用WebMvcConfiguration類來解決
/**
* 擴(kuò)展Spring MVC框架的消息轉(zhuǎn)化器
* @param converters
*/
@Override
protected void extendMessageConverters(List
log.info("啟動消息轉(zhuǎn)化器。。。");
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.setObjectMapper(new JacksonObjectMapper());
converters.add(0,converter);
}
bug&技巧
1.在寫Mapper的時候沒有報錯,無法自動生成pagehelper的相關(guān)代碼,下載插件,mybatisX
啟用禁用員工賬號
產(chǎn)品分析
controller
如果需要返回數(shù)據(jù)的話, public result<返回的數(shù)據(jù)> 如果不返回數(shù)據(jù) 就public result就行了
@PostMapping("/status/{status}")
@ApiOperation("啟動禁用員工賬號")
public Result startOrStop(@PathVariable Integer status,Long id){ //路徑參數(shù)加PathVariable 路徑參數(shù)就是/(status)
log.info("啟動禁用員工賬號:{},{}",status,id);
employeeService.startOrStop(status,id);
return Result.success();
}
serviceimpl
使用builder更加裝逼,再使用Mapper去調(diào)用sql語句
public void startOrStop(Integer status, Long id){
//update employee set status = ? where id = ?
// Employee employee = new Employee();
// employee.setStatus(status);
Employee employee = Employee.builder()
.status(status)
.id(id)
.build();
employeeMapper.update(employee);
}
Mapper
因?yàn)閯討B(tài)修改屬性,所以使用Mapper映射文件去使用,
update employee
where id = #{id}
修改的時候回顯員工信息
修改信息時候回顯
分析需要id查詢,需要返回整個employee的信息去顯示 首先是使用Get在controller里面請求,
@GetMapping("/{id}")
@ApiOperation("根據(jù)id獲取員工的資料")
public Result
log.info("編輯員工信息,id為{}",id);
Employee employee = employeeService.getById(id);
return Result.success(employee);
}
serice
/**
* 根據(jù)id查員工信息
*
* @param id
* @return
*/
public Employee getById(Long id){
Employee employee = employeeMapper.getById(id);
employee.setPassword("******");
return employee;
}
Mapper
@Select("select * from employee where id = #{id}")
Employee getById(Long id);
這里我出現(xiàn)錯誤,把@select寫成了@Insert是不對的,修改完之后就有回顯了
修改員工的信息
Put方法controller參數(shù)是DTO,不需要return就返回Result.success
service里面就參數(shù)DTO,去BeanUtils從DTO變成正常Employee類
記得要updateTime 和User更改修改的時間和修改人
然后就調(diào)用之前寫好的Mapper類里面的update函數(shù)(封裝到Mapper.xml)里面
public void update(EmployeeDTO employeeDTO){
Employee employee = new Employee();
BeanUtils.copyProperties(employeeDTO,employee);
employee.setUpdateTime(LocalDateTime.now());
employee.setUpdateUser(BaseContext.getCurrentId());
employeeMapper.update(employee);
}
bug
去調(diào)試的時候發(fā)現(xiàn),updateTime是沒有的
Cause: java.sql.SQLSyntaxErrorException: Unknown column 'updateTime' in 'field list'
; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column 'updateTime' in 'field list'] with root cause
原因是xml文檔里面是錯誤的
update employee
where id = #{id}
update_Time = #{updateTime}
還有一個錯誤
@PutMapping
@ApiOperation("編輯員工信息")
public Result update(@RequestBody EmployeeLoginDTO employeeLoginDTO){
log.info("編輯員工信息:{}",employeeLoginDTO);
employeeService.update(employeeLoginDTO);
return Result.success();
}
@PutMapping后面沒有網(wǎng)址參數(shù)了,獲取的是employee頁面的里面自帶的json格式,所以我們在傳參的時候需要把**@RequestBody**給加上,才能正確的返回DTO的值
發(fā)現(xiàn)我全部用的EmployeeloginDTO,這個時候需要的是全部的DTO。。。。。。。。。。。。。。。。。。 全部改完就好了
導(dǎo)入分類模塊功能代碼
知識
GET:
用途:用于從服務(wù)器獲取數(shù)據(jù)。 特性:請求通常是冪等的(多次請求對服務(wù)器的資源不會產(chǎn)生不同的結(jié)果),請求參數(shù)通常包含在URL中。 例子:訪問網(wǎng)頁、獲取API數(shù)據(jù)等。 POST:
用途:用于向服務(wù)器發(fā)送數(shù)據(jù)以創(chuàng)建新的資源。 特性:請求不是冪等的(多次相同的請求可能會產(chǎn)生不同的結(jié)果),請求數(shù)據(jù)包含在請求體中。 例子:提交表單、上傳文件等。 PUT:
用途:用于向服務(wù)器發(fā)送數(shù)據(jù)以更新現(xiàn)有資源。 特性:請求通常是冪等的,整個資源數(shù)據(jù)包含在請求體中。 例子:更新用戶信息、更改文件內(nèi)容等。 DELETE:
用途:用于從服務(wù)器刪除指定的資源。 特性:請求通常是冪等的。 例子:刪除用戶賬戶、移除文件等。
總結(jié)
新增員工接受網(wǎng)頁TDO,轉(zhuǎn)Employee,去Mapper里面Insert,直接使用注釋@Insert就能完成,不返回內(nèi)容只返回success
分頁查詢,使用Mybatis的pagehelper類去完成代碼,傳入pageDTO(可以其實(shí)是沒有在前端輸入?yún)?shù)的,是通過TreadLocal自動獲取的內(nèi)容)就可以,DTO包括了頁碼和每頁最大的頁數(shù),返回的是PageResult(成員屬性就是頁碼和每頁最大的頁數(shù)) 其中,Mapper使用了XML文件去完成這個操作
select * from employee
and name like concat('%',#(name),'%')
禁用設(shè)置 需要頁面屬性做status做參數(shù),所以接受的前面加上了**@PathVariable** ,沒有返回所以success就行,sql本質(zhì)是update,所以使用了xml完成了所有的update但是在命名上要注意駝峰和下劃線_,傳給Mapper的時候update函數(shù)接受的都是整個employee
編輯員工 傳入的是網(wǎng)頁參數(shù)要加上@RquestBody參數(shù),本質(zhì)還是update,所以用上面的代碼就可以,
柚子快報邀請碼778899分享:java 蒼穹外賣day02
好文推薦
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。