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

MyBatis学习笔记(五) —— MyBatis获取参数值的两种方式

5、MyBatis获取参数值的两种方式

MyBatis获取参数值的两种方式:${} 和 #{}
${} 的本质就是字符串拼接, #{} 的本质就是占位符赋值
${} 使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;>但是#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自动添加>单引号

5.1、单个字面量类型的参数

若mapper接口中的方法参数为单个的字面量类型,

此时可以使用 ${} 和

#{} 以任意的名称获取参数的值,注意${} 需要手动加单引号

UserMapper.java

package com.fan.mybatis.mapper;import com.fan.mybatis.pojo.User;
/*** MyBatis获取参数值的两种方式:#{} 和 ${}* #{}的本质是占位符,${}的本质是字符串拼接* 1、若mapper接口方法的参数为单个的字面量类型* 此时可以通过#{} 和 ${}以任意的内容获取参数值,一定要注意${}的单引号问题
*/public interface UserMapper {/*** 根据用户名查询用户信息* @param username* @return*/User getUserByUsername(String username);
}

UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.fan.mybatis.mapper.UserMapper"><select id="getUserByUsername" resultType="User">select * from t_user where username = #{username}</select>
</mapper>

ParameterTest.java

package com.fan.mybatis;import com.fan.mybatis.mapper.UserMapper;
import com.fan.mybatis.pojo.User;
import com.fan.mybatis.utils.SqlSessionUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;public class ParameterTest {@Testpublic void testGetUserByUsername(){SqlSession sqlSession = SqlSessionUtils.getSqlSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);User user = mapper.getUserByUsername("admin");System.out.println(user);}
}

运行,控制台打印输出如下

DEBUG 02-24 17:35:24,407==> Preparing: select * from t_user where username = ? (BaseJdbcLogger.java:137)

DEBUG 02-24 17:35:24,426==> Parameters: admin(String) (BaseJdbcLogger.java:137)

DEBUG 02-24 17:35:24,442<== Total: 1 (BaseJdbcLogger.java:137)

User{id=1, username=‘admin’, password=‘123456’, age=23, gender=‘男’, email=‘12345@qq.com’}

可以看到映射文件中的 #{} 变为? ,#{} 被当做占位符。传过来的参数是admin,查询出来1条数据。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.fan.mybatis.mapper.UserMapper"><select id="getUserByUsername" resultType="User">select * from t_user where username = #{name}</select>
</mapper>

将#{usenrame}变为#{name} , 运行可以看到查询出来的结果。

在mybatis传递参数的过程,不知道传递的参数叫什么名字,只知道传递的值是 admin,所以传递参数值跟#{}里的参数名字没有关系。

建议#{}里的参数名字和传递的参数名一样。

${}测试

错误写法:${username}

<?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.fan.mybatis.mapper.UserMapper"><select id="getUserByUsername" resultType="User"><!--select * from t_user where username = #{username}-->select * from t_user where username = ${username}</select>
</mapper>

img

可以看到 admin是一个字符串,传入sql中没有加引号。不加单引号会被当做字段来解析,

Unknown column ‘admin’ in ‘where clause’

where字句中有一个不认识的列/字段 admin

#{}执行sql的时候,占用的是?; ${} 执行sql的时候,是直接拼接在sql中的。

正确写法:‘${usenrame}’

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.fan.mybatis.mapper.UserMapper"><select id="getUserByUsername" resultType="User"><!--select * from t_user where username = #{username}-->select * from t_user where username = '${username}'</select>
</mapper>

img

${}里不能写数值,纯数字是可以运算的。

5.2、多个字面量类型的参数

若mapper接口中的方法参数为多个时,

此时MyBatis会自动将这些参数放在一个map集合中,以arg0, arg1…为键,以参数为值;以param1, param2 … 为键,以参数为值;因此只需要通过${} 和

#{} 访问map集合的键就可以获取相应的值,注意${} 需要手动加单引号

UserMapper.java

