基于Spring Boot框架的分頁查詢和文件上傳

分頁查詢

分析

要想從數據庫中進行分頁查詢,我們要使用LIMIT關鍵字,格式為:limit 開始索引 每頁顯示的條數

假設一頁想展示10條數據?

查詢第1頁數據的SQL語句是:

select * from emp  limit 0,10;

查詢第2頁數據的SQL語句是:

select * from emp  limit 10,10;

查詢第3頁的數據的SQL語句是:

select * from emp  limit 20,10;

觀察以上SQL語句,發現: 開始索引一直在改變 , 每頁顯示條數是固定的

開始索引的計算公式: 開始索引 = (當前頁碼 - 1) * 每頁顯示條數

得到規律:開始索引 = (當前頁碼 - 1) * 每頁顯示條數

前端在請求服務端時,傳遞的參數

  • 當前頁碼 page

  • 每頁顯示條數 pageSize

后端需要響應什么數據給前端

  • 所查詢到的數據列表(存儲到List 集合中)

  • 總記錄數

?功能開發

封裝PageBean對象

@Data
@NoArgsConstructor
@AllArgsConstructor
public class PageBean {
private Long total; //總記錄數
private List rows; //當前頁數據列表
}

?Controller層

@RequestParam(defaultValue="默認值") //設置請求參數默認值 ?

@Slf4j
@RestController
@RequestMapping("/emps")
public class EmpController {@Autowiredprivate EmpService empService;//條件分頁查詢@GetMappingpublic Result page(@RequestParam(defaultValue = "1") Integer page,@RequestParam(defaultValue = "10") Integer pageSize) {//記錄日志log.info("分頁查詢,參數:{},{}", page, pageSize);//調用業務層分頁查詢功能PageBean pageBean = empService.page(page, pageSize);//響應return Result.success(pageBean);}
}

Service層?

public interface EmpService {/*** 條件分頁查詢* @param page 頁碼* @param pageSize 每頁展示記錄數* @return*/PageBean page(Integer page, Integer pageSize);
}

實現類

@Slf4j
@Service
public class EmpServiceImpl implements EmpService {@Autowiredprivate EmpMapper empMapper;@Overridepublic PageBean page(Integer page, Integer pageSize) {//1、獲取總記錄數Long count = empMapper.count();//2、獲取分頁查詢結果列表Integer start = (page - 1) * pageSize; //計算起始索引 , 公式: (頁碼-1)*頁大小List<Emp> empList = empMapper.list(start, pageSize);//3、封裝PageBean對象PageBean pageBean = new PageBean(count , empList);return pageBean;}
}

Mapper層

@Mapper
public interface EmpMapper {//獲取總記錄數@Select("select count(*) from emp")public Long count();//獲取當前頁的結果列表@Select("select * from emp limit #{start}, #{pageSize}")public List<Emp> list(Integer start, Integer pageSize);
}

分頁插件 PageHelper ?

MyBatis 分頁插件 PageHelper 如果你也在用 MyBatis,建議嘗試該分頁插件,這一定是最方便使用的分頁插件。分頁插件支持任何復雜的單表、多表分頁。icon-default.png?t=N7T8https://pagehelper.github.io/ ?PageHelper是一個MyBatis的分頁插件,用于自動完成分頁查詢的工作。它通過簡化分頁查詢的開發過程,減輕了開發人員在實現分頁功能時的負擔。PageHelper的使用流程通常包括引入依賴、配置插件、以及在代碼中調用相應的方法來實現分頁查詢。

實現:

pom.xml引入依賴

<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.6</version>
</dependency>

?EmpMapper

@Mapper
public interface EmpMapper {//獲取當前頁的結果列表@Select("select * from emp")public List<Emp> page(Integer start, Integer pageSize);
}

EmpServiceImpl

@Override
public PageBean page(Integer page, Integer pageSize) {// 設置分頁參數PageHelper.startPage(page, pageSize); // 執行分頁查詢List<Emp> empList = empMapper.list(name,gender,begin,end); // 獲取分頁結果Page<Emp> p = (Page<Emp>) empList;   //封裝PageBeanPageBean pageBean = new PageBean(p.getTotal(), p.getResult()); return pageBean;
}

?文件上傳

前端完成代碼(例)

<form action="/upload" method="post" enctype="multipart/form-data">姓名: <input type="text" name="username"><br>年齡: <input type="text" name="age"><br>頭像: <input type="file" name="image"><br><input type="submit" value="提交">
</form>

傳文件的原始form表單,要求表單必須具備以下三點(上傳文件頁面三要素):

  • 表單必須有file域,用于選擇要上傳的文件

  • 表單提交方式必須為POST,通常上傳的文件會比較大,所以需要使用 POST 提交方式

