SpringBoot?Web項目增刪改查入門實戰(zhàn)案例
前言
為了快速入門一個SpringBootWeb項目,這里就將基礎(chǔ)的增刪改查的案例進行總結(jié),作為對SpringBoot+Mybatis的基礎(chǔ)用法的一個鞏固。
準(zhǔn)備工作
- 需求說明
對員工表進行增刪改查操作 - 環(huán)境搭建
- 準(zhǔn)備數(shù)據(jù)表
-- 員工管理(帶約束) create table emp ( id int unsigned primary key auto_increment comment 'ID', username varchar(20) not null unique comment '用戶名', password varchar(32) default '123456' comment '密碼', name varchar(10) not null comment '姓名', gender tinyint unsigned not null comment '性別, 說明: 1 男, 2 女', image varchar(300) comment '圖像', job tinyint unsigned comment '職位, 說明: 1 班主任,2 講師, 3 學(xué)工主管, 4 教研主管, 5 咨詢師', entrydate date comment '入職時間', dept_id int unsigned comment '部門ID', create_time datetime not null comment '創(chuàng)建時間', update_time datetime not null comment '修改時間' ) comment '員工表'; -- 員工表測試數(shù)據(jù) INSERT INTO emp (id, username, password, name, gender, image, job, entrydate,dept_id, create_time, update_time) VALUES (1,'jinyong','123456','金庸',1,'1.jpg',4,'2000-01-01',2,now(),now()), (2,'zhangwuji','123456','張無忌',1,'2.jpg',2,'2015-01-01',2,now(),now()), (3,'yangxiao','123456','楊逍',1,'3.jpg',2,'2008-05-01',2,now(),now()), (4,'weiyixiao','123456','韋一笑',1,'4.jpg',2,'2007-01-01',2,now(),now()), (5,'changyuchun','123456','常遇春',1,'5.jpg',2,'2012-12-05',2,now(),now()), (6,'xiaozhao','123456','小昭',2,'6.jpg',3,'2013-09-05',1,now(),now()), (7,'jixiaofu','123456','紀(jì)曉芙',2,'7.jpg',1,'2005-08-01',1,now(),now()), (8,'zhouzhiruo','123456','周芷若',2,'8.jpg',1,'2014-11-09',1,now(),now()), (9,'dingminjun','123456','丁敏君',2,'9.jpg',1,'2011-03-11',1,now(),now()), (10,'zhaomin','123456','趙敏',2,'10.jpg',1,'2013-09-05',1,now(),now()), (11,'luzhangke','123456','鹿杖客',1,'11.jpg',5,'2007-02-01',3,now(),now()), (12,'hebiweng','123456','鶴筆翁',1,'12.jpg',5,'2008-08-18',3,now(),now()), (13,'fangdongbai','123456','方東白',1,'13.jpg',5,'2012-11-01',3,now(),now()), (14,'zhangsanfeng','123456','張三豐',1,'14.jpg',2,'2002-08-01',2,now(),now()), (15,'yulianzhou','123456','俞蓮舟',1,'15.jpg',2,'2011-05-01',2,now(),now()), (16,'songyuanqiao','123456','宋遠橋',1,'16.jpg',2,'2007-01-01',2,now(),now()), (17,'chenyouliang','123456','陳友諒',1,'17.jpg',NULL,'2015-03-21',NULL,now(),now());
創(chuàng)建springboot工程,引入對應(yīng)的起步依賴(web、mybatis、mysql驅(qū)動、lombok)
配置文件application.properties中引入mybatis的配置信息,準(zhǔn)備對應(yīng)的實體類
- application.properties
#數(shù)據(jù)庫連接 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/tlias spring.datasource.username=root spring.datasource.password=1234 #開啟mybatis的日志輸出 mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl #開啟數(shù)據(jù)庫表字段 到 實體類屬性的駝峰映射 mybatis.configuration.map-underscore-to-camel-case=true
- 實體類
/*員工類*/ @Data @NoArgsConstructor @AllArgsConstructor public class Emp { private Integer id; private String username; private String password; private String name; private Short gender; private String image; private Short job; private LocalDate entrydate; private Integer deptId; private LocalDateTime createTime; private LocalDateTime updateTime; }
- application.properties
準(zhǔn)備對應(yīng)的Mapper、Service(接口、實現(xiàn)類)、Controller基礎(chǔ)結(jié)構(gòu)
數(shù)據(jù)訪問層:
- EmpMapper
import org.apache.ibatis.annotations.Mapper; @Mapper public interface EmpMapper { }
業(yè)務(wù)層:
EmpService
//員工業(yè)務(wù)規(guī)則 public interface EmpService { }
EmpServiceImpl
import com.exmaple.service.EmpService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; //員工業(yè)務(wù)實現(xiàn)類 @Slf4j @Service public class EmpServiceImpl implements EmpService { }
控制層:
- EmpController
package com.exmple.controller; import org.springframework.web.bind.annotation.RestController; //員工管理控制器 @RestController public class EmpController { }
- EmpMapper
- 開發(fā)規(guī)范
REST
傳統(tǒng)URL和REST風(fēng)格比較
(1)傳統(tǒng)URL風(fēng)格http://localhost:8080/user/getById?id=1 GET:查詢id為1的用戶 http://localhost:8080/user/saveUser POST:新增用戶 http://localhost:8080/user/updateUser POST:修改用戶 http://localhost:8080/user/deleteUser?id=1 GET:刪除id為1的用戶
(2)REST風(fēng)格URL:
http://localhost:8080/users/1 GET:查詢id為1的用戶 http://localhost:8080/users POST:新增用戶 http://localhost:8080/users PUT:修改用戶 http://localhost:8080/users/1 DELETE:刪除id為1的用戶
其中總結(jié)起來,就一句話:通過URL定位要操作的資源,通過HTTP動詞(請求方式)來描述具體的操作。
在REST風(fēng)格的URL中,通過四種請求方式,來操作數(shù)據(jù)的增刪改查。
- GET : 查詢
- POST :新增
- PUT :修改
- DELETE :刪除
統(tǒng)一響應(yīng)結(jié)果
前后端工程在進行交互時,使用統(tǒng)一響應(yīng)結(jié)果 Result。
package com.example.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor public class Result { private Integer code;//響應(yīng)碼,1 代表成功; 0 代表失敗 private String msg; //響應(yīng)信息 描述字符串 private Object data; //返回的數(shù)據(jù) //增刪改 成功響應(yīng) public static Result success(){ return new Result(1,"success",null); } //查詢 成功響應(yīng) public static Result success(Object data){ return new Result(1,"success",data); } //失敗響應(yīng) public static Result error(String msg){ return new Result(0,msg,null); } }
- 開發(fā)流程
查看頁面原型明確需求
- 根據(jù)頁面原型和需求,進行表結(jié)構(gòu)設(shè)計、編寫接口文檔(已提供)
閱讀接口文檔
思路分析
功能接口開發(fā)
- 就是開發(fā)后臺的業(yè)務(wù)功能,一個業(yè)務(wù)功能,我們稱為一個接口
功能接口測試
- 功能開發(fā)完畢后,先通過Postman進行功能接口測試,測試通過后,再和前端進行聯(lián)調(diào)測試
前后端聯(lián)調(diào)測試
- 和前端開發(fā)人員開發(fā)好的前端工程一起測試
新增員工
需求
在新增用戶時,我們需要保存用戶的基本信息,并且還需要上傳的員工的圖片,目前我們先完成第一步操作,保存用戶的基本信息。接口文檔
我們參照接口文檔來開發(fā)新增員工功能
- 基本信息
請求路徑:/emps 請求方式:POST 接口描述:該接口用于添加員工的信息
請求參數(shù)
參數(shù)格式:application/json參數(shù)說明:
名稱 類型 是否必須 備注 username string 必須 用戶名 name string 必須 姓名 gender number 必須 性別, 說明: 1 男, 2 女 image string 非必須 圖像 deptId number 非必須 部門id entrydate string 非必須 入職日期 job number 非必須 職位, 說明: 1 班主任,2 講師, 3 學(xué)工主管, 4 教研主管, 5 咨詢師 請求數(shù)據(jù)樣例:
{ "image": "https://web-framework.oss-cn-hangzhou.aliyuncs.com/2022-09-03-07-37-38222.jpg", "username": "linpingzhi", "name": "林平之", "gender": 1, "job": 1, "entrydate": "2022-09-18", "deptId": 1 }
響應(yīng)數(shù)據(jù)
參數(shù)格式:application/json
參數(shù)說明:
參數(shù)名 類型 是否必須 備注 code number 必須 響應(yīng)碼,1 代表成功,0 代表失敗 msg string 非必須 提示信息 data object 非必須 返回的數(shù)據(jù)
思路分析
接口文檔規(guī)定:- 請求路徑:/emps
- 請求方式:POST
- 請求參數(shù):Json格式數(shù)據(jù)
- 響應(yīng)數(shù)據(jù):Json格式數(shù)據(jù)
問題1:如何限定請求方式是POST?
@PostMapping
問題2:怎么在controller中接收json格式的請求參數(shù)?
@RequestBody //把前端傳遞的json數(shù)據(jù)填充到實體類中
功能開發(fā)
EmpController
@Slf4j @RestController @RequestMapping("/emps") public class EmpController { @Autowired private EmpService empService; //新增 @PostMapping public Result save(@RequestBody Emp emp){ //記錄日志 log.info("新增員工, emp:{}",emp); //調(diào)用業(yè)務(wù)層新增功能 empService.save(emp); //響應(yīng) return Result.success(); } //省略... }
EmpService
public interface EmpService { /** * 保存員工信息 * @param emp */ void save(Emp emp); //省略... }
EmpServiceImpl
@Slf4j @Service public class EmpServiceImpl implements EmpService { @Autowired private EmpMapper empMapper; @Override public void save(Emp emp) { //補全數(shù)據(jù) emp.setCreateTime(LocalDateTime.now()); emp.setUpdateTime(LocalDateTime.now()); //調(diào)用添加方法 empMapper.insert(emp); } //省略... }
EmpMapper
@Mapper public interface EmpMapper { //新增員工 @Insert("insert into emp (username, name, gender, image, job, entrydate, dept_id, create_time, update_time) " + "values (#{username}, #{name}, #{gender}, #{image}, #{job}, #{entrydate}, #{deptId}, #{createTime}, #{updateTime});") void insert(Emp emp); //省略... }
刪除員工
需求
前端頁面可以一次性刪除一個或多個員工。
問題:我們需要開發(fā)兩個功能接口嗎?一個刪除單個員工,一個刪除多個員工
答案:不需要。 只需要開發(fā)一個功能接口即可(刪除多個員工包含只刪除一個員工)接口文檔
基本信息
請求路徑:/emps/{ids} 請求方式:DELETE 接口描述:該接口用于批量刪除員工的數(shù)據(jù)信息
請求參數(shù)
參數(shù)格式:路徑參數(shù)參數(shù)說明:
參數(shù)名 類型 示例 是否必須 備注 ids 數(shù)組 array 1,2,3 必須 員工的id數(shù)組 請求參數(shù)樣例:
/emps/1,2,3
響應(yīng)數(shù)據(jù)
參數(shù)格式:application/json
參數(shù)說明:
參數(shù)名 類型 是否必須 備注 code number 必須 響應(yīng)碼,1 代表成功,0 代表失敗 msg string 非必須 提示信息 data object 非必須 返回的數(shù)據(jù) 響應(yīng)數(shù)據(jù)樣例:
{ "code":1, "msg":"success", "data":null }
- 思路分析
接口文檔規(guī)定:
前端請求路徑:/emps/{ids}
前端請求方式:DELETE
問題1:怎么在controller中接收請求路徑中的路徑參數(shù)?
@PathVariable
問題2:如何限定請求方式是delete?
@DeleteMapping
問題3:在Mapper接口中,執(zhí)行delete操作的SQL語句時,條件中的id值是不確定的是動態(tài)的,怎么實現(xiàn)呢?
Mybatis中的動態(tài)SQL:foreach
功能開發(fā)
EmpController@Slf4j @RestController @RequestMapping("/emps") public class EmpController { @Autowired private EmpService empService; //批量刪除 @DeleteMapping("/{ids}") public Result delete(@PathVariable List<Integer> ids){ empService.delete(ids); return Result.success(); } }
EmpService
public interface EmpService { /** * 批量刪除操作 * @param ids id集合 */ void delete(List<Integer> ids); //省略... }
EmpServiceImpl
@Slf4j @Service public class EmpServiceImpl implements EmpService { @Autowired private EmpMapper empMapper; @Override public void delete(List<Integer> ids) { empMapper.delete(ids); } //省略... }
EmpMapper
@Mapper public interface EmpMapper { //批量刪除 void delete(List<Integer> ids); //省略... }
EmpMapper.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.example.mapper.EmpMapper"> <!--批量刪除員工--> <select id="delete"> delete from emp where id in <foreach collection="ids" item="id" open="(" close=")" separator=","> #{id} </foreach> </select> <!-- 省略... --> </mapper>
元素用于迭代傳入的集合。在這個例子中,它用于構(gòu)建IN子句中的值列表。
collection屬性:指定要迭代的集合名稱。在這個例子中,collection="ids"意味著傳入的參數(shù)應(yīng)該是一個名為ids的集合。
item屬性:指定每次迭代時使用的變量名。在這里,item=“id"表示每次迭代時,當(dāng)前元素會被賦值給變量id。
open屬性:指定循環(huán)產(chǎn)生的SQL片段的開頭字符。在這里,open=”(“表示循環(huán)開始時添加一個左括號。
close屬性:指定循環(huán)產(chǎn)生的SQL片段的結(jié)尾字符。在這里,close=”)“表示循環(huán)結(jié)束時添加一個右括號。
separator屬性:指定每次迭代之間使用的分隔符。在這里,separator=”,"表示每次迭代之間添加一個逗號。
修改員工
需求
修改員工信息接口文檔
基本信息
請求路徑:/emps 請求方式:PUT 接口描述:該接口用于修改員工的數(shù)據(jù)信息
請求參數(shù)
參數(shù)格式:application/json
參數(shù)說明:
名稱 類型 是否必須 備注 id number 必須 id username string 必須 用戶名 name string 必須 姓名 gender number 必須 性別, 說明: 1 男, 2 女 image string 非必須 圖像 deptId number 非必須 部門id entrydate string 非必須 入職日期 job number 非必須 職位, 說明: 1 班主任,2 講師, 3 學(xué)工主管, 4 教研主管, 5 咨詢師 請求數(shù)據(jù)樣例:
{ "id": 1, "image": "https://web-framework.oss-cn-hangzhou.aliyuncs.com/2022-09-03-07-37-38222.jpg", "username": "linpingzhi", "name": "林平之", "gender": 1, "job": 1, "entrydate": "2022-09-18", "deptId": 1 }
響應(yīng)數(shù)據(jù)
參數(shù)格式:application/json
參數(shù)說明:
參數(shù)名 類型 是否必須 備注 code number 必須 響應(yīng)碼,1 代表成功,0 代表失敗 msg string 非必須 提示信息 data object 非必須 返回的數(shù)據(jù) 響應(yīng)數(shù)據(jù)樣例:
{ "code":1, "msg":"success", "data":null }
代碼實現(xiàn)
EmpMapper
@Mapper public interface EmpMapper { //修改員工信息 public void update(Emp emp); //省略... }
- EmpMapper.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.itheima.mapper.EmpMapper"> <!--更新員工信息--> <update id="update"> 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="image != null and image != ''"> image = #{image}, </if> <if test="job != null"> job = #{job}, </if> <if test="entrydate != null"> entrydate = #{entrydate}, </if> <if test="deptId != null"> dept_id = #{deptId}, </if> <if test="updateTime != null"> update_time = #{updateTime} </if> </set> where id = #{id} </update> <!-- 省略... --> </mapper>
- EmpService
public interface EmpService { /** * 更新員工 * @param emp */ public void update(Emp emp); //省略... }
- EmpServiceImpl
@Slf4j @Service public class EmpServiceImpl implements EmpService { @Autowired private EmpMapper empMapper; @Override public void update(Emp emp) { emp.setUpdateTime(LocalDateTime.now()); //更新修改時間為當(dāng)前時間 empMapper.update(emp); } //省略... }
- EmpController
@Slf4j @RestController @RequestMapping("/emps") public class EmpController { @Autowired private EmpService empService; //修改員工 @PutMapping public Result update(@RequestBody Emp emp){ empService.update(emp); return Result.success(); } //省略... }
查詢員工
- 需求
- 根據(jù)ID查詢員工信息
接口文檔
根據(jù)ID查詢員工數(shù)據(jù)基本信息
請求路徑:/emps/{id} 請求方式:GET 接口描述:該接口用于根據(jù)主鍵ID查詢員工的信息
請求參數(shù)
參數(shù)格式:路徑參數(shù)
參數(shù)說明:
參數(shù)名 類型 是否必須 備注 id number 必須 員工ID 請求參數(shù)樣例:
/emps/1
響應(yīng)數(shù)據(jù)
參數(shù)格式:application/json
參數(shù)說明:
名稱 類型 是否必須 默認值 備注 code number 必須 響應(yīng)碼, 1 成功 , 0 失敗 msg string 非必須 提示信息 data object 必須 返回的數(shù)據(jù) id number 非必須 id username string 非必須 用戶名 name string 非必須 姓名 password string 非必須 密碼 entrydate string 非必須 入職日期 gender number 非必須 性別 , 1 男 ; 2 女 image string 非必須 圖像 job number 非必須 職位, 說明: 1 班主任,2 講師, 3 學(xué)工主管, 4 教研主管, 5 咨詢師 deptId number 非必須 部門id createTime string 非必須 創(chuàng)建時間 updateTime string 非必須 更新時間 響應(yīng)數(shù)據(jù)樣例:
{ "code": 1, "msg": "success", "data": { "id": 2, "username": "zhangwuji", "password": "123456", "name": "張無忌", "gender": 1, "image": "https://web-framework.oss-cn-hangzhou.aliyuncs.com/2022-09-02-00-27-53B.jpg", "job": 2, "entrydate": "2015-01-01", "deptId": 2, "createTime": "2022-09-01T23:06:30", "updateTime": "2022-09-02T00:29:04" } }
代碼實現(xiàn)
EmpMapper
@Mapper public interface EmpMapper { //根據(jù)ID查詢員工信息 @Select("select id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time " + "from emp " + "where id = #{id}") public Emp findById(Integer id); //省略... }
- EmpService
public interface EmpService { /** * 根據(jù)ID查詢員工 * @param id * @return */ public Emp getById(Integer id); //省略... }
- EmpServiceImpl
@Slf4j @Service public class EmpServiceImpl implements EmpService { @Autowired private EmpMapper empMapper; @Override public Emp getById(Integer id) { return empMapper.findById(id); } //省略... }
- EmpController
@Slf4j @RestController @RequestMapping("/emps") public class EmpController { @Autowired private EmpService empService; //根據(jù)id查詢 @GetMapping("/{id}") public Result getById(@PathVariable Integer id){ Emp emp = empService.getById(id); return Result.success(emp); } //省略... }
后記
springboot + mybatis做數(shù)據(jù)的增刪改查其實相對比較簡單,我們根據(jù)上面的案例就可以進行學(xué)習(xí),主要關(guān)注的是常用的注解以及mybatis復(fù)雜查詢時xml文件的配置。
到此這篇關(guān)于SpringBoot Web項目增刪改查入門實戰(zhàn)案例的文章就介紹到這了,更多相關(guān)SpringBoot Web增刪改查內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java多數(shù)據(jù)源的三種實現(xiàn)方式小結(jié)
多數(shù)據(jù)源是在一個應(yīng)用程序中配置和使用多個不同的數(shù)據(jù)庫連接,本文主要介紹了Java多數(shù)據(jù)源的三種實現(xiàn)方式小結(jié),具有一定的參考價值,感興趣的可以了解一下2025-03-03詳解Spring Cloud 跨服務(wù)數(shù)據(jù)聚合框架
這篇文章主要介紹了詳解Spring Cloud 跨服務(wù)數(shù)據(jù)聚合框架,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03Java輕松掌握面向?qū)ο蟮娜筇匦苑庋b與繼承和多態(tài)
本文主要講述的是面向?qū)ο蟮娜筇匦裕悍庋b,繼承,多態(tài),內(nèi)容含括從封裝到繼承再到多態(tài)的所有重點內(nèi)容以及使用細節(jié)和注意事項,內(nèi)容有點長,請大家耐心看完2022-05-05POST方法給@RequestBody傳參數(shù)失敗的解決及原因分析
這篇文章主要介紹了POST方法給@RequestBody傳參數(shù)失敗的解決及原因分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10MyBatis通過JDBC數(shù)據(jù)驅(qū)動生成的執(zhí)行語句問題
這篇文章主要介紹了MyBatis通過JDBC數(shù)據(jù)驅(qū)動生成的執(zhí)行語句問題的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-08-08