后端之路(集合項目)——結合案例正式搭建項目

在前面學完java后端的Maven、spring boot、Mysql、Mybatis之后,我們現在就應該集合它們開始搭建一個項目試試手了

這里我還是跟著黑馬程序員的步驟來走好每一步,也給各位講清楚怎么弄

先看一下這個圖,覺得太籠統不明白的話不著急,我們接下來一步一步往下走。

一、第一步:搭建數據庫資源

首先,先創建一個叫【tlias】的數據庫,并創建一個【部門表dept】一個【員工表emp】,建表的代碼在下面,直接復制即可

-- 部門管理
create table dept(id int unsigned primary key auto_increment comment '主鍵ID',name varchar(10) not null unique comment '部門名稱',create_time datetime not null comment '創建時間',update_time datetime not null comment '修改時間'
) comment '部門表';insert into dept (id, name, create_time, update_time) values(1,'學工部',now(),now()),(2,'教研部',now(),now()),(3,'咨詢部',now(),now()), (4,'就業部',now(),now()),(5,'人事部',now(),now());-- 員工管理
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 學工主管, 4 教研主管, 5 咨詢師',entrydate date comment '入職時間',dept_id int unsigned comment '部門ID',create_time datetime not null comment '創建時間',update_time datetime not null comment '修改時間'
) comment '員工表';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','紀曉芙',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,'2010-01-01',2,now(),now()),(17,'chenyouliang','123456','陳友諒',1,'17.jpg',NULL,'2015-03-21',NULL,now(),now());

二、第二步:創建spring boot工程,并引入依賴

這里我就直接在我的 “Springboot_Mybatis” 這個大工程目錄下創建一個【spring boot工程

這里我需要糾正一個誤區:我一開始新建項目叫 “Springboot_Mybatis” 的這個項目不是【spring boot工程】!!這是一個maven工程,在這個工程里我才可以方便地創建【spring boot工程】,并給我這個【spring boot工程】引入依賴啥的

我們就給這個【spring boot工程】起名為:tlias-web-management

引入依賴的時候注意,我們講《spring boot》的時候講要引入【spring web】依賴,然后講《Mybatis》的時候講要引入【MyBatis Framework】和【MySQL Driver】這兩個依賴,那么我們這里是集合spring boot跟Mybatis的集合項目,這三個依賴就要一次性都引入!!!

那么有的伙計估計跟我一樣,點完創建后那個頁面怪怪的,都沒有那些花里胡哨的顏色區分java、resource、test......(像下圖,這是我之前一個項目的截圖)

那還是老方法,手動給他們調成我們熟悉的“顏色”

過程我這講過,這里不多說:后端之路第三站(Mybatis)——入門配置_mybatis url配置-CSDN博客

最后到pom.xml文件里把其余的一些依賴引入(MySQL、Mybatis...啥的不用了,剛剛創建的時候已經引入,把下面代碼塊這兩引入就行了)

<!--druid連接池-->
<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.8</version>
</dependency><!--lombok依賴-->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.30</version>
</dependency>

要是還是感覺怪怪的,記得區右邊側邊點開maven,確認你的項目在maven的管理下,如果沒有,那么手動點加號把maven添加進去,不要只點這個【spring boot工程】,要點它的pom.xml

三、準備好對應數據庫表的實體類

一般存放實體類的包我們叫【pojo】,所有創建一個【pojo】目錄,然后再往里建類

這里我直接把代碼給各位準備好

部門表的實體類

//這里寫你們自己的包路徑
//package com.czm.tliaswebmanagement.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;/*** 部門實體類*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Dept {private Integer id; //IDprivate String name; //部門名稱private LocalDateTime createTime; //創建時間private LocalDateTime updateTime; //修改時間
}

員工表的實體類

