当前位置: 首页 > article >正文

苍穹外卖需要注意的地方

公共字段自动填充自定义注解AutoFill公共字段自动填充和反射有很大的关系公共字段填充中自定义注解AutoFill -反射在查找给某个方法进行公共字段填充的时候的标识反射与注解认识注解属性名后面要加在使用的时候把注解写在方法上括号内为属性名赋值特殊情况在注解只有一个属性value的时候在方法上面给value赋值的时候可以不写value注解的原理就是注解本质上是一个接口继承了Annotation方法在给注解中的属性赋值的时候实际上是在实现注解给注解创造实现类对象又因为继承的特殊性实现了子类注解也就实现了Annotation注解元注解Target注解说明注解可以在哪里使用Retention注解说明注解的保留周期注解的解析自定义切面在执行update和insert方法的时候开启公共字段的自动填充通过反射获取方法签名从而获取签名中的对数据库的操作类型通过反射获取方法先获取类再获取方法通过反射获取的不同方法对于不同的方法设置不同的数据/* 自定义切面实现公共字段自动填充处理逻辑 */ //加入切面注解 Aspect //Bean类交给spring容器管理 Component Slf4j public class AutoFillAspect { /* 切入点 */ Pointcut(execution(com.sky.annotation.AutoFill * com.sky.mapper.*.*(..))) public void autoFillPointCut() { } /* 前置通知在通知中进行公共字段的赋值 */ Before(autoFillPointCut()) public void autoFill(JoinPoint joinPoint) { log.info(开始进行公共字段的自动填充); //获取到当前被拦截的方法上的数据库的操作类型 //1.获取方法签名对象 MethodSignature signature (MethodSignature) joinPoint.getSignature(); //2.获取方法上的注解对象 AutoFill autoFill signature.getMethod().getAnnotation(AutoFill.class); //3.获取数据库的操作类型 OperationType operationType autoFill.value(); //获取到当前被拦截的方法的参数--实体对象 //做出一个约定把实体对象放在参数的第一个 Object[] args joinPoint.getArgs(); if(args null args.length 0){ return; } Object entity args[0]; //准备赋值的数据 LocalDateTime now LocalDateTime.now(); Long currentId BaseContext.getCurrentId(); //根据当前不同的操作类型为参数的不同属性通过反射赋值 if(operationType.equals(OperationType.INSERT)){ //为四个公共字段赋值 try { Method setCreateTime entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_TIME, LocalDateTime.class); Method setCreateUser entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_USER, Long.class); Method setUpdateTime entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class); Method setUpdateUser entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class); //通过反射为对象属性赋值 setCreateTime.invoke(entity,now); setCreateUser.invoke(entity,currentId); setUpdateTime.invoke(entity,now); setUpdateUser.invoke(entity,currentId); } catch (Exception e) { throw new RuntimeException(e); } }else if(operationType.equals(OperationType.UPDATE)){ try { Method setUpdateTime entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class); Method setUpdateUser entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class); //通过反射为对象属性赋值 setUpdateTime.invoke(entity,now); setUpdateUser.invoke(entity,currentId); } catch (Exception e) { throw new RuntimeException(e); } } } }查询回显-一对多多表查询—两张表分开查询Service 层核心分开两次查询Service public class CategoryServiceImpl implements CategoryService { Autowired private CategoryMapper categoryMapper; Autowired private SetmealMapper setmealMapper; // 注入套餐Mapper /** * 分开查询分类 套餐一对多 */ Override public CategoryVO getCategoryWithSetmeal(Long categoryId) { // 第一次查询查 主表一的一方 Category category categoryMapper.getById(categoryId); // 第二次查询查 从表多的一方 // 根据分类ID查所有套餐 ListSetmeal setmealList setmealMapper.getByCategoryId(categoryId); // 手动封装成 VO CategoryVO vo new CategoryVO(); BeanUtils.copyProperties(category, vo); vo.setSetmealList(setmealList); return vo; } }—另一种方法XML 核心一对多查询最关键resultMap idCategoryWithSetmealMap typecom.sky.vo.CategoryVO !-- 一的一方分类 -- id columnc_id propertyid/ result columnc_name propertyname/ !-- 多的一方套餐一对多核心 -- collection propertysetmealList ofTypecom.sky.entity.Setmeal id columns_id propertyid/ result columns_name propertyname/ result columns_price propertyprice/ /collection /resultMap !-- 一对多关联查询 SQL -- select idgetCategoryWithSetmeal resultMapCategoryWithSetmealMap SELECT c.id AS c_id, c.name AS c_name, s.id AS s_id, s.name AS s_name, s.price AS s_price FROM category c LEFT JOIN setmeal s ON c.id s.category_id WHERE c.id #{categoryId} /select表套表--修改的复杂情况口味可能被是被删掉了也可能是被修改了不好说调用哪个接口所以采用先删除后上传的方法在新增菜品的时候如果还要新增口味就只能在菜品添加完毕并返回主键ID之后才能添加口味insert idinsert useGeneratedKeystrue keyPropertyid insert into dish(name, category_id, price, image, description, create_time, update_time, create_user, update_user, status) values (#{name},#{categoryId},#{price},#{image},#{description}, #{createTime},#{updateTime},#{createUser},#{updateUser},#{status}) /insertTransactional Override public void saveWithFlavor(DishDTO dishdto) { Dish dish new Dish(); BeanUtils.copyProperties(dishdto,dish); //向菜品表插入1条数据 dishMapper.insert(dish); //获取insert语句生成的主键值 Long dishIddish.getId(); //向口味表插入n条数据,支持批量插入 ListDishFlavor flavors dishdto.getFlavors(); if(flavors!null !flavors.isEmpty()){ for(DishFlavor flavor:flavors){ flavor.setDishId(dishId); } dishFlavorMapper.insertBatch(flavors); } }接口参数规则解析这张表是一个 **【修改套餐状态】** 的接口文档我帮你把参数的含义、位置、以及前后端怎么对接彻底讲清楚。一、接口核心信息请求方式PUT / POST通常是修改状态请求格式JSONBody 体路径参数status在 URL 路径中Query 参数id在 URL 问号后二、参数位置与规则3 个参数全覆盖1. Header请求头参数名值说明Content-Typeapplication/json必须填表示我发送的是 JSON 格式数据缺了这个后端解析不到数据。2. 路径参数Path Param参数名示例备注status1套餐状态1 起售打开售卖0 停售禁止售卖这个参数拼在 URL 路径里。3. Query 参数Query Param参数名是否必须示例备注id是101套餐 ID要修改的那个套餐的 ID比如 101 号套餐这个参数拼在 URL?后面。三、正确的请求 URL拼接规则根据接口文档请求的 URL 要这样写/api/setmeal/[status]?id[套餐id]实际例子修改 101 号套餐为起售PUT http://localhost:8080/api/setmeal/1?id101/1路径参数status1表示起售?id101Query 参数id101表示修改 ID 为 101 的套餐四、后端代码怎么接Java 解析因为参数在路径和Query两个地方后端 Controller 要分开接收。1. Controller 写法核心PutMapping(/setmeal/{status}) // 这里捕获路径参数 status ApiOperation(修改套餐状态) public ResultString updateStatus( // 接收路径参数 PathVariable Integer status, // 接收 Query 参数 RequestParam Long id ) { log.info(修改套餐状态id{}, status{}, id, status); // 调用 Service 处理逻辑 setmealService.updateStatus(id, status); return Result.success(修改成功); }2. DTO / 实体类不需要写 DTO因为参数很少直接用RequestParam和PathVariable接不用写SetmealDTO如果是复杂的新增 / 修改才用 DTO。五、前端请求代码Vue 示例前端必须按照这个规则发送请求URL 格式不能错。// 1. 定义参数 const status 1; // 起售 const id 101; // 套餐ID // 2. 发送请求 // 注意URL 要拼接 /status?idxxx await axios.put(/api/setmeal/${status}?id${id});六、特别注意避坑指南Content-Type必须是application/json虽然这个接口传的参数很少只有 id但因为是 PUT 请求后端通常要求接收 JSON 体。如果后端报错Required request body is missing说明你没加这个 Header或者没传 JSON 体。参数位置不要搞混status写在路径里/1id写在查询参数里?id101不要把id写到路径里严格按照文档来。Path 参数 vs Query 参数我用最通俗的方式把本质区别、使用场景、前后端写法一次性讲透帮你彻底分清。一、本质区别一句话总结维度Path 参数路径参数Query 参数查询参数位置URL路径中/xxx/{id}URL? 后面?idxxxnamexxx作用标识资源本身比如「哪个套餐」「哪个用户」对资源做筛选、分页、条件、附加操作是否必须通常是必填缺了就找不到资源通常是可选不传用默认值格式直接嵌入路径无key只有值keyvalue键值对多参数用分隔缓存友好性路径变了 资源变了适合做缓存同一资源不同参数缓存需特殊处理二、直观对比用你刚才的套餐接口举例1. 路径参数Path ParamURL 示例/admin/setmeal/1含义1是路径参数代表「状态 1起售」直接嵌在 URL 路径里特点是 URL 的一部分缺了这个路径就不存在404适用场景资源的状态、类型、分类比如/setmeal/{status}、/user/{id}2. 查询参数Query ParamURL 示例/admin/setmeal/1?id101含义id101是查询参数在?后面是对路径资源的附加条件特点不是 URL 的核心路径不传也能访问后端做默认值处理适用场景分页、筛选、排序、附加参数比如?page1pageSize10、?status1三、核心使用场景怎么选✅ 什么时候用 Path 参数标识唯一资源/user/{userId}、/order/{orderId}必须传否则找不到资源资源的分类 / 状态/setmeal/{status}、/category/{type}状态是资源的属性嵌在路径里RESTful 风格接口符合「URL 代表资源HTTP 方法代表操作」的设计规范✅ 什么时候用 Query 参数分页查询/setmeal/page?page1pageSize10条件筛选/setmeal?categoryId13status1排序 / 搜索/setmeal?name套餐sortcreateTime可选附加参数非必须不传不影响核心资源访问四、后端代码写法SpringBoot 对比1. Path 参数PathVariable// 路径参数{status} 嵌在URL里 PutMapping(/setmeal/{status}) public Result updateStatus( PathVariable Integer status, // 绑定路径中的{status} RequestParam Long id // 绑定?后面的id ) { // 逻辑... }必须用PathVariable注解参数名要和路径占位符{status}完全一致路径参数是 URL 的一部分缺了会 4042. Query 参数RequestParam/ 自动绑定// Query参数?idxxxnamexxx GetMapping(/setmeal/page) public Result page(SetmealPageQueryDTO dto) { // 自动绑定?后面的参数到DTO } // 或者单独接收 GetMapping(/setmeal) public Result list( RequestParam(required false) String name, RequestParam(defaultValue 1) Integer page ) { // 逻辑... }用RequestParam或直接用 DTO接收支持requiredfalse可选、defaultValue默认值多参数用分隔顺序不影响五、前端请求写法Axios 对比1. Path 参数// 路径参数直接拼在URL里 const status 1; const id 101; axios.put(/admin/setmeal/${status}?id${id});2. Query 参数// Query参数用params对象自动拼接 axios.get(/admin/setmeal/page, { params: { page: 1, pageSize: 10, categoryId: 13, status: 1 } }); // 自动生成URL/admin/setmeal/page?page1pageSize10categoryId13status1六、关键避坑指南1. 不要搞混参数位置路径参数是URL 的一部分不能用?包裹Query 参数必须在?后面多参数用分隔错误示例/setmeal?status1?id101?只能有一个后面全是 Query 参数2. Path 参数的 RESTful 规范路径参数尽量用单数/user/{userId}不要/users/{userId}不要把多个参数都塞路径里/setmeal/{id}/{status}不如/setmeal/{id}?status{status}清晰3. Query 参数的空值处理Query 参数支持requiredfalse不传时后端用默认值路径参数通常是必填不传会 404适合做强校验七、一句话总结面试 / 工作都能用Path 参数是「资源的身份证」用来定位唯一资源Query 参数是「资源的筛选条件」用来对资源做附加操作。遵循 RESTful 风格URL 定位资源Query 描述操作。pagehelper的细节PageHelper 原理一、PageHelper 到底是什么它是一个MyBatis 拦截器Interceptor作用自动帮你拼接分页 SQL不用你自己写LIMIT ?,?二、核心原理一句话PageHelper 在执行你的查询 SQL 之前偷偷拦截自动帮你改成 分页 SQL然后再执行。三、它的工作流程4 步走1. 你写PageHelper.startPage(1, 10);作用把 page1、pageSize10 存到当前线程里ThreadLocal2. 你执行查询ListSetmealVO list mapper.page(dto);3. PageHelper 拦截器工作拦截你的 SQL从 ThreadLocal 取出page1, pageSize10*自动计算offset (1-1)10 0把你的 SQL 改成分页 SQLSELECT * FROM table LIMIT 0,104. 返回分页结果 Page/PageInfo总条数当前页数据总页数四、为什么你之前page 不生效只有 pageSize 生效因为你违反了 PageHelper 最核心的规则 规则 1必须紧跟在查询方法前面中间不能有任何代码java运行// 正确 PageHelper.startPage(1,10); List list mapper.select(); // 错误分页失效 PageHelper.startPage(1,10); 其他代码(); List list mapper.select(); 规则 2查询方法必须返回 List 类型你之前写xmlresultTypePageResult→ 返回的不是 List→ PageHelper无法拦截→ 只能拼出sqlLIMIT 10→page 失效 规则 3page 不能是 0 或 nulljava运行PageHelper.startPage(0,10);→ 生成 SQLsqlLIMIT 10→ 只有 pageSize 生效五、PageHelper 最关键的 3 个知识点1. 基于ThreadLocal存储分页参数2. 基于MyBatis 拦截器改写 SQL3. 只对紧跟的第一条查询生效六、你之前的错误总结XML 返回类型错误返回 PageResult 而不是 VOPageHelper 无法拦截生成错误 SQLLIMIT 10page 不生效只有 pageSize 生效七、正确写法最终版java运行// 1. 开启分页 PageHelper.startPage(pageNum, pageSize); // 2. 立刻查询必须紧跟 ListSetmealVO list setmealMapper.page(dto); // 3. 封装分页 PageInfoSetmealVO pageInfo new PageInfo(list); return new PageResult(pageInfo.getTotal(), pageInfo.getList());select idpage resultTypeSetmealVO ... /selectPageHelper 自动帮你拼 LIMIT 的拦截器必须紧跟查询、必须返回 List、page 不能为 0PageHelper 原理极简版PageHelper.startPage(page, pageSize)把分页参数存到当前线程的ThreadLocal里。执行查询紧接着的第一条List?查询会被 PageHelper 的MyBatis 拦截器截获。自动改 SQL拦截器根据线程里的分页参数自动计算offset (page-1)*pageSize给你的 SQL 加上LIMIT offset, pageSize。封装分页结果查询完返回Page/PageInfo包含总条数、当前页数据。核心记住这 3 条只对紧跟的第一条查询生效必须返回List才能分页基于ThreadLocal MyBatis 拦截器实现以后再出现 “只有 pageSize 生效”你就知道要么page 是 0要么没紧跟查询要么返回不是 List。

