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 官方文档ÿ…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