//這里寫你們自己的包路徑
//package com.czm.tliaswebmanagement.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDate;
import java.time.LocalDateTime;/*** 員工實體類*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Emp {private Integer id; //IDprivate String username; //用戶名private String password; //密碼private String name; //姓名private Short gender; //性別 , 1 男, 2 女private String image; //圖像urlprivate Short job; //職位 , 1 班主任 , 2 講師 , 3 學工主管 , 4 教研主管 , 5 咨詢師private LocalDate entrydate; //入職日期private Integer deptId; //部門IDprivate LocalDateTime createTime; //創建時間private LocalDateTime updateTime; //修改時間
}

四、接下來把三層架構、Mapper接口目錄都創建好

首先我們剛學完后端Mybatis,還有一個【mapper】這個接口目錄要創建,這時執行sql語句的地方,并在里面對應Dept、Emp兩個表創建兩個mapper接口

然后之前學spring boot我們學過有個什么【三層架構】,沒了解過的去我的文章看看:后端之路第二站(正片)——SprintBoot之:分層解耦_后端分層-CSDN博客

還是不了解的話不要緊,因為我自己都忘了這是干啥的哈哈,但是別管這么多,把對應的【controller】和【service】層的目錄創建好,為什么【Dao】不用創建?我也不知道,我暫時忘了,可能后面回想起來吧

然后【controller】里對應Dept、Emp兩個表創建兩個controller類

然后【service】里對應Dept、Emp兩個表創建兩個service接口,還有新建一個【impl】目錄,里面是實現這兩個service接口的類

然后思考我們之前講的“控制反轉和注入依賴”,它們對應的注解應該是

五、別忘了配置application.properties

#連接數據庫的【四要素】
#1、數據庫的驅動類名
spring.datasource.driver-class-name = com.mysql.cj.jdbc.Driver#2、數據庫的Url
spring.datasource.url = jdbc:mysql://localhost:3306/tlias#3、數據庫的賬戶名
spring.datasource.username = r**t#4、數據庫的密碼
spring.datasource.password = 1****6#配置mybatis的日志,指定輸出到控制臺
mybatis.configuration.log-impl = org.apache.ibatis.logging.stdout.StdOutImpl#開啟mybatis的駝峰命名自動映射開關
mybatis.configuration.map-underscore-to-camel-case = true

六、配置前后端相應返回的數據規范

前面學spring boot的時候我們學過,后端響應返回的數據格式是有規范的,那么我們就要封裝好一個Result類(封裝完放到pojo目錄下就好)

完整代碼在這:

//這里寫你們自己的包路徑
//package com.czm.tliaswebmanagement.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result {private Integer code;//響應碼,1 代表成功; 0 代表失敗private String msg;  //響應信息 描述字符串private Object data; //返回的數據//增刪改 成功響應public static Result success(){return new Result(1,"success",null);}//查詢 成功響應public static Result success(Object data){return new Result(1,"success",data);}//失敗響應public static Result error(String msg){return new Result(0,msg,null);}
}

七、開始寫項目

這里我把黑馬這個項目的大概業務需求資源發到這,應該是在頁面頂部有,可以自行下載來看,每一個頁面都有怎樣的需求

1、查詢

以上是部門查詢的業務需求,那么根據這個我們要思考下一步該做什么

【三層架構】就來了!!!

首先前端發送請求,后端在Controller層接收到請求——>然后Controller層調用service查詢部門——>service要執行邏輯操作,也就是完成查詢的操作,那查詢是sql的范圍,就得去“求”mapper接口——>那現在應該就能明白Dao層是誰了吧?mapper接口就是Dao層,通過它的sql語句操作來解析獲取到數據庫的資源數據——>然后返回到數據庫數據后給回service——>service給回Controller層——>Controller層最終再通過Result規范類返回一個規范的響應回前端

(1)先編寫controller代碼

~ 先編寫接收請求的接口(接口注解 + 接口方法)

在controller接口里我們要寫的是“接收請求”的操作,那么我們之前學《spring boot》學過如何寫一個請求接口:后端之路第二站(正片)——SprintBoot之:設置請求接口_springboot如何添加接口請求ip顯示-CSDN博客

因為【@RestController】注解包含了【@Controller】注解,還包含了【@Component】這個“控制反轉”注解,那么我們就直接用【@RestController】

然后用【RequestMapping("/接口路徑")】注解來規定接口路徑是啥,接著寫上跟“接口路徑”同名的方法,這個方法的就是接收到前端請求之后反送給service的邏輯,返回值是最后返回給前端的數據響應

還要注意兩點:

1、我們的方法的返回值類型應該是【Result】這個【規范響應類】,return的結果就是Result.成功響應或者Result.失敗響應,這里我們可以先用第一個Result.success()來測試可以接通接口不

Result類:

Controller接口

2、我們通常會用System.out.println("...");來測試是否成功

但是實際開發中不建議用System.out.println("...");而是要采用【日志方式】,日志方式有兩種

第一種是在方法外寫下面這個代碼(別記,直接復制),在方法里再log.info("想輸出的內容")就行了

private static Logger log = LoggerFactory.getLogger(你這個controller類名.class);

注意Logger導入的是org.slf4j這個包

第二種是加一個【@Slf4j】這個注解,因為它就包含了上面那一長串代碼,下面直接log.info()就行

3、【RequestMapping("接口路徑")】這里的接口路徑由前后端討論后決定的接口文檔里獲得

現在就可以運行當前項目,結合apifox測試接口能否成功接收請求了

注意:這里的域名里,本地域名的話,localhost等于127.0.0.1,然后別忘了帶上 “:端口”,我這的端口是8080

但是還有一個問題,無論這樣寫我們無論是get還是post方法都可以請求成功,可是接口文檔規定了這個是get方法,怎么辦?

只需要在【RequestMapping()】注解,在“/接口路徑”后面再加一個“method”參數,設置為【RequestMethod.請求方式】就行

只要設置了method,就會自動變成這樣

還有一種寫法是【@方式Mapping】這種注解,比如get:

~ 然后將service的bean對象【注入依賴】,然后調用service對象來進行邏輯操作

首先先【注入依賴】,使用【Autowired】注解,然后定義Service接口的實例對象

然后開始進行調用Service對象的方法,讓service進行邏輯操作

可以這么理解:這里就是我們學《Mybatis》時,在【test】目錄的【ApplicationTests】干的事,(間接)調用Mapper的接口方法來進行sql操作,只不過這里隔了一層service:我們是先調用service的方法,然后因為service層不能直接操作sql,所以service要再調用mapper的接口方法,所以我們只是多了一層service而已,干的事是一樣的

那么這里就要調用service的一個方法返回結果數據,根據這個數據類型定義一個變量接收,然后這就是結果了,把它返回給前端就行了

(2)現在到service層編寫邏輯代碼

根據剛剛在controller里我們寫的list方法,對應在service的接口里生成并補全這個方法內容

然后到這個service的impl目錄下,對應這個接口的【實現類】里【重寫】這個抽象方法的完整內容

這里我要先給各位區分一下:

【@service】注解是service將自己作為bean對象放入IOC容器的注解方法,但是【bean對象】【bean對象】,啥是對象?是類的實例化!!!所以【@service】寫在service的接口的實現類那,不是寫在接口那!!!!

然后回到service的接口的實現類的代碼里

【Alt + 回車】可以快捷鍵重寫父接口里的抽象方法

然后因為service不能直接操作sql語句,所以還得調用mapper的接口方法來操作

(3)現在到Mapper接口去完成sql語句的操作,并返回最終結果

大功告成,現在重新啟動服務,然后用apifox測試一下

成功返回數據庫里所有部門信息!!!!

總結:

經過剛剛那么一大串操作,各位老兄們可能已經懵逼了,大部分人應該也沒興致看完,那這里我做一個簡短的概括

首先,基礎的項目搭建以及配置好之后,分好你項目的結構,一共四個:【controller】【mapper】【pojo】【service】

【pojo】:放你對應數據庫那些表的實體類,還得放一個Result類,用于最終規范格式返回前端結果的

【controller】:放對應pojo的實體類的controller類(每個類都要加【@RestController】注解)

【service】:放對應pojo的實體類的service接口,還得有一個【impl】目錄放對應這幾個service接口的實現類(在這些實現類里加【@Service】注解,就可以“控制反轉”,被當作bean對象放入IOC容器)

【mapper】:放對應操作數據庫表sql語句的mapper接口,供service調用執行sql語句(每個mapper接口都要加【@Mapper】注解)

然后它們之間的邏輯就是:

controller層要寫好請求接口(接口注解 + 接口方法)來接收前端請求

然后【@Autowired】注解注入依賴,調用service層來執行邏輯操作

在方法中間調用service的方法,并獲取方法返回的值作為結果,返回給前端

然后service層在接口對應寫好controller剛剛調用、需要的那個方法

然后到service的impl目錄的實現子類里重寫實現接口里的方法,但是因為service不能直接操作sql語句,所以還要用【@Autowired】注解注入依賴,調用mapper接口來執行sql語句

最后把mapper接口返回的結果return回controller

最后到mapper接口里執行sql語句操作

最后mapper接口結果返回給service,service返回給controller,controller返回給前端

2、刪除

現在有刪除部門這個業務,那么我們后端的邏輯就是根據前端發送的請求,前端給我們一個部門id,然后我們根據部門id刪除這個部門的信息

那么大致的【三層架構】流程就是這樣:

那么查看接口文檔可以看到規范如下圖:

那么注意這里,{id}這個參數是通過 “/” 路徑拼接的,那么路徑參數需要用到的注解是【@PathVariable】

(下圖是我之前spring boot的筆記)

現在就可以直接寫代碼了

controller

service的接口和實現類

mapper的操作

然后前端測試一下請求

但是要注意用路徑參數的測試apifox前端發送請求的方式:

成功

3、新增

現在有新增部門這個業務,那么我們后端的邏輯就是根據前端發送的請求,前端只給我們一個部門名字name,然后我們根據這個部門名字name新增一個部門的信息

那么大致的【三層架構】流程就是這樣:

那么查看接口文檔可以看到規范如下圖:

那么這里要注意一點,因為請求方式是post,可以留意到這里接口文檔要求我們傳的參數形式,是以【json】的格式傳給我們后端

那么我們就要在接口方法的參數那里用【@RequestBody】來將【json轉化成實體類對象形式】給回后端

我們在《spring boot》:《后端之路第二站(正片)——SprintBoot之:設置響應-CSDN博客》講了【@RequestBody】是啥:

但是我在這說聲對不起,【@RequestBody】不單單只是把【對象轉成json】給前端,還可以【json轉成對象】給后端(我現在應該已經在那篇原文章修改了這部分)

那么只需要在controller的接口方法的參數那,定義1個對象形參,并用@RequestBody把接收到的json參數轉化成對象,讓這個對象形參接收

controller層代碼

.

service層的接口跟實現類代碼

這里注意一點:因為我們前端只傳了【姓名name】,但是看數據庫表會發現其實還有【創建時間create_time】、【更新時間update_ime】這兩個數據,這就需要我們后端不齊全

再【實現類】補全對象的【create_time】、【update_ime】

然后再將補全的dept對象給到mapper執行sql語句(插入信息)

.

最后Mapper接口執行sql插入語句

然后重新啟動,去apifox發送請求

(記住post請求是在body那傳參,而不是params;然后參數是json格式的)

4、簡約化封裝接口

在完成了這么多個功能之后,我們會發現我們這些【部門接口】都有一個共同的【路徑】:/depts

那么我們應該把它抽取出來,我們本來就是在【DeptController】這一個單獨的controller文件里寫接口,那就直接把用【@RequestMapping()】寫上共有的這個接口路徑

然后下面每一個不同的接口都用【@請求方式Mapping】這種對應不同方式的接口注解,沒有路徑參數的就不用帶 “()” ;有路徑參數的就帶 “()” ,里面接上參數路徑

我這里dept部門的完整controller層代碼如下

//注釋的導包不要用,導入你們自己的包路徑
//package com.czm.tliaswebmanagement.controller;//import com.czm.tliaswebmanagement.pojo.Dept;
//import com.czm.tliaswebmanagement.pojo.Result;
//import com.czm.tliaswebmanagement.service.DeptService;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;@Slf4j
@RestController
@RequestMapping("/depts")
public class DeptController {@Autowiredprivate DeptService deptService;/*** 查詢部門的接口* @return*/@GetMappingpublic Result dept(){log.info("部門接口測試成功");//調用deptService接口的list方法(現在DeptService接口還沒有,等會再去那補上這個方法)//還要用一個集合接收這個list方法的返回值List<Dept> deptList = deptService.list();//然后這個deptList裝的就是DeptService的list方法返回的通過sql查詢到的數據,把這個結果返回給前端return Result.success(deptList);}/*** 刪除部門的接口*/@DeleteMapping("/{id}")public Result delete(@PathVariable Integer id){log.info("根據id刪除部門:{}",id);//調用service根據id刪除部門deptService.delete(id);//因為沒有數據返回,所以直接調用Result的success的空參方法就行return Result.success();}/*** 新增部門信息*/@PostMappingpublic Result add(@RequestBody Dept dept){ //用一個對象接收前端傳過來的json數據,@RequestBody注解把json轉化成對象log.info("新增部門信息:{}",dept);//調用service新增部門deptService.add(dept);//因為沒有數據返回,所以直接調用Result的success的空參方法就行return Result.success();}
}