相关文章:

苍穹外卖需要注意的地方

公共字段自动填充自定义注解AutoFill公共字段自动填充和反射有很大的关系公共字段填充中自定义注解AutoFill ->反射在查找给某个方法进行公共字段填充的时候的标识反射与注解认识注解属性名后面要加()在使用的时候把注解写在方法上,括号内…...

从零搭建AI开发环境:Python 3.10.11、CUDA 12.1与PyTorch一站式配置指南

1. 环境准备:从零开始的硬件与软件检查 在开始搭建AI开发环境之前,我们需要确保硬件和基础软件都满足要求。我遇到过很多新手朋友因为忽略了这个步骤,导致后续安装过程频频出错。首先确认你的电脑配备了NVIDIA显卡,这是使用CUDA加…...

华为ENSP OSPF实验避坑指南:配置Stub区域、路由聚合与DR选举的常见错误

华为ENSP OSPF实验避坑指南:配置Stub区域、路由聚合与DR选举的常见错误 在华为ENSP模拟环境中进行OSPF多区域配置时,即使是经验丰富的网络工程师也难免会遇到各种"坑"。本文将从实际排错角度出发,深入剖析Stub区域配置、路由聚合计…...

Python+AI:自动分析财报数据的5个实战技巧

总共28小时,整整3天半! 而且这还只是季报,如果是年报更厚。更崩溃的是,有些公司财报格式不统一,找数据像大海捞针。 我当时的想法是:这活儿能不能自动化? 一、解决方案:PythonAI自动…...

