Spring項目中常用操作記錄

List

基礎操作

創建

// 使用 ArrayList(基于動態數組,適合隨機訪問)
List<String> arrayList = new ArrayList<>();// 使用 LinkedList(基于鏈表,適合頻繁插入/刪除)
List<Integer> linkedList = new LinkedList<>();// 初始化時添加元素
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));

添加

list.add("D");          // 添加到末尾
list.add(0, "First");   // 插入到指定索引位置
list.addAll(otherList); // 添加另一個集合的所有元素

修改

list.set(0, "NewFirst"); // 替換指定索引的元素

刪除

list.remove("A");       // 按對象刪除(刪除第一個匹配項)
list.remove(0);         // 按索引刪除
list.clear();           // 清空列表

訪問

String first = list.get(0);      // 獲取指定索引的元素
int size = list.size();          // 獲取列表長度
boolean hasA = list.contains("A"); // 判斷是否包含元素
int index = list.indexOf("B");   // 查找元素的首次出現索引

遍歷

// 傳統 for 循環
for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i));
}// 增強 for 循環
for (String s : list) {System.out.println(s);
}// Java 8+ forEach + Lambda
list.forEach(s -> System.out.println(s));

Stream API

// 過濾元素
List<String> filtered = list.stream().filter(s -> s.startsWith("A")).collect(Collectors.toList());// 映射操作
List<Integer> lengths = list.stream().map(String::length).collect(Collectors.toList());// 去重
List<String> distinct = list.stream().distinct().collect(Collectors.toList());

查詢

多表查詢

對于多表查詢一般就需要使用sql,這樣操作起來更加容易

dao

@Mapper
public interface OrgDao extends BaseMapper<SysOrg> {// 查詢所有的組織數據List<SysOrg> getOrgList(List<AdvQueryParam> advQueryParam);
}

mapper

<?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.onion.boot3management.sys.org.dao.OrgDao"><select id="getOrgList"  resultType="com.onion.boot3management.sys.org.domain.SysOrg">select *from (select sys_org.id,sys_org.code,sys_org.name,sys_org.created_at,sys_org.updated_at,sys_org.creator_id,sys_org.updater_id,sys_org.parent_id,sys_org.remark,creator_user.name as creator_name,updater_user.name as updater_namefrom sys_orgleft join sys_user creator_user on sys_org.creator_id = creator_user.idleft join sys_user updater_user on sys_org.updater_id = updater_user.id) res<where><foreach collection="advQueryParam" item="param" separator=" AND "><if test="param.value!=null and param.value.size() > 0"><choose><when test="param.type=='text'">res.${param.prop} like concat('%',#{param.value[0]},'%')</when></choose></if></foreach></where></select>
</mapper>

映射文件

  • <mapper> 標簽:這是 MyBatis 映射文件的根標簽,namespace 屬性指定了該映射文件所對應的 Mapper 接口的全限定名,即 com.onion.boot3management.sys.org.dao.OrgDaoMyBatis 會通過這個命名空間將接口方法和 XML 中的 SQL 語句關聯起來。

select標簽

  • <select> 用于定義一個查詢語句
  • id指定Mapper接口中對應的方法名
  • resultType 指定查詢結果的映射類型(返回值類型)

where標簽

  • where標簽用于生成sql中的where字句

foreach標簽

  • advQueryParam,對應mapper接口中的入參
  • collection用于指定要遍歷的集合
  • item 用于指定集合中每個元素的別名
  • separator 用于指定多個條件之間的關系

choose 、when標簽

  • 相當于switchcase語句

sql查詢

select *
from (select sys_org.id,sys_org.code,sys_org.name,creator_user.name as creator_name,updater_user.name as updater_namefrom sys_orgleft join sys_user creator_user on sys_org.creator_id = creator_user.idleft join sys_user updater_user on sys_org.updater_id = updater_user.id) res
  • 使用嵌套查詢,內查詢的結果命名為res
  • 使用兩次左查詢,從其他表中查出需要的字段