5、更新

現在實現更新功能,前端點擊部門,然后輸入要改成什么名字

?那么查看接口文檔可以看到規范如下圖:

那么這里要注意:前端傳過來的兩個值,其中id是給后端找是哪個部門的,name姓名是后端要改成什么的部門名字

所以我們要根據id找到是哪個部門,然后修改部門名,然后還要記住是put方法,然后還要注意前端傳過來的是json格式的數據,還得轉成對象再處理

?controller層代碼

.

service層的接口跟實現類代碼

【實現類】

.

最后Mapper接口執行sql插入語句

然后這里我遇到一個問題,我根據黑馬提供的資料,在apifox發送請求時的參數是

但是報了這么個錯

其實是因為數據庫中已經有了“教研部”,部門名字name這個字段,我們在建表的時候設置了唯一約束,所以不應該有相同的部門名字,比如我們換一個

成功了

6、復雜的查詢

(1)(傳統的方法)員工表【分頁查詢】

有的時候看一些后臺管理系統可以發現,有成千上百條數據,你一頁根本看不完,就像你們晚上偷偷看的小網站,要是全在一個頁面不得往下翻到死

——前期分析

—那就需要設置分頁查詢,下面有對應的1~n頁,點那一頁就顯示一部分數據

—然后前端有時還要統計總共有多少條數據