IDEA鲜亮配色方案实战:Java/Mapper.xml/yml文件高亮配置指南(附下载)

IDEA鲜亮配色方案实战:Java/Mapper.xml/yml文件高亮配置指南(附下载) 长时间面对单调的代码编辑器界面容易导致视觉疲劳,而一套精心设计的配色方案不仅能提升编码愉悦度,还能通过色彩区分显著提高代码阅读效率。本文将…...

【声纳与人工智能融合——从理论前沿到自主系统实战(进阶篇)】第十五章 条件正规化流(CNF)的AUV风险敏感路径规划

目录 15.1 未知环境下的概率占据补全 15.1.1 时空图表征声纳、惯导与海流先验的边可行性与风险 15.1.2 基于连续正规化流的未探测区域多假设采样 15.1.3 将模型不确定性耦合至条件风险价值与机会约束规划 Ch15_1_3_CNF_PathPlanner.py 15.1 未知环境下的概率占据补全 15.1…...

如何降低seo关键字价格

如何降低SEO关键字价格 在当今竞争激烈的互联网市场中,搜索引擎优化(SEO)已经成为企业提升网站流量和品牌知名度的重要手段。其中,关键字的选择和优化直接影响到SEO的效果。关键字的价格往往高昂,特别是竞争度较高的关…...

