Mybatis案例-商品的增删改查
文章目录
- 1. aim
- 2.环境准备
- 3.查询
- 3.1 查所有
- 3.2 查看详情
- 3.3 条件查询
- 3.3.1 Mybatics如何接收参数?
- 3.3.2 多条件查询
- 3.3.3 动态条件查询
- 3.3.4 单条件查询
- 4.添加
- 主键返回
- 5.修改
- 5.1 修改全部字段
- 5.2 修改动态字段
- 6.删除
- 6.1 删除1个
- 6.2 批量删除
JDBC完成: https://blog.csdn.net/meini32/article/details/131981238
1. aim
要完成的功能列表清单:
1. 查询
- 查询所有数据
- 查看详情
- 条件查询
2. 添加
3. 修改
- 修改全部字段
- 修改动态字段
4. 删除
- 删除一个
- 批量删除
2.环境准备
- 数据库表tb_brand
- 实体类Brand
- 测试用例
- 安装MyBatis×插件
数据库表:
-- 删除tb_brand表
drop table if exists tb_brand;
-- 创建tb_brand表
create table tb_brand
(-- id 主键id int primary key auto_increment,-- 品牌名称brand_name varchar(20),-- 企业名称company_name varchar(20),-- 排序字段ordered int,-- 描述信息description varchar(100),-- 状态:0:禁用 1:启用status int
);
-- 添加数据
insert into tb_brand (brand_name, company_name, ordered, description, status)
values ('三只松鼠', '三只松鼠股份有限公司', 5, '好吃不上火', 0),('华为', '华为技术有限公司', 100, '华为致力于把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界', 1),('小米', '小米科技有限公司', 50, 'are you ok', 1);SELECT * FROM tb_brand;
实体Brand类
package com.itheima.pojo;public class Brand {// id 主键private Integer id;// 品牌名称private String brandName;// 企业名称private String companyName;// 排序字段private Integer ordered;// 描述信息private String description;// 状态:0:禁用 1:启用private Integer status;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getBrandName() {return brandName;}public void setBrandName(String brandName) {this.brandName = brandName;}public String getCompanyName() {return companyName;}public void setCompanyName(String companyName) {this.companyName = companyName;}public Integer getOrdered() {return ordered;}public void setOrdered(Integer ordered) {this.ordered = ordered;}public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}public Integer getStatus() {return status;}public void setStatus(Integer status) {this.status = status;}@Overridepublic String toString() {return "Brand{" +"id=" + id +", brandName='" + brandName + '\'' +", companyName='" + companyName + '\'' +", ordered=" + ordered +", description='" + description + '\'' +", status=" + status +'}';}
}
测试用例
MybatisX插件
功能
- XML和接口方法互相跳转
- 根据接口方法生成statement
3.查询
步骤
- 编写接口:Mapper接口
- 编写sql语句:sql映射文件
- 执行方法,测试
3.1 查所有
注意:数据库表的字段名称和―实体类的属性名称不一样,则不能自动封装数据
方法1:起别名
方法2:映射
1.定义标签
2.在标签中,使用resultMap属性替换resultType属性
3.2 查看详情
查看某一条数据的详情信息
1.编写mapper接口
2.定义接受参数
3. 编写sql语句
<select id="selectById" resultMap="brandResultMap">select * from tb_brand where id = #{id};</select>
4.执行sql
参数占位符
1.#{}:会将其替换为 ?,为了防止SQL注入 2.${}:拼sql。会存在SQL注入问题
3.3 条件查询
3.3.1 Mybatics如何接收参数?
1.单个参数
可以直接将参数作为方法的参数进行传递。在 SQL 语句中可以通过 #{paramName} 的形式引用该参数。
// Java 代码
public interface UserMapper {User getUserById(int id);
}<!-- Mapper XML -->
<select id="getUserById" resultType="User">SELECT * FROM user WHERE id = #{id}
</select>
2.使用 @Param 注解来指定参数的名称:
可以使用 @Param 注解来指定参数的名称,然后在 SQL 语句中通过该名称引用参数。
// Java 代码
public interface UserMapper {User getUserByIdAndName(@Param("id") int id, @Param("name") String name);
}<!-- Mapper XML -->
<select id="getUserByIdAndName" resultType="User">SELECT * FROM user WHERE id = #{id} AND name = #{name}
</select>
3.使用 Map 传递参数:
可以使用 Map 类型的参数传递多个参数。在 SQL 语句中通过键来引用对应的值:
// Java 代码
public interface UserMapper {User getUserByMap(Map<String, Object> params);
}<!-- Mapper XML -->
<select id="getUserByMap" resultType="User">SELECT * FROM user WHERE id = #{id} AND name = #{name}
</select>
4.使用对象传递参数:
可以使用自定义的对象作为参数,MyBatis 会自动将对象的属性与 SQL 语句中的参数进行映射。例如:
// Java 代码
public class UserQuery {private int id;private String name;// 省略 getter 和 setter 方法
}public interface UserMapper {User getUserByQuery(UserQuery query);
}<!-- Mapper XML -->
<select id="getUserByQuery" resultType="User">SELECT * FROM user WHERE id = #{id} AND name = #{name}
</select>
3.3.2 多条件查询
步骤
- 编写多条件查询的接口(mapper);
- 添加到映射文件里
- 编写sql语句
- 执行,测试
1.定义接口
public interface BrandMapper {List<Brand> selectAll();Brand selectById(int id); //通过id查看商品详情//使用 @Param 注解来指定参数的名称List<Brand> selectByMutiCondition(@Param("status")int status,@Param("companyName")String companyName,@Param("brandName")String brandName);//使用对象来指定参数List<Brand> selectByMutiCondition(Brand brand); //使用map来指定参数List<Brand> selectByMutiCondition(HashMap map);}
2.添加到映射文件里
<!--
namespace:名称空间
--><mapper namespace="com.itheima.mapper.BrandMapper"><resultMap id="brandResultMap" type="brand"><result column="brand_name" property="brandName"/><result column="company_name" property="companyName"/></resultMap><!-- 多条件查询--><select id="selectByMutiCondition" resultMap="brandResultMap">SELECT * FROM tb_brandWHERE status = #{status} AND company_name LIKE #{companyName} AND brand_name LIKE #{brandName};</select></mapper>
3.执行,测试
//多条件查询-使用参数查询
public class MyBatisTest3 {public static void main(String[] args) throws IOException {int s = 0;String cn = "三只松鼠股份有限公司";String bn = "三只松鼠";//1.加载核心文件,获取SqlSessionFactoryInputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//2.获取对应的SqlSession对象,用来执行ssqlSqlSession sqlSession = sqlSessionFactory.openSession();//3.执行sqlBrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);List<Brand> brand = brandMapper.selectByMutiCondition(s,cn,bn);System.out.println(brand);//4.释放资源sqlSession.close();}
}
//多条件查询-使用对象
public class MyBatisTest3 {public static void main(String[] args) throws IOException {int s = 0;String cn = "三只松鼠股份有限公司";String bn = "三只松鼠";Brand brand1 = new Brand();brand1.setStatus(s);brand1.setBrandName(bn);brand1.setCompanyName(cn);//1.加载核心文件,获取SqlSessionFactoryInputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//2.获取对应的SqlSession对象,用来执行ssqlSqlSession sqlSession = sqlSessionFactory.openSession();//3.执行sqlBrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);List<Brand> brand = brandMapper.selectByMutiCondition(brand1);System.out.println(brand);//4.释放资源sqlSession.close();}
}
//多条件查询-使用Map
public class MyBatisTest3 {public static void main(String[] args) throws IOException {int s = 0;String cn = "三只松鼠股份有限公司";String bn = "三只松鼠";HashMap map = new HashMap();map.put("status",s);map.put("companyName",cn);map.put("brandName",bn);//1.加载核心文件,获取SqlSessionFactoryInputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//2.获取对应的SqlSession对象,用来执行ssqlSqlSession sqlSession = sqlSessionFactory.openSession();//3.执行sqlBrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);List<Brand> brand = brandMapper.selectByMutiCondition(map);System.out.println(brand);//4.释放资源sqlSession.close();}
}
结果:
3.3.3 动态条件查询
动态条件查询是指根据不同的条件组合,构建动态的 SQL 查询语句。
方法
- 使用 <if 元素
- 使用 <choose, <when, <otherwise 元素:
- 使用 <trim, <where, <set元素
使用if
<select id="getUserByCondition" resultType="User">SELECT * FROM userWHERE 1=1<if test="id != null">AND id = #{id}</if><if test="name != null">AND name = #{name}</if>
</select>
使用 choose, when, otherwise 元素
<select id="getUserByCondition" resultType="User">SELECT * FROM userWHERE 1=1<choose><when test="id != null">AND id = #{id}</when><when test="name != null">AND name = #{name}</when><otherwise>AND status = 'ACTIVE'</otherwise></choose>
</select>
使用 trim, where, set元素
<update id="updateUser" parameterType="User">UPDATE user<set><if test="name != null">name = #{name},</if><if test="age != null">age = #{age},</if></set>WHERE id = #{id}
</update>
1.编写接口
List<Brand> selectByMutiConditionActivate(Brand brand);
2.编写动态查询映射文件
<!-- 动态查询--><select id="selectByMutiConditionActivate" resultMap="brandResultMap">SELECT * FROM tb_brandWHERE 1=1<if test="status != null">AND status = #{status}</if><if test="companyName != null and companyName!='' ">AND company_name LIKE #{companyName} </if><if test="brandName != null and brandName!='' ">AND brand_name LIKE #{brandName} </if></select>
3.测试
import com.itheima.mapper.BrandMapper;
import com.itheima.pojo.Brand;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;public class MyBatisTest4 {public static void main(String[] args) throws IOException {
// int s = 1;String cn = "三只松鼠股份有限公司";
// String bn = "三只松鼠";Brand brand1 = new Brand();
// brand1.setStatus(s);
// brand1.setBrandName(bn);brand1.setCompanyName(cn);//1.加载核心文件,获取SqlSessionFactoryInputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//2.获取对应的SqlSession对象,用来执行ssqlSqlSession sqlSession = sqlSessionFactory.openSession();//3.执行sqlBrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);List<Brand> brand = brandMapper.selectByMutiConditionActivate(brand1);System.out.println(brand);//4.释放资源sqlSession.close();}
}
4.结果
3.3.4 单条件查询
MyBatis 单条件动态查询是指根据单个条件的存在与否,动态地构建 SQL
查询语句。根据不同的条件值,选择是否添加该条件到查询语句中,从而实现根据单个条件进行灵活查询的功能。
使用 <choose,《when> 和 《otherwise> 元素可以实现条件选择逻辑,根据不同的条件选择其中一个分支进行处理
<select id="getUserByCondition" resultType="User">SELECT * FROM userWHERE 1=1<choose><when test="name != null">AND name = #{name}</when><when test="age != null">AND age = #{age}</when><otherwise>AND 1=1</otherwise></choose>
</select>
4.添加
步骤
- 编写接口方法
- 编写sql语句,添加映射文件
- 执行方法,测试
MyBatis事务:
- openSession(): 默认开启事务,进行增删改操作后需要使用 sqlSession.commit();
- 手动提交事务openSession(true): 可以设置为自动提交事务 (关闭事务)
1.编写接口
public interface BrandMapper {//添加void addBrand(Brand brand);
}
2.编辑映射文件
<!--
namespace:名称空间
--><mapper namespace="com.itheima.mapper.BrandMapper"><resultMap id="brandResultMap" type="brand"><result column="brand_name" property="brandName"/><result column="company_name" property="companyName"/></resultMap><insert id="addBrand">insert into tb_brand (brand_name, company_name, ordered,description, status)values (#{brandName},#{companyName},#{ordered},#{description},#{status});</insert></mapper>
3.测试 结果
//添加
public class MybatisTest5 {public static void main(String[] args) throws IOException {String bn = "百度";String cn = "百度公司";int od = 18;String ds = "百度一下你就知道";int st =0;Brand brand = new Brand();brand.setBrandName(bn);brand.setStatus(st);brand.setCompanyName(cn);brand.setDescription(ds);brand.setOrdered(od);//1.加载核心文件,获取SqlSessionFactoryInputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//2.获取对应的SqlSession对象,用来执行ssqlSqlSession sqlSession = sqlSessionFactory.openSession();//3.执行sqlBrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);brandMapper.addBrand(brand);//4.提交事务sqlSession.commit();//5.关闭sqlSession.close();}
}
主键返回
是什么?
在数据添加成功后,需要获取插入数据库数据的主键的值
比如: 添加订单和订单项
1.添加订单
2.添加订单项,订单项中需要设置所属订单的id
原因:执行完id没有绑定到对象上
解决:MyBatis 框架,可以使用 useGeneratedKeys 和 keyProperty
属性来自动获取生成的主键值,并将其设置到相应的属性上。
<insert id="addBrand" useGeneratedKeys="true" keyProperty="id">insert into tb_brand (brand_name, company_name, ordered,description, status)values (#{brandName},#{companyName},#{ordered},#{description},#{status});</insert>
5.修改
sql语句
UPDATE 表名 SET 列名1=值1,列名2=值2,... [ WHERE 条件];
mybatis标签
<update id="updateOrder" parameterType="Order">UPDATE ordersSET order_number = #{orderNumber}, order_date = #{orderDate}WHERE id = #{id}
</update>
5.1 修改全部字段
public interface BrandMapper {//修改void updateBrand(Brand brand);
}
<update id="updateBrand">update tb_brandset brand_name=#{brandName},company_name=#{companyName},ordered=#{ordered},description=#{description},status=#{status}where id = #{id};</update>
//返回修改全部字段
public class MybatisTest7 {public static void main(String[] args) throws IOException {String bn = "快手";String cn = "fasthand公司";int od = 666;String ds = "老铁加油哇";int st =1;int id = 7;Brand brand = new Brand();brand.setId(id);brand.setBrandName(bn);brand.setStatus(st);brand.setCompanyName(cn);brand.setDescription(ds);brand.setOrdered(od);//1.加载核心文件,获取SqlSessionFactoryInputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//2.获取对应的SqlSession对象,用来执行ssqlSqlSession sqlSession = sqlSessionFactory.openSession();//3.执行sqlBrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);brandMapper.updateBrand(brand);//4.提交事务sqlSession.commit();//5.关闭sqlSession.close();}
}
5.2 修改动态字段
在 MyBatis 中,你可以使用 元素来实现动态修改字段。 元素根据条件的成立与否,决定是否包含某字段的修改语句片段。
void updateBrandActivate(Brand brand);
<update id="updateBrandActivate">update tb_brand<set><if test="brandName != null and brandName!='' ">brand_name=#{brandName}</if><if test="companyName != null and companyName!='' ">company_name=#{companyName}</if><if test="ordered != null and ordered!='' ">ordered=#{ordered}</if><if test="description != null and description!='' ">description=#{description}</if><if test="status != null and status!='' ">status=#{status}</if></set>where id = #{id};</update>
//返回动态修改字段
public class MybatisTest8 {public static void main(String[] args) throws IOException {String bn = "快手";String cn = "fasthand公司";int od = 666;String ds = "先穿裤子在穿鞋,先当孙子再当爷,记住这句话!";int st =0;int id = 7;Brand brand = new Brand();brand.setId(id);
// brand.setBrandName(bn);brand.setStatus(st);
// brand.setCompanyName(cn);brand.setDescription(ds);
// brand.setOrdered(od);//1.加载核心文件,获取SqlSessionFactoryInputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//2.获取对应的SqlSession对象,用来执行ssqlSqlSession sqlSession = sqlSessionFactory.openSession();//3.执行sqlBrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);brandMapper.updateBrandActivate(brand);//4.提交事务sqlSession.commit();//5.关闭sqlSession.close();}
}
6.删除
sql语句
DELETE FROM 表名 [WHERE 条件] ;
6.1 删除1个
void deleteOne(int id);
<delete id="deleteOne">delete from tb_brand where id = #{id};</delete>
//删除1public class MybatisTest9 {public static void main(String[] args) throws IOException {int id = 6;//1.加载核心文件,获取SqlSessionFactoryInputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//2.获取对应的SqlSession对象,用来执行ssqlSqlSession sqlSession = sqlSessionFactory.openSession();//3.执行sqlBrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);brandMapper.deleteOne(id);//4.提交事务sqlSession.commit();//5.关闭sqlSession.close();}
}
6.2 批量删除
void deleteMuti(@Param("ids")int[] ids);
<delete id="deleteMuti">delete from tb_brandwhere idin(<foreach collection="ids" item="id" separator=",">#{id}</foreach>);</delete>
//删除1public class MybatisTest9 {public static void main(String[] args) throws IOException {int[] ids = {1,5,7};//1.加载核心文件,获取SqlSessionFactoryInputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//2.获取对应的SqlSession对象,用来执行ssqlSqlSession sqlSession = sqlSessionFactory.openSession();//3.执行sqlBrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);brandMapper.deleteMuti(ids);//4.提交事务sqlSession.commit();//5.关闭sqlSession.close();}
}
相关文章:

Mybatis案例-商品的增删改查
文章目录 1. aim2.环境准备3.查询3.1 查所有3.2 查看详情3.3 条件查询3.3.1 Mybatics如何接收参数?3.3.2 多条件查询3.3.3 动态条件查询3.3.4 单条件查询 4.添加主键返回 5.修改5.1 修改全部字段5.2 修改动态字段 6.删除6.1 删除1个6.2 批量删除 JDBC完成࿱…...
图像识别模型与训练策略
图像预处理 1.需要将图像Resize到相同大小输入到卷积网络中 2.翻转、裁剪、色彩偏移等操作 3.转化为Tensor数据格式 4.对RGB三种颜色通道进行标准化 data_transforms {train: transforms.Compose([transforms.Resize([96, 96]),transforms.RandomRotation(45),#随机旋转&…...
算法工程师-机器学习面试题总结(3)
FM模型 FM模型与逻辑回归相比有什么优缺点? FM(因子分解机)模型和逻辑回归是两种常见的预测建模方法,它们在一些方面有不同的优缺点。 FM模型的优点: 1. 能够捕获特征之间的交互作用:FM模型通过对特征向量…...
ROS2学习(五)进程内topic高效通信
对ROS2有一定了解后,我们会发现ROS2中节点和ROS1中节点的概率有很大的区别。在ROS1中节点是最小的进程单元。在ROS2中节点与进程和线程的概念完全区分开了。具体区别可以参考 ROS2学习(四)进程,线程与节点的关系。 在ROS2中同一个进程中可能存在多个节点…...
算法-最大数
给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。 注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。 输入:nums [10,2] 输出:"210&…...
Spark中使用RDD算子GroupBy做词频统计的方法
测试文件及环境 测试文件在本地D://tmp/spark.txt,Spark采用Local模式运行,Spark版本3.2.0,Scala版本2.12,集成idea开发环境。 hello world java world java java实验代码 import org.apache.spark.rdd.RDD import org.apache.…...

如何使用Kafka构建事件驱动的架构
事件驱动的架构(EDA)是一种软件设计模式,它关注事件的生成、检测和使用,以支持高效和可扩展的系统。在EDA中,事件是组件之间通信的主要手段,允许它们实时交互和响应更改。这种架构促进了松散耦合、可扩展性和响应性,使…...
ES6 解构赋值
解构赋值 解构赋值是一种在编程中常见且方便的语法特性,它可以让你从数组或对象中快速提取数据,并将数据赋值给变量。在许多编程语言中都有类似的特性。 在 JavaScript 中,解构赋值使得从数组或对象中提取数据变得简单。它可以用于数组和对…...

HTML5注册页面
分析 注册界面实际上是一个表格(对齐),一行有两个单元格。 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevic…...
python中的JSON模块详解
简介 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它使得人们很容易的进行阅读和编写 同时也方便了机器进行解析和生成。适用于进行数据交互的场景,比如网站前台与后台之间的数据交互 网址 官方文档 json — JSON encoder and dec…...

Syncfusion Essential Edit for WPF Crack
Syncfusion Essential Edit for WPF Crack 在任何WPF应用程序中启用语法高亮显示。 Syncfusion Essential Edit for WPF是一款具有所有基本功能的编辑器,如文本编辑、剪切、复制和粘贴。它允许用户从各种文件格式打开文件并将其保存为各种文件格式。Syncfusion Esse…...

机器学习深度学习——卷积神经网络(LeNet)
👨🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习&&深度学习——池化层 📚订阅专栏:机器学习&&深度学习 希望文章对你们有所帮助 卷积神…...

Pytorch Tutorial【Chapter 2. Autograd】
Pytorch Tutorial 文章目录 Pytorch TutorialChapter 2. Autograd1. Review Matrix Calculus1.1 Definition向量对向量求导1.2 Definition标量对向量求导1.3 Definition标量对矩阵求导 2.关于autograd的说明3. grad的计算3.1 Manual手动计算3.2 backward()自动计算 Reference C…...
Python第三方库国内镜像下载地址
Python第三方库国内镜像下载地址 一、清华大学二、中国科技大学三、安装方法 一、清华大学 https://pypi.tuna.tsinghua.edu.cn/simple 二、中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple 三、安装方法 例如 pyhook3 插件的安装方法,执行下面命令安装…...
从浏览器输入url到页面加载(七)服务端机器一般部署在哪里
前言 上一节,我们说到了CDN和路由器的关系,说到了公有地址,说到了通信线路服务,这一节跳过那些看不懂的深层知识,直接开始说web服务器。 1. 服务端机器为什么不部署在公司内部 记得在之前的一段时间里,公…...

Pytorch深度学习-----神经网络之Sequential的详细使用及实战详解
系列文章目录 PyTorch深度学习——Anaconda和PyTorch安装 Pytorch深度学习-----数据模块Dataset类 Pytorch深度学习------TensorBoard的使用 Pytorch深度学习------Torchvision中Transforms的使用(ToTensor,Normalize,Resize ,Co…...

安全基础 --- https详解 + 数组(js)
CIA三属性:完整性(Confidentiality)、保密性(Integrity)、可用性(Availability),也称信息安全三要素。 https 核心技术:用非对称加密传输对称加密的密钥,然后…...
vue加载大量数据优化
在Vue中加载大量数据并形成列表时,可以通过以下方法来优化性能: 分页加载:不要一次性加载所有的数据,而是分批加载数据,每次只加载当前页需要显示的数据量。可以使用第三方库如vue-infinite-loading来实现无限滚动加载…...

WebRTC 之音视频同步
在网络视频会议中, 我们常会遇到音视频不同步的问题, 我们有一个专有名词 lip-sync 唇同步来描述这类问题,当我们看到人的嘴唇动作与听到的声音对不上的时候,不同步的问题就出现了 而在线会议中, 听见清晰的声音是优先…...

kubernetes基于helm部署gitlab-runner
kubernetes基于helm部署gitlab-runner 这篇博文介绍如何在 Kubernetes 中使用helm部署 GitLab-runner。 先决条件: 已运行的 Kubernetes 集群已运行的 gitlab 实例 项目地址:https://gitlab.com/gitlab-org/charts/gitlab-runner 官方文档ÿ…...

RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...
【WebSocket】SpringBoot项目中使用WebSocket
1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖,添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...