那么回顧一下sql語法,分頁查詢的代碼是

select * from 表 limit 起始索引,要查幾條數據; 

查詢數據總數的sql代碼是

select count(*) from 表;

那么后端需要的參數就是【頁碼】和【每頁顯示幾條數據】

而前端需要的則是【整個數據列表】和【一共有多少條數據】

整體邏輯就是下圖:

那么這里又要返回給前端的數據里,又要【數據總數】、又要返回【每一頁的數據列表】,一個返回的是List<E>集合類型,一個返回的是Integer數字類型

然而一個請求方法只能返回一個類型咋辦?

那就把這兩個類型都封裝到一個實體類,那請求方法就可以返回一個對象了。只要傳多個數據就用對象裝起來!!!!

三層架構邏輯:

controller層

要注意兩點:

1、記住前端用不同方式傳參,后端要怎么對應獲取參數:

——當前端在Paramas傳數據,以這種【網址域名?參數1=值1&參數2=值2...】形式傳參的時候,后端的controller請求方法里( )對應寫上參數,后端就會自動獲得參數

(參數名字一定要一樣,比如前端:【http:localhost:8080/emps?page=1&pageSize=10】,后端就要【public Result select(Integer page, Integer pageSize)】)

——當前端傳數據json格式,后端就用@RequestBody解析參數,并給到對象參數(【public Result select(@RequestBody? 某對象? 形參變量)】)