低成本搭建方案:树莓派运行OpenClaw连接千问3.5-9B云接口

低成本搭建方案:树莓派运行OpenClaw连接千问3.5-9B云接口 1. 为什么选择树莓派OpenClaw组合 去年冬天,我在整理个人知识库时被重复的文件归档工作折磨得苦不堪言。当时尝试过各种自动化工具,要么需要昂贵的云服务订阅,要么对硬件…...

seo网站推广与社交媒体营销的结合_seo网站推广的投资回报率如何计算

SEO网站推广与社交媒体营销的结合:如何计算SEO网站推广的投资回报率 在当今的数字营销时代,SEO网站推广和社交媒体营销是两个不可或缺的组成部分。它们的结合可以帮助企业更好地吸引潜在客户,提高品牌知名度,并最终推动销售增长。…...

seo网站诊断需要哪些资料_seo网站诊断的重要性是什么

SEO网站诊断需要哪些资料 网站的关键字分析资料 关键字分析是SEO网站诊断中的核心部分之一。你需要收集关于网站当前使用的关键字的数据,包括关键字的搜索量、竞争程度、点击率和转化率等信息。可以使用工具如Google关键字规划师、Ahrefs或SEMrush来获取这些数据。…...

梦幻动漫魔法工坊实战:用LoRA轻松打造专属动漫风格