  • 表單的編碼類型enctype必須要設置為:multipart/form-data。普通默認的編碼格式是不適合傳輸大型的二進制數據的,所以在文件上傳時,表單的編碼格式必須設置為multipart/form-data

本地存儲上傳

代碼實現:

  1. 在服務器本地磁盤上創建images目錄,用來存儲上傳的文件(例:E盤創建images目錄)

  2. 使用MultipartFile類提供的API方法,把臨時文件轉存到本地磁盤目錄下

Controller層

@Slf4j
@RestController
public class UploadController {@PostMapping("/upload")public Result upload(String username, Integer age, MultipartFile image) throws IOException {log.info("文件上傳:{},{},{}",username,age,image);//獲取原始文件名String originalFilename = image.getOriginalFilename();//將文件存儲在服務器的磁盤目錄image.transferTo(new File("E:/images/"+originalFilename));return Result.success();}}

由于我們是使用原始文件名作為所上傳文件的存儲名字,當我們再次上傳一個名為1.jpg文件時,發現會把之前已經上傳成功的文件覆蓋掉。 為保證每次上傳文件時文件名都唯一的(使用UUID獲取隨機文件名) ?

@Slf4j
@RestController
public class UploadController {@PostMapping("/upload")public Result upload(String username, Integer age, MultipartFile image) throws IOException {log.info("文件上傳:{},{},{}",username,age,image);//獲取原始文件名String originalFilename = image.getOriginalFilename();//構建新的文件名String extname = originalFilename.substring(originalFilename.lastIndexOf("."));//文件擴展名String newFileName = UUID.randomUUID().toString()+extname;//隨機名+文件擴展名//將文件存儲在服務器的磁盤目錄image.transferTo(new File("E:/images/"+newFileName));return Result.success();}}

application.properties/yml

#配置單個文件最大上傳大小
spring.servlet.multipart.max-file-size=10MB#配置單個請求最大上傳大小(一次請求可以上傳多個文件)
spring.servlet.multipart.max-request-size=100MBspring:servlet:multipart.max-file-size: 10MBmultipart.max-request-size: 100MB

大小可根據需求更改

阿里云OSS上傳

?參照官方提供的SDK,改造一下,即可實現文件上傳功能:

public class AliOssTest {public static void main(String[] args) throws Exception {// Endpoint以華東1(杭州)為例,其它Region請按實際情況填寫。String endpoint = "oss-cn-shanghai.aliyuncs.com";// 阿里云賬號AccessKey擁有所有API的訪問權限,風險很高。強烈建議您創建并使用RAM用戶進行API訪問或日常運維,請登錄RAM控制臺創建RAM用戶。String accessKeyId = "LTAI5t9MZK8iq5T2Av5GLDxX";String accessKeySecret = "C0IrHzKZGKqU8S7YQcevcotD3Zd5Tc";// 填寫Bucket名稱,例如examplebucket。String bucketName = "web-framework01";// 填寫Object完整路徑,完整路徑中不能包含Bucket名稱,例如exampledir/exampleobject.txt。String objectName = "1.jpg";// 填寫本地文件的完整路徑,例如D:\\localpath\\examplefile.txt。// 如果未指定本地路徑,則默認從示例程序所屬項目對應本地路徑中上傳文件流。String filePath= "C:\\Users\\Administrator\\Pictures\\1.jpg";// 創建OSSClient實例。OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);try {InputStream inputStream = new FileInputStream(filePath);// 創建PutObjectRequest對象。PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream);// 設置該屬性可以返回response。如果不設置,則返回的response為空。putObjectRequest.setProcess("true");// 創建PutObject請求。PutObjectResult result = ossClient.putObject(putObjectRequest);// 如果上傳成功,則返回200。System.out.println(result.getResponse().getStatusCode());} catch (OSSException oe) {System.out.println("Caught an OSSException, which means your request made it to OSS, "+ "but was rejected with an error response for some reason.");System.out.println("Error Message:" + oe.getErrorMessage());System.out.println("Error Code:" + oe.getErrorCode());System.out.println("Request ID:" + oe.getRequestId());System.out.println("Host ID:" + oe.getHostId());} catch (ClientException ce) {System.out.println("Caught an ClientException, which means the client encountered "+ "a serious internal problem while trying to communicate with OSS, "+ "such as not being able to access the network.");System.out.println("Error Message:" + ce.getMessage());} finally {if (ossClient != null) {ossClient.shutdown();}}}
}

在以上代碼中,需要替換的內容為:

  • accessKeyId:阿里云賬號AccessKey

  • accessKeySecret:阿里云賬號AccessKey對應的秘鑰

  • bucketName:Bucket名稱

  • objectName:對象名稱,在Bucket中存儲的對象的名稱