package com.fan.mybatis.mapper;import com.fan.mybatis.pojo.User;/*** @Date: 2023/02/24* @Author: fan* @Description:* MyBatis获取参数值的两种方式:#{} 和 ${}* #{}的本质是占位符,${}的本质是字符串拼接* 1、若mapper接口方法的参数为单个的字面量类型* 此时可以通过#{} 和 ${}以任意的内容获取参数值,一定要注意${}的单引号问题* 2、若mapper接口的方法的参数为多个的字面量类型* 此时MyBatis会将参数放在map集合中,以两种方式存储数据* a> 以arg0,arg1,...为键,以参数为值* b> 以param1,param2,...为键,以参数为值* 因此,只需要通过#{}和${}访问map集合的键,就可以获取相对应的值,一定要注意${}的单引号问题*/
public interface UserMapper {/*** 验证登录* @param username* @param password* @return*/User checkLogin(String username,String password);
}

UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.fan.mybatis.mapper.UserMapper"><select id="checkLogin" resultType="User">select * from t_user where username = #{username} and password = #{password}</select>
</mapper>

ParameterTest.java

@Testpublic void testCheckLogin(){SqlSession sqlSession = SqlSessionUtils.getSqlSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);User user = mapper.checkLogin("admin","123456");System.out.println(user);
}

运行,控制台报错:

org.apache.ibatis.exceptions.PersistenceException:

### Error querying database. Cause: org.apache.ibatis.binding.BindingException: Parameter ‘username’ not found. Available parameters are [arg1, arg0, param1, param2]

### Cause: org.apache.ibatis.binding.BindingException: Parameter ‘username’ not found. Available parameters are [arg1, arg0, param1, param2]

img

可以看到sql语句没有输出,PersistenceException是配置文件解析错误,BindingException是绑定参数时出现的异常。

Parameter ‘username’ not found. 参数username没有找到。

Available parameters are [arg1, arg0, param1, param2] 可用的参数时arg1, arg0, param1, param2。可参照此方案进行修改。

正确的写法:

方式一

UserMapper.xml

<?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.fan.mybatis.mapper.UserMapper"><select id="checkLogin" resultType="User">select * from t_user where username = #{arg0} and password = #{arg1}</select>
</mapper>

运行可以正常输出信息,查询到用户信息。

img

方式二:

UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.fan.mybatis.mapper.UserMapper"><select id="checkLogin" resultType="User"><!--select * from t_user where username = #{arg0} and password = #{arg1}-->select * from t_user where username = #{param1} and password = #{param2}</select>
</mapper>

运行可以正常输出信息,查询到用户信息。

img

UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.fan.mybatis.mapper.UserMapper"><select id="checkLogin" resultType="User"><!--select * from t_user where username = #{arg0} and password = #{arg1}--><!--select * from t_user where username = #{param1} and password = #{param2}--><!--select * from t_user where username = '${arg0}' and password = '${arg0}'-->select * from t_user where username = '${param1}' and password = '${param2}'</select>
</mapper>

img

如果当前参数有两个时,mybatis会自动把这两个参数放在一个map集合中的。放在map集合中,会以两种方式来存储数据。

第一种方式:以arg0,arg1为键,以参数值为值

第二种方式:以parma1,param2为键,以参数值为值。

相当于从map集合中访问存储的数据。通过map中的键访问对应的值。

5.3、map集合类型的参数

若mapper解耦中的方法需要的参数为多个时,此时可以手动创建map集合,将这些数据放在map中

UserMapper接口

package com.fan.mybatis.mapper;import com.fan.mybatis.pojo.User;/*** 3、若mapper接口方法的参数为map集合类型的参数* 只需要通过#{}和${}访问map集合的键,就可以获取相对应的值,一定要注意${}的单引号问题*/
public interface UserMapper {/*** 添加用户信息* @param user*/void insertUser(User user);
}

ParameterTest.java

@Test
public void testCheckLoginByMap(){SqlSession sqlSession = SqlSessionUtils.getSqlSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);Map<String,Object> map = new HashMap<>();map.put("username","admin");map.put("password","123456");User user = mapper.checkLoginByMap(map);System.out.println(user);
}

UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.fan.mybatis.mapper.UserMapper"><select id="checkLoginByMap" resultType="User">select * from t_user where username = #{username} and password = #{password}</select>
</mapper>

运行测试类

img

5.4、实体类类型的参数

添加用户信息

UserMapper接口

package com.fan.mybatis.mapper;import com.fan.mybatis.pojo.User;/*** 4、若mapper接口方法的参数为实体类类型的参数* 只需要通过#{}和${}访问是实体类中的属性名,就可以获取相对应的属性值,一定要注意${}的单引号问题* 属性名只跟getXxx和setXXX的方法名有关系,把set和get去掉,剩余的字母首字母小写,就是当前的属性名*/
public interface UserMapper {/*** 添加用户信息* @param user*/void insertUser(User user);
}

ParameterTest.java

@Test
public void testInsertUser(){SqlSession sqlSession = SqlSessionUtils.getSqlSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);User user = new User(null,"root","123456",33,"女","123@qq.com");mapper.insertUser(user);
}

运行测试

img

img

5.5、使用@Param注解标识参数

可以通过@Param注解标识mapper接口中的方法参数,

此时,会将这些参数放在map集合中,以@Param注解的value属性值为键,以参数为值;以param1,param2…为键,以参数为值;只需要通过$

${}需要手动加单引号。

User checkLoginByParam(@Param("username") String username, @Param("password") String password);

加上@Param(“username”)后,mybatis仍然会将两个参数放进map中,放进map中的键就是@Param括号中的username和password

UserMapper接口

package com.fan.mybatis.mapper;import com.fan.mybatis.pojo.User;
import org.apache.ibatis.annotations.Param;/*** 5、可以在mapper接口方法的参数上设置@Param注解* 此时MyBatis会将这些参数放在map中,以两种方式进行存储* a> 以@Param注解的value属性值为键,以参数为值* b> 以param1,param2...为键,以参数为值* 只需要通过#{}和${}访问map集合的键,就可以获取相对应的值,一定要注意${}的单引号问题。*/
public interface UserMapper {/*** 验证登录(使用@Param)* @param username* @param password* @return*/User checkLoginByParam(@Param("username") String username, @Param("password") String password);
}

UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.fan.mybatis.mapper.UserMapper"><!-- User checkLoginByParam(@Param("username") String username, @Param("password") String password); --><select id="checkLoginByParam" resultType="User">select * from t_user where username = #{username} and password = #{password}</select></mapper>

ParameterTest.java

@Test
public void testCheckLoginByParam(){SqlSession sqlSession = SqlSessionUtils.getSqlSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);User user = mapper.checkLoginByParam("admin","123456");System.out.println(user);
}

运行

img

相关文章:

MyBatis学习笔记(五) —— MyBatis获取参数值的两种方式

5、MyBatis获取参数值的两种方式 MyBatis获取参数值的两种方式&#xff1a;${} 和 #{} ${} 的本质就是字符串拼接&#xff0c; #{} 的本质就是占位符赋值 ${} 使用字符串拼接的方式拼接sql&#xff0c;若为字符串类型或日期类型的字段进行赋值时&#xff0c;需要手动加单引号&a…...

go module构建项目

在go 1.11版本中引入了Go Module内置的包管理模块&#xff0c;是GOPATH的替代品&#xff0c;集成了版本控制和软件包分发支持的功能。即go使用modules管理依赖&#xff0c;项目依赖构建时不需要再依赖GOPATH环境变量。 要使用go module首先要激活modules .升级go到1.11版本 .这…...

已经准备上千道软件测试面试题了,建议大家收藏!!!还有视频详解!

2023华为软件测试笔试面试真题&#xff0c;抓紧收藏不然就看不到了_测试小鬼的博客-CSDN博客_华为软件测试工程师面试题1、对计算机软件和硬件资源进行管理和控制的软件是&#xff08;D&#xff09;A.文件管理程序B.输入输出管理程序C.命令出来程序D.操作系统2、在没有需求文档…...