梦幻动漫魔法工坊实战:用LoRA轻松打造专属动漫风格 1. 为什么你需要这个动漫生成工具 想象一下,你脑海中浮现出一个可爱的猫耳少女形象,粉色长发在微风中飘动,穿着精致的洛丽塔裙子站在糖果色的背景前。传统方式下,你…...

5分钟搞定GLM-4.7-Flash:Web界面+API调用,小白也能轻松上手

5分钟搞定GLM-4.7-Flash:Web界面API调用,小白也能轻松上手 1. 前言:为什么选择GLM-4.7-Flash 如果你正在寻找一个强大且易于使用的中文大语言模型,GLM-4.7-Flash绝对值得考虑。作为智谱AI最新推出的开源模型,它采用了…...

2026届毕业生推荐的六大降重复率神器推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 基于人工智能产出内容越来越普遍的当前状况,文本里常常出现的模式化表达形态&…...

AO3镜像站终极访问指南:3步解决同人作品访问难题

AO3镜像站终极访问指南:3步解决同人作品访问难题 【免费下载链接】AO3-Mirror-Site 项目地址: https://gitcode.com/gh_mirrors/ao/AO3-Mirror-Site Archive of Our Own(AO3)作为全球最大的同人作品平台,为无数创作者和读…...

2026最权威的五大降AI率网站推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 使AIGC检测率降低的关键之处在于把机器生成的规律性特征给消除,首先,…...

Multus-CNI快速部署教程:5分钟搞定多网络接口配置

Multus-CNI快速部署教程:5分钟搞定多网络接口配置 【免费下载链接】multus-cni A CNI meta-plugin for multi-homed pods in Kubernetes 项目地址: https://gitcode.com/gh_mirrors/mu/multus-cni 在当今复杂的云原生环境中,Kubernetes Pod通常需…...

2026届必备的十大降AI率平台实测分析

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 旨在降低AIGC检测率的工具,其发挥功效的途径多种多样。其一,借助对词…...

计算机毕业设计:Python新能源汽车舆情与个性化推荐平台 Django框架 snowNLP 协同过滤推荐算法 requests爬虫 可视化(建议收藏)✅