——當前端在傳路徑形式參數【網址域名/參數1/參數2...】形式的時候,后端的controller請求方法里( )對應每個參數前加@PathVariable來解析參數

(比如前端:【http:localhost:8080/emps/1/10】,后端就要【public Result select(@PathVariable?Integer page, @PathVariable Integer pageSize)】)

2、如果前端有可能不傳參數,而后端又必須要用參數,就得給參數設置默認值

?比如:當前端頁面剛加載進來的時候,肯定還沒有點擊下面的頁碼,那這個時候在沒有傳遞【頁碼:page】和【每頁顯示幾條數據:pageSize】的時候,我們得先設置默認值:【第一頁】和【每頁查詢10條】

那么就要用到【@RequestParam(?defualtValue = "默認值" )

.

以上知識點我都在《springboot》文章講過:

后端之路第二站(正片)——SprintBoot之:設置請求接口_可以發送接口的軟件-CSDN博客

代碼:

service層

這里要注意的是三點:

1、因為我們要的返回給前端的是裝著【整個數據列表】和【一共有多少條數據】的對象(pageBean),那么我們就在service實現類創建一個pageBean對象,把最后sql查詢到的兩個結果裝進pageBean對象里

2、因為前端要的是兩個數據,所以得執行兩個不同的sql查詢語句,那就調用兩個mapper的查詢方法,并用對應的數據類型的變量接收