C++设计模式(19)——访问者模式

亦称&#xff1a; Visitor 意图 访问者模式是一种行为设计模式&#xff0c; 它能将算法与其所作用的对象隔离开来。 问题 假如你的团队开发了一款能够使用巨型图像中地理信息的应用程序。 图像中的每个节点既能代表复杂实体 &#xff08;例如一座城市&#xff09;&#xf…...

ChatGPT 的工作原理:机器人背后的模型

这篇对支持 ChatGPT 的机器学习模型的温和介绍&#xff0c;将从大型语言模型的介绍开始&#xff0c;深入探讨使 GPT-3 得到训练的革命性自我注意机制&#xff0c;然后深入研究人类反馈的强化学习&#xff0c;使 ChatGPT 与众不同的新技术。 大型语言模型 ChatGPT 是一类被称…...

FreeRTOS入门(04):中断、内存、追踪与调试

文章目录目的中断内存堆&#xff08;heap&#xff09;栈&#xff08;stack&#xff09;断言调试总结目的 有了前面的几篇文章 FreeRTOS 基本上已经可以在项目中使用上了&#xff1a; 《FreeRTOS入门&#xff08;01&#xff09;&#xff1a;基础说明与使用演示》 《FreeRTOS入门…...

【C语言】带你彻底理解指针(1)

✨✨✨✨如果文章对你有帮助记得点赞收藏关注哦&#xff01;&#xff01;✨✨✨✨ 文章目录指针的介绍&#xff1a;一、简单指针&#x1f308;1.1 指针的定义与使用1.2 指针与数组二、指针数组✨三、数组指针&#x1f31e;3.1 数组指针的定义3.2 ”数组名“与”&数组名“3.…...

C/C++ 中 JSON 库的使用 (CJSON/nlohmann)

C/C 中 JSON 库的使用 &#xff08;CJSON/nlohmann&#xff09;概述cjson基本操作从(字符指针)缓冲区中解析出JSON结构转成成JS字符串(将传入的JSON结构转化为字符串)将JSON结构所占用的数据空间释放JSON 值的创建创建一个值类型的数据创建一个对象&#xff08;文档&#xff09…...

【Opencv项目实战】目标检测:自动检测出现的所有动态目标

文章目录一、项目思路二、算法详解2.1、计算两个数组或数组与标量之间的每个元素的绝对差。2.2、轮廓检测 绘制物体轮廓 绘制矩阵轮廓2.3、连续窗口显示2.4、读取视频&#xff0c;显示视频&#xff0c;保存视频三、项目实战&#xff1a;实时动态目标检测实时动态目标检测一、…...

活动报名:Tapdata Cloud V3 最新功能全解与核心应用场景演示

作为中国的 “Fivetran/Airbyte”, Tapdata Cloud 自初版公测以来&#xff0c;已累积10,000 注册用户。核心场景包括 Any Source → Any Target 的实时数据库同步、数据入湖入仓&#xff0c;以及通用 ETL 处理等。近期&#xff0c;功能特性全面优化的 Tapdata Cloud V3 也已开放…...

人工智能AI威武,爱也……恨也……

人工智能AI威武&#xff0c;爱也&#xff01;恨也&#xff01;&#xff01;它会创作会代码&#xff0c;从它那儿能仿到更好的思维&#xff1b;多它那里可以学到更好的代码。它聪慧全能&#xff0c;成为一坨人偷懒神器&#xff1b;变成“智者”作弊的“倚天屠龙”&#xff01;&a…...

SpringBoot-基础篇

SpringBoot基础篇 ​ 在基础篇中&#xff0c;我给学习者的定位是先上手&#xff0c;能够使用SpringBoot搭建基于SpringBoot的web项目开发&#xff0c;所以内容设置较少&#xff0c;主要包含如下内容&#xff1a; SpringBoot快速入门SpringBoot基础配置基于SpringBoot整合SSMP…...