博主介绍:✌全网粉丝50W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战8年之久,选择我们就是选择放心、选择安心毕业✌ > 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与…...

过期域名抢注对SEO优化有什么影响

过期域名抢注对SEO优化有什么影响 在互联网时代,域名作为网站的“地址”在搜索引擎优化(SEO)中占据重要地位。当一个域名过期且没有被注册,它就成为了一个“空壳”,任何人都可以抢注。过期域名抢注对SEO优化有什么影响…...

网站SEO与用户体验的关系是什么_高质量内容创作的技巧是什么

网站SEO与用户体验的关系是什么 在互联网时代,网站的成功往往取决于其在搜索引擎上的排名和用户体验的质量。这两者之间存在着密切的关系。一个高质量的网站不仅能在搜索结果中获得更好的排名,还能吸引并留住更多的用户。因此,了解网站SEO&a…...

SEO深度优化需要注意哪些事项_SEO深度优化有哪些方法

SEO深度优化需要注意哪些事项 在当今的数字营销环境中,SEO(搜索引擎优化)深度优化已经成为提升网站流量和品牌知名度的关键手段。百度作为中国最大的搜索引擎,其算法不断更新,这对于网站的SEO深度优化提出了更高的要求…...

标书制作入门

电子标书时代来了,但很多中小企业还在用老方法踩坑🕳️ 伟发标书10年经验,今天说点大实话👇一、电子标书不是"纸质版扫描件"📄 很多人以为电子标书就是把纸质文件转成PDF,大错特错❌ 真正的电子标…...

郭锐入局智界,再造一个“荣耀”?

出品 | 何玺排版 | 叶媛4月2日,智界汽车官宣,郭锐出任董事长兼首席执行官,全面负责公司经营管理工作,即日起生效。消息一出,行业侧目。让人们侧目的,不是智界任命高管的消息,而是郭锐这个名字。…...

LongCat-Image 图像生成模型,编辑能力登顶开源SOTA

在技术领域,我们常常被那些闪耀的、可见的成果所吸引。今天,这个焦点无疑是大语言模型技术。它们的流畅对话、惊人的创造力,让我们得以一窥未来的轮廓。然而,作为在企业一线构建、部署和维护复杂系统的实践者,我们深知…...

陈强的笔记

1. 原子性要求:关系的分量必须是不可分的数据项,禁止“表中表”,这是关系模型的核心约束。2. 三类完整性的区分:实体完整性针对主码,参照完整性针对外码,用户定义完整性针对业务规则,三者缺一不…...

SEO和SEM分别适合哪些具体的营销目标_如何平衡SEO和SEM的投入

SEO和SEM分别适合哪些具体的营销目标 在当今数字化营销的时代,SEO(搜索引擎优化)和SEM(搜索引擎营销)是两种非常重要的工具。它们各有其独特的优势和适用场景,理解它们的不同之处,有助于我们在…...

Ryujinx模拟器技术指南:在PC上运行Switch游戏的完整方案

Ryujinx模拟器技术指南:在PC上运行Switch游戏的完整方案 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx Ryujinx是一款用C#编写的开源Nintendo Switch模拟器,它…...

MATLAB FFT 入门到实战:信号分析与频率分解的完整指南

文章目录What Is FFT, Anyway?MATLAB FFT Basics: Step-by-Step Code3 Common FFT Pitfalls (And How to Fix Them)1. Forgetting to Scale Magnitude2. Ignoring SymmetryAdvanced Tips to Level Up Your FFT GameZero-Padding for Smoother PlotsFiltering Noisy SignalsRea…...

seo 推广公司一般多久能见效果_seo 推广公司是否值得信赖

SEO推广公司一般多久能见效果 在当今互联网时代,SEO(搜索引擎优化)推广已经成为企业提升网站流量和品牌知名度的关键手段。许多企业选择了与SEO推广公司合作,希望通过专业的优化服务迅速提升网站在搜索引擎中的排名。但是&#x…...

SimpleDateFormat 线程安全问题及修复方案

目录概述一、问题背景二、线程不安全的原理分析2.1 内部状态共享2.2 字段解析的非原子性2.3 异常的不可预测性三、问题复现代码示例四、修复与替代方案4.1 方案一:方法内创建(Thread-Local)4.2 方案二:使用 ThreadLocal 封装4.3 方…...