3、因為前端要做的只是點擊傳送頁碼(1-n),還有傳每頁要查幾條,而假設我們每頁要查5條,那么第1頁就應該是從第1條(索引位0)數據開始查到第5條(索引位4),第2頁就應該是從第6條(索引位5)數據開始查到第11條(索引位10)

那么【查詢的起始索引】的公式就應該是:【(頁碼 - 1) * 每頁查幾條】,然后傳給sql做查詢時就應該是傳這個【查詢的起始索引】,而不是查【page】

mapper層

分別執行兩個sql語句就行了

發送請求,成功

(2)快捷分頁查詢

上面那是老傳統手搓代碼方法,當然也有更快捷的方法,叫【PageHelper插件】

要用它只需要完成下面幾步:

只需記住:【controller】不變,因為前后端聯調不影響;變的是后端的處理邏輯,所以只變【mapper】跟【service】

第一步:pom.xml文件引入依賴
<!-- PageHelper的依賴 -->
<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.2</version>
</dependency>
第二步,mapper里去掉麻煩的分頁查詢、統計數據

啥也別管直接【select * from 表】

第三步,接下來就是在service里使用PageHelper來幫我們完成分頁的功能

我們首先用【PageHelper.startPage( )】方法,配置PageHelper插件的參數:【頁碼】【每頁查幾條】(直接傳)

接著我們調用mapper獲得查詢返回的所有員工列表信息,然后PageHelper提供了一個【Page類】,我們只需要把返回的【所有員工列表信息】強制轉換成這個【Page類】,就可以任意用這個【Page類】的方法來得到我們我們想要的結果(數據總數、整個數據列表信息......等等)

總結

(3)配合PageHelper,既分頁查詢又條件查詢

那么我們之前在講:《后端之路第三站(Mybatis)——動態操作sql-CSDN博客》的時候講過XML文件來進行復雜的動態條件查詢

不過這里還要搭配PageHelper進行一個分頁查詢,那么就把二者結合起來就行了

比如還是這個:要么只根據姓名模糊查詢、要么只根據性別查詢、要么只根據入職時間范圍查詢、要么都查詢、要么根據其中兩個條件查

那就必須得用XML映射文件來進行查詢了,我的之前文章講過怎么用,這里不再說:

后端之路第三站(Mybatis)——XML文件操作sql_mybatis 如何讀區xml中的sql-CSDN博客

那么只用在上面的基礎做兩個改動:

1、把所有方法里的參數(在page和pageSize之后),都再加上四個參數(姓名、性別、入職起始時間、入職結束時間)

注意【時間參數】用【@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")】

mapper里多個參數要用【@Param(" ")】

后端controller層請求方法里定義的參數,前端可以不用全都傳,不影響(前提是后端mapper接口要有id判斷條件)

2、mapper層接口要用XML映射文件進行動態判斷條件的sql語句

controller層代碼

service層代碼

mapper接口代碼

發送請求,成功

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/38811.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/38811.shtml
英文地址,請注明出處:http://en.pswp.cn/web/38811.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java面試題總結

