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.mzph.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;这样页…