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

MyBatis 参数处理全解析

在 Java 开发领域,MyBatis 作为一款优秀的持久层框架,凭借其简洁的设计和强大的功能,受到了广大开发者的青睐。而参数处理作为 MyBatis 中一个至关重要的环节,掌握好它能让我们更高效地使用 MyBatis 进行数据库操作。本文将全面深入地探讨 MyBatis 参数处理的相关知识。

一、基本参数类型处理

1. 基本数据类型

当我们使用基本数据类型(如 intStringboolean 等)作为参数时,MyBatis 处理起来十分简单直接。在 XML 映射文件中,我们可以通过 parameterType 属性指定参数类型,然后在 SQL 语句里使用 #{} 占位符引用参数。

<select id="findUserById" parameterType="int" resultType="com.example.entity.User">SELECT * FROM user WHERE id = #{id}
</select>

在上述代码中,parameterType="int" 明确表示传入的参数是 int 类型。#{id} 就是对传入参数的引用,MyBatis 会自动将传入的 int 类型参数值绑定到该占位符上。

2. 基本数据类型的包装类

对于基本数据类型的包装类(如 IntegerStringBoolean 等),处理方式与基本数据类型类似。

<select id="findUserByUsername" parameterType="java.lang.String" resultType="com.example.entity.User">SELECT * FROM user WHERE username = #{username}
</select>

这里 parameterType="java.lang.String" 表明传入的是 String 类型的参数,MyBatis 会把传入的 String 值绑定到 #{username} 占位符上。

二、对象类型参数处理

1. 简单 Java 对象

当传入的参数是一个简单的 Java 对象时,我们可以通过对象的属性名来引用参数。