  • filePath:文件路徑

實現:

引入阿里云OSS上傳文件工具類(由官方的示例代碼改造而來)

@Component
public class AliOSSUtils {private String endpoint = "https://oss-cn-shanghai.aliyuncs.com";private String accessKeyId = "LTAI5t9MZK8iq5T2Av5GLDxX";private String accessKeySecret = "C0IrHzKZGKqU8S7YQcevcotD3Zd5Tc";private String bucketName = "web-framework01";/*** 實現上傳圖片到OSS*/public String upload(MultipartFile multipartFile) throws IOException {// 獲取上傳的文件的輸入流InputStream inputStream = multipartFile.getInputStream();// 避免文件覆蓋String originalFilename = multipartFile.getOriginalFilename();String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));//上傳文件到 OSSOSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);ossClient.putObject(bucketName, fileName, inputStream);//文件訪問路徑String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;// 關閉ossClientossClient.shutdown();return url;// 把上傳到oss的路徑返回}
}

?修改UploadController代碼:

@Slf4j
@RestController
public class UploadController {@Autowiredprivate AliOSSUtils aliOSSUtils;@PostMapping("/upload")public Result upload(MultipartFile image) throws IOException {//調用阿里云OSS工具類,將上傳上來的文件存入阿里云String url = aliOSSUtils.upload(image);//將圖片上傳完成后的url返回,用于瀏覽器回顯展示return Result.success(url);}}

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

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

相關文章

【Pytest官方文檔翻譯及學習】2.2 如何在測試中編寫和報告斷言

目錄 2.2 如何在測試中編寫和報告斷言 2.2.1 使用assert語句斷言 2.2.2 關于預期異常的斷言 2.2.3 關于預期警告的斷言 2.2.4 應用上下文相關的比較 2.2.5 為失敗的斷言定義自己的解釋 2.2.6 斷言內省細節 2.2 如何在測試中編寫和報告斷言 2.2.1 使用assert語句斷言 p…

6、架構-服務端緩存

為系統引入緩存之前&#xff0c;第一件事情是確認系統是否真的需要緩 存。從開發角度來說&#xff0c;引入緩存會提 高系統復雜度&#xff0c;因為你要考慮緩存的失效、更新、一致性等問題&#xff1b;從運維角度來說&#xff0c;緩存會掩蓋一些缺 陷&#xff0c;讓問題在更久的…

npm徹底清理緩存

在使用npm過程中&#xff0c;肯定會遇到清緩存的情況&#xff0c;網上的命令一般為 npm cache clear --force有時筆者在清理緩存之后npm install依然失敗&#xff0c;仔細發現&#xff0c;執行該命令之后npm報了一個警告 npm WARN using --force Recommended protections dis…

代碼隨想錄算法訓練營第27天|● 39. 組合總和● 40.組合總和II● 131.分割回文串

組合總和 題目鏈接 39. 組合總和 - 力扣&#xff08;LeetCode&#xff09; 代碼&#xff1a; class Solution {public List<List<Integer>> res new ArrayList<>();public List<Integer> list new ArrayList<>();public int sum 0;/**…

在nginx中配置反向代理

在nginx中配置反向代理&#xff0c;需要使用proxy_pass指令。以下是一個簡單的nginx反向代理配置示例&#xff1a; server {listen 80;server_name example.com;location / {proxy_pass http://backend_server;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote…

LoadRunner 錄制腳本時提示無Internet訪問/加載慢,如何解決?

LoadRunner 錄制腳本時提示無Internet訪問/加載慢&#xff0c;如何解決&#xff1f; 在使用LoadRunner 12.02 進行錄制腳本時提示無Internet訪問&#xff0c;這是如下圖&#xff1a; 翻譯中文如下&#xff1a; 這里&#xff0c;我認為大家應該都已經點過yes了&#xff0c;但是…

python結構化模式匹配switch-case,Python 3.10中引入,Python的模式匹配(pattern matching)語法

增加了采用模式加上相應動作的 match 語句 和 case 語句 的形式的結構化模式匹配。 模式由序列、映射、基本數據類型以及類實例構成。 模式匹配使得程序能夠從復雜的數據類型中提取信息、根據數據結構實現分支&#xff0c;并基于不同的數據形式應用特定的動作。 語法與操作 模…

Linux下配置Pytorch

1.Anaconda 1.1虛擬環境創建 2.Nvidia驅動 3.CUDA驅動安裝 4.Pytorch安裝 具體的步驟如上&#xff1a;可參考另一位博主的博客非常詳細&#xff1a; Linux服務器配置PythonPyTorchCUDA深度學習環境_linux cuda環境配置-CSDN博客https://blog.csdn.net/NSJim/article/detai…

極海APM32F072用Keil5燒錄失敗Error: Flash Download failed -“Cortex-MO+“

在用Keil5燒錄時&#xff0c;出現錯誤彈窗&#xff0c;大概長這樣&#xff1a; 檢查了一圈設置&#xff0c;都搞不好。 先用J-Flash&#xff0c;顯示讀寫保護&#xff08;未截圖&#xff09;&#xff0c;會跳出界面讓選擇是否解除讀寫保護&#xff1a; 1.點擊允許讀操作YES&am…

DNF手游攻略:0氪攻略,轉職技巧與避坑指南!

在DNF手游的冒險旅程中&#xff0c;角色的轉職是一次重要的成長經歷。通過轉職&#xff0c;玩家可以獲得全新的技能和屬性&#xff0c;提升自己在地下城中的戰斗力。本文將為您介紹轉職后的關鍵技巧和日常任務&#xff0c;幫助您更好地適應新的職業身份&#xff0c;成為地下城中…

Python從0到100(二十九):requests模塊處理cookie

1 爬蟲中使用cookie 為了能夠通過爬蟲獲取到登錄后的頁面&#xff0c;或者是解決通過cookie的反扒&#xff0c;需要使用request來處理cookie相關的請求 1.1 爬蟲中使用cookie的利弊 帶上cookie的好處 能夠訪問登錄后的頁面能夠實現部分反反爬 帶上cookie的壞處 一套cookie往往…

數據庫與低代碼開發:技術革新與應用實踐

在數字化時代&#xff0c;企業對軟件開發的需求日益增長&#xff0c;同時對開發效率和成本控制的要求也越來越高。在這樣的背景下&#xff0c;低代碼開發平臺應運而生&#xff0c;它允許開發者通過圖形界面和配置化操作&#xff0c;快速構建應用程序&#xff0c;而無需編寫大量…

【設計模式】JAVA Design Patterns——Monitor(監視器模式)

&#x1f50d;目的 主要目的是為多個線程或進程提供一種結構化和受控的方式來安全地訪問和操作共享資源&#xff0c;例如變量、數據結構或代碼的關鍵部分&#xff0c;而不會導致沖突或競爭條件。 &#x1f50d;解釋 通俗描述 監視器模式用于強制對數據進行單線程訪問。 一次只允…

Windows線程同步的四種方式和區別

1. Windows線程同步的四種方式 2. 區別 Critical Section更多強調的是保護&#xff0c;Event對象、Mutex對象與Semaphore對象更多的強調的是同步&#xff1b;Critical Section對象是無法設置等待超時的&#xff0c;而其他三個對象則可以設置等待超時&#xff0c;從這一點來講…

ROS2在RVIZ2中加載機器人urdf模型

參考ROS2-rviz2顯示模型 我這邊用的solid works生成的urdf以及meshes&#xff0c;比參考的方法多了meshes 問題一&#xff1a;Error retrieving file [package://rm_dcr_description/meshes/leftarm_link7.STL]: Package [rm_dcr_description] does not exist 這個是urdf模型中…

VisualStudio中:如果某個項目不顯示SVN的show log等,而其他項目都正常

VisualStudio中&#xff1a;如果某個項目不顯示SVN的show log等&#xff0c;而其他項目都正常。說明大概率是當前項目的問題&#xff0c;而不是VisualStudio的問題&#xff01; 1.這個項目內有一個“隱藏”文件夾.svn 》先刪除&#xff01; 2.如果外層文件夾有紅色感嘆號&…

2024-5-14——完成所有任務需要的最少輪數

2024-5-14 題目來源我的題解方法一 哈希表數學 題目來源 力扣每日一題&#xff1b;題序&#xff1a;2244 我的題解 方法一 哈希表數學 根據數學規律可以發現&#xff0c;除了只有1個任務時不能完成任務&#xff0c;其他的都可以完成。并且需要的輪數為&#xff1a; ?x/3? …

16、matlab求導、求偏導、求定積分、不定積分、數值積分和數值二重積分

1、matlab求導,diff()函數 1)一階導數 語法:diff(f(x)):求一階導數 //diff(f(x),n):求n階導數(n為具體正整數) 以函數(cos(x)+sin(x)-x^2)的一階導數為例 一階導數代碼: yms x;%聲明符號變量x f(x)=cos(x)+sin(x)-x^2;%定義原式子 dy=diff(f(x))%求一階導數dy =cos(…

機器學習-12-開源的機器學習可視化拖拉拽工具orange3的應用

參考orange3,一個無敵的 Python 庫! 參考orange3的GitHub地址 參考orange3的官方應用示例 參考下載Orange模塊,總是出錯? 參考Orange3入門(Orange3Dev) 參考工具|Orange 3:機器學習入門神器 1 orange3 數據科學和機器學習是當今科技領域的重要組成部分,而數據分析和建…

Csv--01--ExportUtil 寫文件

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 ExportUtil案例&#xff1a; ExportUtil.writeCsvFile ExportUtil import com.alibaba.fastjson.JSON; import com.google.common.collect.Lists;import org.apache…