Redis篇 什么是緩存穿透 ? 怎么解決 ? 緩存穿透是指查詢一個不存在的數據&#xff0c;如果從存儲層查不到數據則不寫入緩存&#xff0c;這將導致這個不存在的數據每次請求都要到 DB 去查詢&#xff0c;可能導致 DB 掛掉。這種情況大概率是遭到了攻擊。 解決方案有兩種&…

Arthas實戰(2)- OOM問題排查

一、 準備測試應用 新建一個 SpringBoot應用&#xff0c;寫一段有 OOM bug 的代碼&#xff1a; RestController RequestMapping public class JvmThreadController {List<TestWrapper> memoryList new ArrayList<>();GetMapping("/test")public Strin…

mov文件怎么轉換成mp4格式?這四種轉換方法超級好用!

mov文件怎么轉換成mp4格式&#xff1f;在數字娛樂的世界中&#xff0c;你是否曾遇到過MOV格式的視頻&#xff1f;也許&#xff0c;對于許多人來說&#xff0c;這并不是一個常見的格式&#xff0c;但這并非偶然&#xff0c;首先&#xff0c;我們來談談MOV的兼容性問題&#xff0…

使用python做飛機大戰

代碼地址: 點擊跳轉

不看測評盲買花了多少冤枉錢..測評希喂、愛立方、帕特看完不踩雷

主食凍在挑選主食凍干時&#xff0c;許多寵物主人都會感到頭疼。盡管主食凍干相較于普通貓糧具有諸多優勢&#xff0c;但其價格也相對高昂。這導致許多寵物主人擔心高價購買的主食凍干可能營養價值并不理想。然而&#xff0c;在選擇時&#xff0c;我們還需要考慮其他重要因素&a…

“穿越時空的機械奇觀:記里鼓車的歷史與科技探秘“

在人類文明的發展歷程中&#xff0c;科技的創新與進步不僅僅推動了社會的進步&#xff0c;也為我們留下了豐富的文化遺產。記里鼓車&#xff0c;作為一種古老的里程計量工具&#xff0c;其歷史地位和技術成就在科技史上具有重要的意義。本文將詳細介紹記里鼓車的起源、結構原理…

0基礎學C++ | 第10天 | 基礎知識 |程序的內存模型 | 4大分區

前言 第9天是一個通訊錄管理系統案例&#xff0c;現在了解程序的內存分區&#xff0c;C程序在執行時&#xff0c;將內存大方向分為了4個區域&#xff0c;分別是代碼區、全局區、棧區、堆區&#xff0c;分區的目的就是為了更加靈活的編程。 代碼區 and 全局區&#xff08;程序…

Echarts柱狀圖x軸刻度間隔顯示不全/x軸文字傾斜

此情況一般是因為x軸文字過長導致&#xff0c;知道什么原因&#xff0c;就可以解決了 在xAxis里面加 xAxis: {axisLabel: {interval: 0,rotate: -45 //文字過多時&#xff0c;傾斜角度}} 控制它的屬性是axisLabel&#xff0c;該屬性interva設置成0則表示強制顯示所有標簽&a…

這所985院校不保護一志愿,18人不合格被刷!西北農林科技大學計算機考研考情分析!

西北農林科技大學(Northwest A&F University)&#xff0c;簡稱“西農”或“西北農林”&#xff0c;始創于1934年&#xff0c;位于中華人民共和國陜西省楊凌示范區。1999年9月11日由同處楊凌的原西北農業大學、西北林學院、中國科學院水利部水土保持研究所、水利部西北水利科…

外籍學員報到,四川眼科醫院開啟國際屈光手術專科醫生培訓

“能夠來到中國、來到四川眼科醫院學習&#xff0c;我真的很幸運&#xff01;”這個夏天&#xff0c;對于馬來西亞眼科醫生Ivan Cheng En Yoo來說&#xff0c;充滿了期待和挑戰。他是首位來到四川眼科醫院進修學習的馬來西亞籍醫生&#xff0c;Ivan Cheng將在周進院長的帶領下&…

Android Gradle 開發與應用 (三): 依賴管理與版本控制