Tapdata Connector 实用指南:实时数仓场景之数据实时同步至 ClickHouse

【前言】作为中国的 “Fivetran/Airbyte”, Tapdata 是一个以低延迟数据移动为核心优势构建的现代数据平台&#xff0c;内置 60 数据连接器&#xff0c;拥有稳定的实时采集和传输能力、秒级响应的数据实时计算能力、稳定易用的数据实时服务能力&#xff0c;以及低代码可视化操作…...

刷题专练之数组移除元素

文章目录前言一、移除元素1.题目介绍2.思路&#xff1a;3.代码二、移动零1.题目介绍2.思路3.代码三、删除有序数组中的重复项1.题目介绍2.思想3.代码四、80. 删除有序数组中的重复项 II1.题目介绍2.思路3.代码4.推荐题解前言 我每个刷题篇的题目顺序都是特别安排的&#xff0c;…...

常见激活函数Activation Function的选择

Activation Function激活函数一般会神经网络中隐层和输出层上&#xff0c;其中作用在输出层主要用于适配输出&#xff0c;比如sigmoid函数可用于生成[0,1]之间的概率估计值。而作用于隐层主要用于增加神经网络的非线性&#xff0c;增加了网络的表达能力&#xff0c;本文主要介绍…...

大厂跟进ChatGPT,为什么百度“文心一言”成色最好?【快评】

作者 | 曾响铃 文 | 响铃说 赶ChatGPT热度&#xff0c;百度3月初就要发布与ChatGPT类似的人工智能聊天机器人服务“文心一言”&#xff08;英文名&#xff1a;ERNIE Bot&#xff09;&#xff0c;似乎无法提振资本市场对百度的信心。 2022年第四季度及全年未经审计的财报发布…...

ChatGPT和Web3:人工智能如何帮助您建立和发展您的 Web3 公司

ChatGPT是OpenAI在2022年11月推出的聊天机器人。该机器人建立在OpenAI的GPT-3人工智能家族上&#xff0c;并通过监督学习和强化学习技术进行了优化。 与ChatGPT机器人聊天时&#xff0c;你会感觉自己在与一个懂得一切并以非常教育性的方式回答的朋友交谈。回答在许多知识领域非…...

【人工智能 AI】怎样实施RPA 机器人流程自动化(Robotic Process Automation)?核心技术有哪些?

文章目录 RPA 简介RPA的实施RPA的核心技术1. 自动化测试(1)自动化测试工具(2)自动化测试框架2. 自动化脚本(1)自动化脚本语言(2)自动化脚本框架3. 机器学习(1)机器学习模型(2)机器学习框架(3)自然语言处理(4)图像处理(5)深度学习(6)机器人操作系统RPA核心能…...

基于BP神经网络的性别识别,BP神经网络详细原理,自编码神经网络代码,神经网络案例之18

目标 背影 BP神经网络的原理 BP神经网络的定义 BP神经网络的基本结构 BP神经网络的神经元 BP神经网络的激活函数&#xff0c; BP神经网络的传递函数 数据 神经网络参数 基于BP神经网络 性别识别的MATLAB代码 效果图 结果分析 展望 背影 男人体内蛋白质比例大&#xff0c;女生…...

2023年消费电子行业研究报告

第一章 行业概况 消费电子行业是电子信息行业的子行业。消费电子是指围绕着消费者应用而设计的与生活、工作和娱乐息息相关的电子类产品&#xff0c;通常会应用于娱乐、通讯以及文书用途&#xff0c;最终实现消费者自由选择资讯、享受娱乐的目的&#xff0c;主要侧重于个人购买…...

使用Python轻松管理Word页脚

在日常的办公自动化中&#xff0c;处理Word文档是许多人绕不开的环节。无论是生成报告、合同&#xff0c;还是制作项目文档&#xff0c;Word都是一个不可或缺的工具。然而&#xff0c;当文档数量庞大&#xff0c;或者需要频繁更新时&#xff0c;那些看似简单的重复性任务&#…...