res.${param.prop} like concat('%',#{param.value[0]},'%')
  • res 是上面查詢的結果
  • ${} 是一個占位符,會進行值的替換

sql注入的寫法

這種一般可以用于固定查詢條件格式的查詢

service 構建查詢條件

QueryWrapper<SysOrg> queryWrapper = new QueryWrapper<>();
if (!CollectionUtils.isEmpty(queryParam.getAdvQueryParam())) {queryParam.getAdvQueryParam().forEach(item -> {if (!CollectionUtils.isEmpty(item.getValue())) {switch (item.getType()) {case "text":queryWrapper.like(item.getProp(), item.getValue().get(0));break;}}});
}
List<SysOrg> orgList = orgDao.getOrgList(queryWrapper);

dao接收

 // 這里的 ew 是 QueryWrapper 對象的別名List<SysOrg> getOrgList(@Param("ew") QueryWrapper<SysOrg> wrapper);

sql拼接

<select id="getOrgList"  resultType="com.onion.boot3management.sys.org.domain.SysOrg">select *from (select sys_org.id,sys_org.code,sys_org.name,sys_org.created_at,sys_org.updated_at,sys_org.creator_id,sys_org.updater_id,sys_org.parent_id,sys_org.remark,creator_user.name as creator_name,updater_user.name as updater_namefrom sys_orgleft join sys_user creator_user on sys_org.creator_id = creator_user.idleft join sys_user updater_user on sys_org.updater_id = updater_user.id) res${ew.customSqlSegment}</select>

分頁查詢

基于MyBatis-Plus 實現分頁查詢

1、添加依賴

2、配置分頁插件
創建一個配置類

@Configuration
public class MyBatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();// 添加分頁插件interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return interceptor;}
}

3、實現

  • 使用默認方法
// 創建分頁對象(頁碼從1開始)
Page<User> page = new Page<>(pageNum, pageSize); // 添加查詢條件(可選)
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.like("name",  "張");// 執行查詢
Page<User> result = userMapper.selectPage(page,  wrapper);
  • 通過sql,主要涉及多表查詢時