目錄 1. 依賴管理的重要性 1.1 依賴的類型 1.2 Gradle 中的依賴聲明 2. 版本控制的策略 2.1 固定版本與動態版本 2.2 版本沖突的解決 3. Gradle 插件的使用 3.1 常用的 Gradle 插件 3.2 自定義插件 4. 多模塊項目中的依賴管理 4.1 模塊間依賴 4.2 公共依賴 5. 依賴…

用“文心一言”寫的文章,看看AI寫得怎么樣?

?零售連鎖店的“支付結算”業務設計 在數字化浪潮的推動下&#xff0c;連鎖店零售支付結算的設計愈發重要。一個優秀的支付結算設計不僅能夠提升用戶體驗&#xff0c;還能增強品牌競爭力&#xff0c;進而促進銷售增長。 本文將圍繞一個具體的連鎖店零售支付結算案例&#xf…

數據結構第06節:棧

棧&#xff08;Stack&#xff09;是一種后進先出&#xff08;Last In First Out, LIFO&#xff09;的數據結構&#xff0c;它只允許在一端&#xff0c;稱為棧頂&#xff08;Top&#xff09;&#xff0c;進行添加&#xff08;Push&#xff09;和移除&#xff08;Pop&#xff09;…

MySql Innodb 索引有哪些與詳解

概述 對于MYSQL的INNODB存儲引擎的索引&#xff0c;大家是不陌生的&#xff0c;都能想到是 B樹結構&#xff0c;可以加速SQL查詢。但對于B樹索引&#xff0c;它到底“長”得什么樣子&#xff0c;它具體如何由一個個字節構成的&#xff0c;這些的基礎知識鮮有人深究。本篇文章從…

【Spring Boot】JPA 的查詢方式

JPA 的查詢方式 1.使用約定方法名2.用 JPQL 進行查詢3.用原生 SQL 進行查詢3.1 根據 ID 查詢用戶3.2 查詢所有用戶3.3 根據 email 查詢用戶3.4 根據 name 查詢用戶&#xff0c;并返回分頁對象 Page3.5 根據名字來修改 email 的值3.6 使用事務 4.用 Specifications 進行查詢5.用…

Mac視頻下載工具,兼容14系統,Downie 4軟件下載

Downie 4 是一款由James Application開發的視頻下載軟件&#xff0c;支持Mac操作系統。該軟件允許用戶從各種視頻網站上下載視頻內容&#xff0c;以便于在本地設備上觀看&#xff0c;無需依賴互聯網連接。自動下載&#xff1a;可以設置Downie 4自動下載指定網站上的視頻&#x…

當+=的時候,為什么會出現NaN?

問: var textToDisplay; // "testing"; textToDisplay "testing"; textToDisplay 1; var someNumber 1; var oneMoreNumber; oneMoreNumber textToDisplay someNumber; //results in NaN console.log(oneMoreNumber); 這里的結果是NaN? 回答: 是…

【LinuxC語言】線程池的原理和實現

文章目錄 前言為什么需要線程池線程池的原理總結前言 在現代計算中,多線程編程已經成為一種常見的做法,它可以幫助我們更有效地利用多核處理器的能力。然而,頻繁地創建和銷毀線程會帶來一定的開銷。為了解決這個問題,我們可以使用一種稱為“線程池”的技術。線程池是一種在…

黑馬點評-Redis的緩存擊穿,緩存雪崩,緩存穿透,互斥鎖,邏輯過期

文章目錄 1.緩存穿透2.緩存雪崩3.緩存擊穿3.1 互斥鎖3.2 基于邏輯過期 1.緩存穿透 解決辦法 寫入NULL值到Redis緩存&#xff0c;以后就會命中Redis的控制緩存而不會出現請求直接打到數據庫的問題&#xff01; 代碼 2.緩存雪崩 這個概念很好理解&#xff0c;雪崩就是無數的…

【LLM大模型書】從零開始大模型開發與微調:基于PyTorch與ChatGLM (附PDF)

今天又來給大家推薦一本大模型方面的書籍<從零開始大模型開發與微調&#xff1a;基于PyTorch與ChatGLM>。 本書使用PyTorch 2.0作為學習大模型的基本框架&#xff0c;以ChatGLM為例詳細講解大模型的基本理論、算法、程序實現、應用實戰以及微調技術&#xff0c;為讀者揭…