在前面學完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接口代碼
發送請求,成功