<insert id="insertUser" parameterType="com.example.entity.User">INSERT INTO user (username, password, age) VALUES (#{username}, #{password}, #{age})
</insert>

在这个例子中,parameterType="com.example.entity.User" 表示传入的是 User 类型的对象。MyBatis 会自动将 User 对象的 usernamepassword 和 age 属性值分别绑定到对应的占位符上。

2. 包含嵌套对象的 Java 对象

如果 Java 对象中包含嵌套对象,我们可以通过点号(.)来访问嵌套对象的属性。

<select id="findOrderByUserAddress" parameterType="com.example.entity.Order" resultType="com.example.entity.Order">SELECT * FROM order WHERE user.address = #{user.address}
</select>

这里假设 Order 对象中包含一个 User 对象,而 User 对象又包含 address 属性。MyBatis 会按照对象的层次结构正确地获取并绑定相应的属性值。

三、集合类型参数处理

1. List 集合

当传入的参数是 List 集合时,我们可以使用 foreach 标签来遍历集合。

<select id="findUsersByIds" parameterType="java.util.List" resultType="com.example.entity.User">SELECT * FROM user WHERE id IN<foreach item="item" index="index" collection="list"open="(" separator="," close=")">#{item}</foreach>
</select>

在这个 foreach 标签中,item 表示集合中的每个元素,index 表示元素的索引,collection="list" 表示传入的集合参数。openseparator 和 close 分别表示开始符号、分隔符和结束符号。MyBatis 会将集合中的元素依次取出并拼接成 SQL 语句中的 IN 子句。

2. Map 集合

对于 Map 集合,我们可以通过键名来引用参数。

<select id="findUsersByConditions" parameterType="java.util.Map" resultType="com.example.entity.User">SELECT * FROM user WHERE username = #{username} AND age = #{age}
</select>

这里假设传入的 Map 集合中包含 "username" 和 "age" 这两个键。MyBatis 会根据键名从 Map 中取出对应的值并绑定到 SQL 语句的占位符上。

四、多个参数处理

1. 使用 @Param 注解

当方法有多个参数时,我们可以使用 @Param 注解为每个参数指定一个名称。

public interface UserMapper {User findUserByIdAndUsername(@Param("id") int id, @Param("username") String username);
}
<select id="findUserByIdAndUsername" resultType="com.example.entity.User">SELECT * FROM user WHERE id = #{id} AND username = #{username}
</select>

在这个例子中,@Param 注解为参数 id 和 username 分别指定了名称,这样在 XML 映射文件中就可以通过这些名称来引用参数。

2. 使用 JavaBean 封装参数

另一种处理多个参数的方式是使用 JavaBean 来封装这些参数。

public class UserQuery {private int id;private String username;// 省略 getter 和 setter 方法
}
public interface UserMapper {User findUserByQuery(UserQuery userQuery);
}
<select id="findUserByQuery" parameterType="com.example.entity.UserQuery" resultType="com.example.entity.User">SELECT * FROM user WHERE id = #{id} AND username = #{username}
</select>

五、参数处理的注意事项

1. #{} 和 ${}的区别

在 MyBatis 中,#{} 和 ${} 都可以用于引用参数,但它们的处理方式不同。#{} 会对参数进行预编译处理,能有效防止 SQL 注入攻击;而 ${} 只是简单的字符串替换,可能会存在 SQL 注入风险,因此在使用时要谨慎。

2. parameterType 属性的使用

parameterType 属性可以帮助我们明确指定参数的类型,提高代码的可读性和可维护性。虽然在某些情况下可以省略该属性,让 MyBatis 自动推断参数类型,但为了避免潜在的问题,建议还是明确指定。

3. 类型转换

MyBatis 会自动进行一些基本的类型转换,但在处理复杂类型时,可能需要我们手动进行类型转换或使用自定义的类型处理器。

六、总结

MyBatis 的参数处理功能丰富且灵活,通过合理运用不同的参数处理方式,我们可以轻松应对各种复杂的数据库操作场景。在实际开发中,要根据具体的需求选择合适的参数处理方法,并注意相关的注意事项,这样才能充分发挥 MyBatis 的优势,提高开发效率和代码质量。

希望本文能帮助你更好地理解和掌握 MyBatis 的参数处理机制,让你在使用 MyBatis 进行数据库开发时更加得心应手。

以上就是关于 MyBatis 参数处理的详细介绍,如果你在使用过程中遇到任何问题,欢迎留言交流。

相关文章:

MyBatis 参数处理全解析

在 Java 开发领域&#xff0c;MyBatis 作为一款优秀的持久层框架&#xff0c;凭借其简洁的设计和强大的功能&#xff0c;受到了广大开发者的青睐。而参数处理作为 MyBatis 中一个至关重要的环节&#xff0c;掌握好它能让我们更高效地使用 MyBatis 进行数据库操作。本文将全面深…...

【自然语言处理与大模型】使用Xtuner进行QLoRA微调实操

本文首先对Xtuner这一微调框架进行简单的介绍。手把手演示如何使用Xtuner对模型进行微调训练&#xff0c;包括数据准备、训练命令执行及训练过程中的监控技巧。最后&#xff0c;在完成微调之后&#xff0c;本文还将介绍如何对微调结果进行简单对话测试。 一、Xtuner微调框架 X…...

2023华为od统一考试B卷【二叉树中序遍历】

前言 博主刷的华为机考题&#xff0c;代码仅供参考&#xff0c;因为没有后台数据&#xff0c;可能有没考虑到的情况 如果感觉对你有帮助&#xff0c;请点点关注点点赞吧&#xff0c;谢谢你&#xff01; 题目描述 思路 0.用Character数组存储树&#xff0c;index下标的左右…...

Midjourney 绘画 + AI 配音:组合玩法打造爆款短视频!

一、引言:AI 重构短视频创作范式 在某短视频工作室的深夜剪辑室里,资深编导正在为一条古风剧情视频发愁:预算有限无法实拍敦煌场景,人工绘制分镜耗时 3 天,配音演员档期排到一周后。而使用 Midjourney 生成敦煌壁画风格的场景图仅需 15 分钟,AI 配音工具实时生成多角色台…...

敏感词 v0.25.1 新特性之返回匹配词,修正 tags 标签

开源项目 敏感词核心 https://github.com/houbb/sensitive-word 敏感词控台 https://github.com/houbb/sensitive-word-admin 版本特性 大家好&#xff0c;我是老马。 敏感词以前在实现的时候&#xff0c;没有返回底层实际匹配的词&#xff0c;有时候问题排查非常耗费时间。 …...

【多线程】六、基于阻塞队列的生产者消费者模型

文章目录 Ⅰ. 生产者消费者模型的概念Ⅱ. 生产者消费者模型的优点Ⅲ. 基于阻塞队列的生产者消费者模型MakefileBlock_queue.hpptask.hpptest.cppⅣ. 如何理解提高了效率❓❓❓Ⅰ. 生产者消费者模型的概念 ​ 生产者消费者模型是一种常见的并发模式,用于解决生产者和消费者之间…...

解决Flutter项目中Gradle构建Running Gradle task ‘assembleDebug‘卡顿问题的终极指南

解决Flutter项目中Gradle构建Running Gradle task ‘assembleDebug‘卡顿问题的终极指南 前言 在开发Flutter应用时,经常会遇到Gradle构建卡在Running Gradle task assembleDebug阶段的问题。本文将分享如何通过配置华为云镜像和使用自定义脚本下载依赖的方法解决这些问题。…...

IntelliJ IDEA 保姆级使用教程

文章目录 一、创建项目二、创建模块三、创建包四、创建类五、编写代码六、运行代码注意 七、IDEA 常见设置1、主题2、字体3、背景色 八、IDEA 常用快捷键九、IDEA 常见操作9.1、类操作9.1.1、删除类文件9.1.2、修改类名称注意 9.2、模块操作9.2.1、修改模块名快速查看 9.2.2、导…...

从此,K8S入门0门槛!

前言 当你想要入门K8S的时候&#xff0c;往往会被各种概念搞的晕乎乎的&#xff0c;什么API Server&#xff0c;Scheduler&#xff0c;Controller manager&#xff0c;Etcd&#xff0c;Pod&#xff0c;Kubelet&#xff0c;kube-proxy&#xff0c;deployment…… 哪怕你使用了…...

vue2和vue3组件如何监听子组件生命周期

在 Vue 中监听子组件的生命周期是一个常见需求&#xff0c;但 Vue 官方并不直接推荐这么做&#xff0c;因为这会打破组件的封装性。但在**一些特定场景&#xff08;如自动化监控、封装逻辑复用&#xff09;**下仍是有意义的。 下面分别讲解 Vue 2 和 Vue 3 中如何监听 子组件的…...

如何用Python绘制两个圆之间的8条公切线

引言 在几何学中&#xff0c;两圆之间存在多种类型的公共切线。本文将通过Python代码演示如何绘制两个同心圆&#xff08;半径分别为1.0和3.0&#xff09;之间的8条公切线&#xff0c;并解释相关数学原理与代码实现细节。 环境准备 import matplotlib.pyplot as plt import …...

会话历史管理——持久化

​​需求场景​​​​推荐方案​​​​理由​​中小企业级应用&#xff0c;需复杂查询MySQL/PostgreSQL事务支持完善&#xff0c;开发成本低海量数据高并发写入Cassandra水平扩展性强&#xff0c;写入性能高非结构化历史数据快速检索MongoDB灵活存储&#xff0c;内置全文检索本…...

C++之IO流

目录 一、C语言的输入与输出 二、流是什么 三、CIO流 3.1、C标准IO流 3.2、C文件IO流 四、stringstream的简单介绍 一、C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 scanf(): 从标准输入设备(键盘)读取数据&#xff0c;并将值存放…...

maven install时报错:【无效的目标发行版: 17】

在很多次运行项目前的maven install时&#xff0c;我总是遇到无效的目标发行版: 17的问题&#xff0c;解决过之后就又忘了怎么解决&#xff0c;浪费了很多时间。。 今天把他总结一下&#xff0c;如图报错&#xff1a; 解决方法 注意&#xff1a; 如果只想解决这个项目的问题…...

开闭原则(OCP)

非常棒的问题&#xff01;&#x1f50d; 开闭原则&#xff08;OCP, Open/Closed Principle&#xff09;是软件设计的核心原则之一&#xff0c;下面我将从定义、意义、优劣分析、Python示例和结构图五个方面完整解析给你。 &#x1f9e0; 什么是开闭原则&#xff1f; 开闭原则&a…...

FHQ Treap

按值分裂 /* 按值x分裂Treap&#xff1a;将树u分裂为<x的树l和>x的树r */ void split(int u, int x, int& l, int& r) {if (!u) { l r 0; return; } // 空树直接返回if (t[u].val < x) { // 当前节点值<x&#xff0c;应放入左树l u; …...

题解传送门

做个算法分类&#xff0c;这样找特定算法的题目就方便多了23333 竞赛工具 【竞赛工具】——sublime text4 xcpc竞赛向配置教程 【竞赛工具】——vscode xcpc竞赛向配置教程 算法讲解 [算法学习]——通过RMQ与dfs序实现O(1)求LCA&#xff08;含封装板子&#xff09; [算法…...

ASP.NET MVC​ 入门与提高指南七

39. 量子安全通信与 MVC 应用保障 39.1 量子安全通信概念 量子安全通信基于量子力学原理&#xff0c;利用量子态的特性&#xff08;如量子纠缠、量子不可克隆定理&#xff09;来实现信息的安全传输。与传统加密方式相比&#xff0c;量子安全通信能够提供更高的安全性&#xf…...

Linux工作台文件操作命令全流程解析

全文目录 1 确认当前工作路径2 导航与目录管理2.1 关键命令2.2 逻辑衔接 3 文件基础操作3.1 创建 → 备份 → 重命名 → 清理3.2 文件查看和编辑3.3 文件链接3.4 文件diff 4 文件权限与所有权管理5 文件打包与归档6 参考文献 写在前面 shell是一种命令解释器&#xff0c;它提供…...

03 - spring security自定义登出页面

spring security自定义登出页面 文档 00 - spring security框架使用01 - spring security自定义登录页面02 - spring security基于配置文件及内存的账号密码 自定义登出页面 调整配置类WebSecurityConfig.java package xin.yangshuai.springsecurity03.config;import org.…...

unity webgl netbox2本地部署打开运行

unity webgl netbox2本地部署打开运行 复制NetBox2.exe和index.html 在同一级目录下使用&#xff0c;双击netbox2.exe。 下载文件 下载地址&#xff1a; netbox2.exe...

华为OD机试真题 Java 实现【水库蓄水问题】

前言 博主刷的华为机考题&#xff0c;代码仅供参考&#xff0c;因为没有后台数据&#xff0c;可能有没考虑到的情况 如果感觉对你有帮助&#xff0c;请点点关注点点赞吧&#xff0c;谢谢你&#xff01; 题目描述 思路 1. 其实就是找一个最大的水坑&#xff0c;两个…...

A2A 协议与 MCP 协议:智能代理生态系统的双轮驱动

本文将探讨A2A 协议与MCP 协议的特点、区别及协同作用&#xff0c;帮助开发者和产品设计师更好地理解这一新兴技术领域。 A2A 协议&#xff1a;打造代理间的沟通桥梁 A2A 协议的核心概念 A2A 协议是由 Google 与 50 多家行业合作伙伴共同开发的开放协议&#xff0c;旨在实现…...

使用AI-01开发板和开源后端服务搭建整套小智服务系统

使用AI-01开发板和开源后端服务搭建整套小智服务系统 四博智联的AI-01开发板&#xff0c;基于乐鑫ESP32-C2 专属定制的离线语音模组&#xff0c;能够完美的接入小智AI服务平台&#xff0c;再使用开源后端服务&#xff0c;就能够搭建一个完整的小智AI服务系统了。 下面是具体…...

第三章 权限维持-linux权限维持-隐藏

简介 ssh rootenv.xj.edisec.net -p 密码 xjqxwcyc 1.黑客隐藏的隐藏的文件 完整路径md5 2.黑客隐藏的文件反弹shell的ip端口 {ip:port} 3.黑客提权所用的命令 完整路径的md5 flag{md5} 4.黑客尝试注入恶意代码的工具完整路径md5 5.使用命令运行 ./x.xx 执行该文件 将查询的…...

Linux操作系统系统编程:x86-64架构下的系统调用

在Linux操作系统里&#xff0c;系统编程如同精密仪器的核心部件&#xff0c;掌控着系统运行的关键。而 x86-64 架构下的系统调用&#xff0c;更是连接用户空间程序与内核的关键桥梁。你可以把用户空间的程序想象成一个个 “工匠”&#xff0c;它们有着各式各样的需求&#xff0…...

linux下如何在一个录目中将一个文件复制到另一个录目,删除目录

一.文件复制到另一个目录 在Linux系统中&#xff0c;要将一个文件从一个目录复制到另一个目录&#xff0c;你可以使用cp命令。下面是一些基本的用法&#xff1a; 1. 使用绝对路径 如果你知道文件的绝对路径和目标目录的绝对路径&#xff0c;你可以直接使用cp命令。例如&…...

用Selenium开启自动化网页交互与数据抓取之旅

用Selenium开启自动化网页交互与数据抓取之旅 在当今数字化时代&#xff0c;数据的价值不言而喻&#xff0c;而网页作为海量数据的重要载体&#xff0c;如何高效获取其中的关键信息成为众多开发者和数据爱好者关注的焦点。Selenium这一强大工具&#xff0c;为我们打开了自动化…...

RabbitMQ的交换机

一、三种交换机模式 核心区别对比​​ ​​特性​​​​广播模式&#xff08;Fanout&#xff09;​​​​路由模式&#xff08;Direct&#xff09;​​​​主题模式&#xff08;Topic&#xff09;​​​​路由规则​​无条件复制到所有绑定队列精确匹配 Routing Key通配符匹配…...

多模态大语言模型arxiv论文略读(五十五)

MoMA: Multimodal LLM Adapter for Fast Personalized Image Generation ➡️ 论文标题&#xff1a;MoMA: Multimodal LLM Adapter for Fast Personalized Image Generation ➡️ 论文作者&#xff1a;Kunpeng Song, Yizhe Zhu, Bingchen Liu, Qing Yan, Ahmed Elgammal, Xiao…...

TMI投稿指南(四):投稿相关网址

TMI官网&#xff1a;https://ieeetmi.org/ 模版选择器&#xff1a;选择合适的latex模版 IEEE-Template Selector 评审过程状态查看&#xff1a;​​​​​​ScholarOne Manuscripts AE assigns reviewers&#xff1a;副编辑已经开始选择和邀请审稿人&#xff0c;但同意审稿…...

Oracle无法正常OPEN(三)

在Oracle数据库中&#xff0c;如果几个数据文件丢失&#xff0c;导致数据库无法启动&#xff0c;报错“ORA-01157: cannot identify/lock data file 2 - see DBWR trace file”&#xff0c;如果没有物理备份的情况下&#xff0c;位于丢失数据文件的数据是无法找回的&#xff0c…...

SQL语句练习 自学SQL网 在查询中使用表达式 统计

目录 Day 9 在查询中使用表达式 Day 10 在查询中进行统计 聚合函数 Day 11 在查询中进行统计 HAVING关键字 Day12 查询执行顺序 Day 9 在查询中使用表达式 SELECT id , Title , (International_salesDomestic_sales)/1000000 AS International_sales FROM moviesLEFT JOIN …...

当LLM遇上Agent:AI三大流派的“复仇者联盟”

你一定听说过ChatGPT和DeepSeek&#xff0c;也知道它们背后的LLM&#xff08;大语言模型&#xff09;有多牛——能写诗、写代码、甚至假装人类。但如果你以为这就是AI的极限&#xff0c;那你就too young too simple了&#xff01; 最近&#xff0c;**Agent&#xff08;智能体&a…...

模拟开发授权平台

这次只是实现应用的curd和公私钥的校验以及第三方的通知dmeo项目&#xff0c;大家可以拓开视野来编写 进入主题 项目链接&#xff1a;桌角的眼镜/develop_auth_platform 直接下拉并运行就行 回调应用代码在test包中 回调应用测试代码 package mainimport ("encoding/…...

python数据分析(八):Pandas 文本数据处理

Pandas 文本数据处理全面指南 1. 引言 在数据分析中&#xff0c;文本数据是常见的数据类型之一。Pandas 提供了强大的字符串处理方法&#xff0c;可以方便地对文本数据进行各种操作。本文将详细介绍 Pandas 中的文本处理功能&#xff0c;包括字符串连接(cat)、分割(split)、替…...

Spring AI:简化人工智能功能应用程序开发

Spring AI&#xff1a;简化人工智能功能应用程序开发 一、项目简介 Spring AI 项目致力于简化包含人工智能功能的应用程序的开发工作&#xff0c;并且不会引入不必要的复杂性。该项目从著名的 Python 项目&#xff08;如 LangChain 和 LlamaIndex&#xff09;中获取灵感&#…...

【算法基础】三指针排序算法 - JAVA

一、基础概念 1.1 什么是三指针排序 三指针排序是一种特殊的分区排序算法&#xff0c;通过使用三个指针同时操作数组&#xff0c;将元素按照特定规则进行分类和排序。这种算法在处理包含有限种类值的数组时表现出色&#xff0c;最经典的应用是荷兰国旗问题&#xff08;Dutch …...

从实列中学习linux shell9 如何确认 服务器反应迟钝是因为cpu还是 硬盘io 到底是那个程序引起的。cpu负载多高算高

在 Linux 系统中,Load Average(平均负载) 是衡量系统整体压力的关键指标,但它本身没有绝对的“高/低”阈值,需要结合 CPU 核心数 和 其他性能指标 综合分析。以下是具体判断方法: 一、Load Average 的基本含义 定义:Load Average 表示 单位时间内处于可运行状态(R)和不…...

[面试]SoC验证工程师面试常见问题(三)

SoC验证工程师面试常见问题(三) 在 SoC 验证工程师的面试中,面试官可能会要求候选人现场编写 SystemVerilog、UVM (Universal Verification Methodology) 或 SystemC 代码,以评估其编程能力、语言掌握程度以及解决实际验证问题的能力。这种随机抽题写代码的环节通常…...

架构进阶:深入学习企业总体架构规划(Oracle 战略专家培训课件)【附全文阅读】

本文主要讨论了企业总体技术架构规划的重要性与实施建议。针对Oracle战略专家培训课件中的内容&#xff0c;文章强调了行业面临的挑战及现状分析、总体技术架构探讨、SOA集成解决方案讨论与问题解答等方面。文章指出&#xff0c;为了消除信息孤岛、强化应用系统&#xff0c;需要…...

stm32教程:软件I2C通信协议 代码模板提供

早上好啊大伙&#xff0c;这一期也是stm32的基础教学&#xff0c;这一期说的是 —— I2C通信协议。 文章目录 一、I2C协议概述二、物理层特性硬件结构速率模式 三、协议层机制起始与停止信号数据帧结构应答机制时钟同步与仲裁 四、通信协议1. 起始信号&#xff08;START Condit…...

Java零基础入门Day4:数组与二维数组详解

一、为什么需要数组&#xff1f; 当程序需要处理批量同类型数据时&#xff0c;使用多个变量存储会非常繁琐。例如存储70个学生姓名时&#xff0c;需定义70个变量&#xff0c;而数组可以简化这一过程&#xff0c;提高代码可维护性。 示例&#xff1a;变量存储的弊端 String n…...

一条 SQL 查询语句是如何执行的(MySQL)

第一讲&#xff1a;一条 SQL 查询语句是如何执行的 总览图示 MySQL 查询的执行流程可以大致分为以下步骤&#xff08;如图所示&#xff09;&#xff1a; 连接器&#xff08;Connection&#xff09;查询缓存&#xff08;Query Cache&#xff0c;MySQL 8.0 已废弃&#xff09;…...

IntelliJ IDEA

文章目录 一、集成开发环境(IDE, Integrated Development Environment)二、IntelliJ IDEAIDEA 安装 三、IDEA 管理 Java 程序的结构四、IDEA 开发 HelloWorld 程序 一、集成开发环境(IDE, Integrated Development Environment) 把代码编写&#xff0c;编译&#xff0c;执行等多…...

详细说明StandardCopyOption.REPLACE_EXISTING参数的作用和使用方法

StandardCopyOption.REPLACE_EXISTING 是 Java java.nio.file.StandardCopyOption 枚举类中的一个常量&#xff0c;它主要用于在文件复制或移动操作中处理目标文件已存在的情况。下面详细介绍其作用和使用方法。 作用 在使用 java.nio.file.Files 类的 copy() 或 move() 方法时…...

Linux 下使用tcpdump进行网络分析原

简介 tcpdump 是一个命令行数据包分析器&#xff0c;可实时捕获和检查网络流量。它通常用于网络故障排除、性能分析和安全监控。 安装 Debian/Ubuntu sudo apt update && sudo apt install tcpdump -yCentOS/RHEL sudo yum install tcpdump -ymacOS brew install…...

人车交叉作业防撞系统介绍

一、技术原理与核心功能 UWB脉冲测距技术 系统基于UWB技术&#xff0c;通过纳秒级非正弦窄脉冲&#xff08;脉冲宽度0.21.5ns&#xff09;实现实时测距&#xff0c;精度可达1030厘米。 工作原理&#xff1a;人员佩戴防撞标签&#xff08;A&#xff09;与车载基站&#xff08;B&…...

移动端开发中设备、分辨率、浏览器兼容性问题

以下是针对移动端开发中设备、分辨率、浏览器兼容性问题的 系统化解决方案&#xff0c;按开发流程和技术维度拆解&#xff0c;形成可落地的执行步骤&#xff1a; 一、基础环境适配&#xff1a;从「起点」杜绝兼容性隐患 1. Viewport 元标签标准化 <meta name"viewpor…...

Git 基本操作(二)

目录 撤销修改操作 情况一 情况二 情况三 删除文件 升级git 撤销修改操作 在日常编码过程中&#xff0c;有些时候&#xff0c;我们可能写着写着发现目前的版本的代码越写越挫&#xff0c;越不符合标准&#xff0c;想让我们当前的文件去恢复到上一次提交的版本…...