3步解锁魔兽争霸III最佳体验:WarcraftHelper全方位优化工具指南

3步解锁魔兽争霸III最佳体验&#xff1a;WarcraftHelper全方位优化工具指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper WarcraftHelper是一款专为…...

Phi-4-mini-reasoning开源大模型教程:免配置镜像+128K长文本推理实战

Phi-4-mini-reasoning开源大模型教程&#xff1a;免配置镜像128K长文本推理实战 1. 模型简介 Phi-4-mini-reasoning是一个轻量级开源大语言模型&#xff0c;专注于高质量推理任务。作为Phi-4模型家族成员&#xff0c;它具备以下核心特点&#xff1a; 推理能力突出&#xff1…...

智能车调参手记:我用Kp=200, Ki=60, Kd=40让小车稳如老狗

智能车调参手记&#xff1a;我用Kp200, Ki60, Kd40让小车稳如老狗 凌晨三点的实验室里&#xff0c;咖啡杯已经见底&#xff0c;眼前的智能车在测试跑道上又一次冲出了弯道。这已经是本周第七次熬夜调试&#xff0c;上坡时的速度波动问题始终困扰着我们。就在准备放弃的时候&…...

Deepin系统远程桌面实战:从零配置xrdp服务到Windows无缝连接

Deepin系统远程桌面实战&#xff1a;从零配置xrdp服务到Windows无缝连接 在跨平台协作成为常态的今天&#xff0c;远程桌面技术让不同操作系统间的无缝协作成为可能。对于使用Deepin系统的用户而言&#xff0c;如何高效地通过Windows设备远程访问和控制Deepin桌面&#xff0c;是…...

SpringBoot+Redis实现高并发短信登录:双拦截器设计背后的架构思考

SpringBootRedis高并发短信登录架构深度解析&#xff1a;双拦截器设计与性能优化实战 1. 高并发场景下的登录架构挑战 在当今互联网应用中&#xff0c;短信验证码登录已成为主流的身份验证方式之一。但当系统面临高并发请求时&#xff0c;传统的Session-based方案会暴露出诸多瓶…...

企微API集成指南——从回调到主动发送,全流程代码解析

企业微信提供了丰富的API&#xff0c;用于接收用户添加事件、发送消息、管理标签等。今天从实战角度&#xff0c;给出API集成的最佳实践&#xff0c;附带伪代码。一、核心API清单API用途频率限制获取access_token调用其他API的前提2000次/分钟添加外部联系人通过好友每个号300人…...

【C语言】memmove()函数实战:如何安全高效地处理内存重叠拷贝

1. 为什么需要memmove()函数&#xff1f; 在C语言中处理内存拷贝时&#xff0c;我们经常会遇到一个棘手的问题&#xff1a;当源内存块和目标内存块存在重叠区域时&#xff0c;使用memcpy()函数可能会导致数据被意外覆盖。想象一下你在整理书架&#xff0c;想把第三层到第五层的…...

保姆级教程:在Ubuntu 22.04上从Anaconda到PyTorch,一步步搞定GPU环境(含CUDA 11.7避坑指南)

保姆级教程&#xff1a;在Ubuntu 22.04上从Anaconda到PyTorch&#xff0c;一步步搞定GPU环境&#xff08;含CUDA 11.7避坑指南&#xff09; 刚接触深度学习的开发者们&#xff0c;最头疼的往往不是模型设计本身&#xff0c;而是环境搭建这个"拦路虎"。本文将手把手带…...

避开这5个坑,你的YOLO模型训练效率翻倍:从yaml配置到GPU显存优化实战

YOLO模型训练效率翻倍的5个关键避坑指南&#xff1a;从参数调优到显存管理实战 当你第一次用YOLOv10或v11跑通训练流程时&#xff0c;可能会觉得"不过如此"。但真正投入实战后&#xff0c;90%的开发者都会遇到显存爆炸、训练龟速、指标波动三大噩梦。上周有位使用RTX…...