// 調用`mapper`接口
public Result doPage(TableQueryParam tableQueryParam) {// 創建Page對象,指定當前頁碼和每頁分頁記錄Page<SysFile> page = new Page<>(tableQueryParam.getPageNumber(), tableQueryParam.getPageSize());IPage<SysFile> res = sysFileDao.doPage(page);return Result.success(res);}// mapper接口
IPage<SysFile> doPage(Page<SysFile> page);// 對應的sql
<select id="doPage" resultType="com.onion.boot3management.sys.file.domain.SysFile">select *from (select *from sys_file) res</select>

刪除

根據ID批量刪除

 @Override@Transactional(rollbackFor = Exception.class)public Result batchDelete(IdList idList) {try {List<String> ids = idList.getIdList();// 1、判斷ID是存在if (CollectionUtils.isEmpty(ids)) {return Result.error("ID列表為空");}// 2、判斷ID是否都在數據庫中LambdaQueryWrapper<SysOrg> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.in(SysOrg::getId, ids);long count = orgDao.selectCount(queryWrapper);if (count != ids.size()) {return Result.error("部分ID不存在");}// 3、批量刪除orgDao.deleteBatchIds(ids);// 4、假刪除
//            queryWrapper.in(SysOrg::getId, ids);
//            SysOrg sysOrg = new SysOrg();
//            sysOrg.setIsDel(1);
//            orgDao.update(sysOrg, queryWrapper);// 或
//            LambdaUpdateWrapper<SysOrg> updateWrapper = new LambdaUpdateWrapper<>();
//            updateWrapper.in(SysOrg::getId, ids).set(SysOrg::getIsDel, 1);
//            orgDao.update(new SysOrg(), updateWrapper);return Result.success();} catch (Exception e) {System.out.println(e.getMessage());// 觸發事務回滾TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();return Result.error("刪除失敗");}}

更新

樹形數據的更新

以組織樹更新為例

  @Transactional(rollbackFor = Exception.class)public Result updateOrg(OrgParam param) {try {// 1、判斷要更新的數據是否存在LambdaQueryWrapper<SysOrg> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(SysOrg::getId, param.getId());if (!orgDao.exists(queryWrapper)) {return Result.error("要更新的組織不存在");}// 2、判斷上級組織是否是自己或者是子級boolean isSelfOrChild = false;// 字符串比較用equalsif (param.getId().equals(param.getParentId())) {isSelfOrChild = true;}// 2.2 判斷上級組織是否是子級List<String> childIds = new ArrayList<>();if (!isSelfOrChild) {// 說明不是本身,則判斷是否是子級getChildOrgIds(param.getId(), childIds);if (childIds.contains(param.getParentId())) {isSelfOrChild = true;}}if (isSelfOrChild) {return Result.error("上級組織不能是本身或者子級");}// 3、更新上級組織、組織名稱、備注、修改人、修改時間LocalDateTime now = LocalDateTime.now();LambdaUpdateWrapper<SysOrg> updateWrapper = new LambdaUpdateWrapper<>();updateWrapper.eq(SysOrg::getId, param.getId()).set(SysOrg::getParentId, param.getParentId()).set(SysOrg::getName, param.getName()).set(SysOrg::getRemark, param.getRemark()).set(SysOrg::getUpdaterId, param.getUpdaterId()).set(SysOrg::getUpdatedAt, now);orgDao.update(new SysOrg(), updateWrapper);return Result.success();} catch (Exception e) {System.out.println(e.getMessage());// 手動回滾,避免事務無法回滾TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();return Result.error("更新失敗");}}/*** 獲取當前組織ID的子級、孫子級的主鍵*/private void getChildOrgIds(String parentId, List<String> childIds) {LambdaQueryWrapper<SysOrg> queryWrapper = new LambdaQueryWrapper<>();// 查詢所有自組織queryWrapper.eq(SysOrg::getParentId, parentId).select(SysOrg::getId);List<SysOrg> list = orgDao.selectList(queryWrapper);// 循環for (SysOrg org : list) {childIds.add(org.getId());// 查詢下一級getChildOrgIds(org.getId(), childIds);}}

Controller接口的常用的入參格式

基本數據類型和包裝類型作為入參

@RestController
public class BasicParamController {@GetMapping("/basicParam")public String getBasicParam(@RequestParam("id") Integer id) {return "Received id: " + id;}
}

@RequestParam 注解用于綁定請求參數到方法參數,“id” 是請求參數的名稱

實體類作為入參

@RestController
public class EntityParamController {@PostMapping("/entityParam")public String getEntityParam(@RequestBody User user) {return "Received user: " + user.getName() + ", age: " + user.getAge();}
}

@RequestBody 注解用于將請求體中的 JSON 數據映射到實體類對象

表單數據作為入參
對于表單提交的數據,可以直接使用實體類或基本數據類型接收。

@PostMapping("/formData")public String getFormData(@RequestParam("name") String name, @RequestParam("age") Integer age) {return "Received name: " + name + ", age: " + age;}

其他

LocalDateTime 類型的時間,返回值里有一個T

Spring Boot默認使用Jackson庫序列化LocalDateTime對象時,會采用ISO-8601標準格式(如2025-02-27T10:29:26)

通過@JsonFormat注解格式化

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")  // 指定時區 
private LocalDateTime updatedAt;

生成樹形結構數據

 public List<OrgTreeResult> buildTree(List<SysOrg> orgList) {// 1. 將組織列表轉換為Map,方便快速查找Map<String, OrgTreeResult> orgMap = new HashMap<>();for (SysOrg org : orgList) {OrgTreeResult node = new OrgTreeResult();BeanUtils.copyProperties(org, node);// 初始化子級列表node.setChildren(new  ArrayList<>());orgMap.put(org.getId(), node);}// 2. 構建樹形結構List<OrgTreeResult> rootNodes = new ArrayList<>();for (OrgTreeResult node : orgMap.values()) {if (node.getParentId() == null || node.getParentId().equals("-1")) {// 如果父節點為空或為"-1",說明是根節點rootNodes.add(node);} else {// 否則,找到父節點并添加到其子節點列表中OrgTreeResult parentNode = orgMap.get(node.getParentId());if (parentNode != null) {parentNode.getChildren().add(node);}}}// 3. 返回根節點列表return rootNodes;}

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

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

相關文章

騰訊 TDF 即將開源 Kuikly 跨端框架,Kotlin 支持全平臺

今天&#xff0c;在騰訊的 Shiply 平臺看 Flutter 動態化自研框架 Conch 時&#xff0c;在側邊欄看到了有「跨端開發框架」的介紹&#xff0c;點開發現有兩個產品&#xff1a; Hippy&#xff1a;面向前端技術棧的跨端開發框架&#xff0c;Web原生開發體驗&#xff0c;支持 Rea…

SQL AND OR 操作符詳解

SQL AND & OR 操作符詳解 在SQL(結構化查詢語言)中,AND 和 OR 是兩種非常重要的邏輯操作符,它們用于在查詢條件中組合多個條件。理解并正確使用這些操作符對于編寫有效的SQL查詢至關重要。 引言 在處理數據庫查詢時,我們常常需要根據多個條件來篩選數據。AND 和 OR…

nginx accesslog 打印自定義header

比如我在請求的header中添加了一個path-match-type&#xff0c;那我現在nginx的accesslog 中打印出來&#xff0c;應該如何配置呢&#xff1f; rootnginx-59f5d66df6-jw5k8:/# cat /etc/nginx/nginx.conf user nginx; worker_processes auto;error_log /var/log/nginx/erro…

響應式布局的設計規范

響應式設計&#xff08;Responsive Design&#xff09; 是一種 web 設計技術&#xff0c;旨在使網頁在不同的設備和屏幕尺寸上都有良好的顯示效果。響應式設計的核心思想是網頁的布局能夠根據設備的屏幕寬度、分辨率以及其他特性自動調整&#xff0c;使其適應桌面、平板和手機等…

說一下redis事務底層原理

Redis事務 1. 事務的基本流程 Redis 事務通過 MULTI、EXEC、WATCH 等命令實現&#xff0c;底層原理可以分為以下幾個步驟&#xff1a; (1) MULTI 命令 當客戶端發送 MULTI 命令時&#xff0c;Redis 會將客戶端標記為“事務模式”。在事務模式下&#xff0c;客戶端發送的所有…

【我的Android進階之旅】如何使用NanoHttpd在Android端快速部署一個HTTP服務器?

文章目錄 開篇:程序員的"摸魚神器"?一、為什么選擇NanoHttpd?二、五分鐘極速上車指南2.1 ? 第一步:引入依賴的哲學2.2 ? 第二步:創建服務器類:繼承大法好2.3 ? 第三步:啟動服務的儀式感三、高級玩法:讓服務器不再單調3.1 ?? 場景1:變身文件服務器3.2 ?…

播放器系列3——解碼

FFmpeg解碼過程詳解 解碼流程 #mermaid-svg-FGu92IEtteOdO2tO {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-FGu92IEtteOdO2tO .error-icon{fill:#552222;}#mermaid-svg-FGu92IEtteOdO2tO .error-text{fill:#5522…

SimPO算法-Simple Preference Optimizationwith a Reference-Free Reward

偏好優化&#xff08;preference optimization &#xff09;算法大全&#xff1a; 本篇介紹下SimPO SimPO&#xff08;Simple Preference Optimization&#xff09;的設計核心在于簡化偏好優化過程&#xff0c;同時提升模型的表現。其設計主要圍繞兩個關鍵點展開&#xff1a;長…

AIGC時代:如何快速搞定Spring Boot+Vue全棧開發

文章目錄 一、Spring Boot基礎二、Vue.js基礎三、Spring Boot與Vue.js集成四、性能優化與最佳實踐《快速搞定Spring BootVue全棧開發》 內容簡介作者簡介目錄前言/序言本書內容本書特點讀者對象 隨著人工智能生成內容&#xff08;AIGC&#xff09;技術的迅速發展&#xff0c;…

探秘基帶算法:從原理到5G時代的通信變革【六】CRC 校驗

文章目錄 2.5 CRC 校驗2.5.1 前言2.5.2 CRC算法簡介2.5.3 CRC計算的詳細過程2.5.4 CRC校驗的兩種方法詳解**分離比較法****整體運算法****不同位出錯與余數的關系****總結** 2.5.5 CRC計算的C實現及工具介紹**C實現CRC計算****CRC計算工具推薦** **2.5.6 總結&#xff1a;CRC校…

AUTOSAR微控制器抽象層(MCAL)詳解及綜合實例

目錄 1. 微控制器抽象層(MCAL)概述 1.1 MCAL的核心功能 1.2 MCAL的模塊劃分 1.3 MCAL的工作流程 2. MCAL的詳細功能解析 2.1 微控制器驅動 2.1.1 時鐘配置 2.1.2 電源管理 2.1.3 實例:時鐘配置 2.2 通信驅動 2.2.1 CAN驅動 2.2.2 實例:CAN通信的實現 2.3 I/O驅…

探究高空視頻全景AR技術的實現原理

1. 引言 筆者認為現階段AR技術的應用是還是比較坑爹的&#xff0c;大都是噱頭多但是實用的成分少&#xff0c;拿出來做做DEMO是可以&#xff0c;但是難以在實際的項目中落地產生實際的經濟價值。一方面是很難在業務上難以找到合適的應用場景&#xff08;可能管線相關的項目算一…

深度解析 | 2025 AI新突破,物理信息神經網絡(PINN):Nature級頂刊的「科研加速器」,70份源碼論文速取!

&#x1f525; 為什么全球頂尖實驗室都在押注PINN&#xff1f; 過去一年&#xff0c;物理信息神經網絡&#xff08;PINN&#xff0c;Physics-Informed Neural Networks&#xff09;以「現象級」姿態席卷科研圈&#xff1a;不僅在NeurIPS、ICML等頂會橫掃15%相關論文&#xff0c…

0基礎學前端---品優購項目Day14

0基礎學前端—品優購項目Day14 視頻參考&#xff1a;B站Pink老師 本節重點&#xff1a;all 項目鏈接&#xff1a;完整的項目已放到 品優購完整項目 大家可以自行下載 強調內容 這里主要強調兩個知識點&#xff1a; (1) 網站TDK三個標簽SEO優化 (2) logo SEO優化 網站TDK三個…

LeetCode熱題100JS(37/100)第七天|排序鏈表|合并K個升序鏈表|LRU緩存|二叉樹的中序遍歷|二叉樹的最大深度|對稱二叉樹

148. 排序鏈表 題目鏈接&#xff1a;???????148. 排序鏈表 難度&#xff1a;中等 刷題狀態&#xff1a;1刷 新知識&#xff1a; - dic.reduceRight((t,c)>(c.nextt,c),null) 方法從數組的末尾開始執行 解題過程 思考 示例 1&#xff1a; 輸入&#xff1a;head […

課程2. 機器學習方法論

課程2. 機器學習方法論 訓練算法并評估其質量將樣本分成訓練和測試。分層 交叉驗證方法sklearn 接口算法模型訓練模型的應用質量評估 數據預處理標準縮放Violinplot 數據集使用模型Pipeline 在上一講中&#xff0c;我們討論了機器學習專家面臨的挑戰。無論解決的問題類型和解決…

六足仿生機器人地形自適應步態規劃研究

六足仿生機器人地形自適應步態規劃研究 第1章 緒論第2章 機器人系統建模第3章 地形感知與建模第4章 自適應步態生成算法第5章 動力學仿真與實驗第6章 驅動代碼設計與實現源碼&文檔鏈接 第1章 緒論 1.1 研究背景與意義 1.2 國內外研究現狀 1.2.1 多足機器人步態規劃 1.2.2 …

mysql表分區

本文簡述了mysql表分區的作用和特點&#xff0c;又演示了mysql表分區的創建過程&#xff0c;詳細演示了指定不同分區目錄時的處理辦法。由于表分區對crud操作是透明的&#xff0c;對于普通開發同學其實不用過多關注&#xff0c;但是本著學習的態度&#xff0c;在分庫分表等高大…

Nessus安裝

Nessus&#xff1a;https://pan.quark.cn/s/f5fb09b6d4fb 1.軟件安裝 點擊安裝&#xff0c;剩下的下一步即可。 直接下一步安裝即可 2.Web端安裝 會彈出一個web窗口 開始初始化 創建用戶 開始初始化 3.Cracker 會彈一個黑窗口 運行完&#xff0c;回車即可。訪問https://loc…

26-小迪安全-模塊引用,mvc框架,渲染,數據聯動0-rce安全

先創建一個新聞需要的庫 這樣id值可以逐級遞增 然后隨便寫個值&#xff0c;讓他輸出一下看看 模板引入 但是這樣不夠美觀&#xff0c;這就涉及到了引入html模板 模板引入是html有一個的地方值可以通過php代碼去傳入過去&#xff0c;其他的html界面直接調用&#xff0c;這樣頁…