MyBatis的注解实现复杂映射开发

xml 配置方式实现复杂映射回顾

实现复杂映射我们之前可以在映射文件中通过配置来实现,使用注解开发后,我们可以通过 @Results 注解,@Result 注解,@One 注解和 @Many 注解组合完成复杂关系的配置。

注解说明
@Results
代替的是标签 ,该注解中可以使用单个的 @Result 注解,也可以使用 @Result 集合。
使用方式: @Results({@Result(), @Result()}) 或者 @Results(@Result())
@Result
代替了 标签和 标签
@Result 中的属性介绍
column:数据库中的列名
property:要装配的属性名
one:需要使用 @One 注解( @Result(one=@One)()
many:需要使用 @Many 注解( @Result(many=@many)()
@One(一对一)代替了 标签,是多表查询的关键,在注解中用来指定子查询返回单一对象。
@One 注解属性介绍
select:指定用来多表查询的 sqlmapper
使用格式: @Result(column="", property="", one=(select=""))
@Many(多对一)代替了 标签,是多表查询的关键,在注解中用来指定子查询返回对象集合。
使用格式: @Result(property="", column="", many=@many(select=""))

一对一查询

一对一查询的模型

用户表和订单表的关系为,一个用户有多个订单,一共订单只属于一个用户

一对一查询需求:查询一个订单,与此同时查询该订单对应的用户

@startuml !include https://unpkg.com/plantuml-style-c4@latest/core.puml ' uncomment the following line and comment the first to use locally '!include core.puml left to right direction class orders { ordertime: varchar(255) total: double uid: int(11) id: int(11) } class user { username: varchar(50) password: varchar(50) birthday: varchar(50) id: int(11) } orders -[#595959,plain]-^ user : "uid:id" @enduml

一对一查询的语句

对应的 sql 语句

select * from orders;
select * from user where id=查询出订单的uid;

查询结果如下:

idordertimetotaluididusernamepasswordbirthday
12019-12-12300011lucy1232019-12-12
22019-12-12400011lucy1232019-12-12
32019-12-12500021lucy1232019-12-12
12019-12-12300012tom1232019-12-12

创建 User 和 Order 实体

/*** 订单** @name: Order* @author: terwer* @date: 2022-03-17 17:42**/
public class Order {private Integer id;private String orderTime;private Double total;// 代表当前订单属于哪一个用户private User user;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getOrderTime() {return orderTime;}public void setOrderTime(String orderTime) {this.orderTime = orderTime;}public Double getTotal() {return total;}public void setTotal(Double total) {this.total = total;}public User getUser() {return user;}public void setUser(User user) {this.user = user;}@Overridepublic String toString() {return "Order{" +"id=" + id +", orderTime='" + orderTime + '\'' +", total=" + total +", user=" + user +'}';}
}/*** 用户** @name: User* @author: terwer* @date: 2022-05-25 13:25**/
public class User {private Integer id;private String username;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +'}';}
}

创建 IOrderMapper 接口

/*** 订单映射** @name: IUserMapper* @author: terwer* @date: 2022-03-17 17:54**/
public interface IOrderMapper {public List<Order> findOrderAndUser();
}

使用注解配置接口

/*** 订单映射** @name: IUserMapper* @author: terwer* @date: 2022-03-17 17:54**/
public interface IOrderMapper {/*** 查询订单同时查询订单所属用户** @return*/@Results({@Result(property = "id", column = "id"),@Result(property = "orderTime", column = "ordertime"),@Result(property = "total", column = "total"),@Result(property = "user", column = "uid", javaType = User.class, one = @One(select = "com.terwergreen.mapper.IUserMapper.findUserById"))})@Select("select * from orders")public List<Order> findOrderAndUser();
}
/** 用户映射** @name: IUserMapper* @author: terwer* @date: 2022-05-25 13:27**/
public interface IUserMapper {/*** 根据ID查询用户* @param id* @return*/@Select("select * from user where id=#{id}")User findUserById(Integer id);
}

测试结果

/*** 订单测试** @name: IOrderMapperTest* @author: terwer* @date: 2022-08-31 22:52**/
public class IOrderMapperTest {private IOrderMapper orderMapper;private SqlSession sqlSession;@Beforepublic void before() throws Exception {System.out.println("before...");InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);sqlSession = sqlSessionFactory.openSession();// 这样也是可以的,这样的话后面就不用每次都设置了// sqlSession = sqlSessionFactory.openSession(true);orderMapper = sqlSession.getMapper(IOrderMapper.class);}@Testpublic void testFindOrder() throws Exception {List<Order> orderAndUser = orderMapper.findOrderAndUser();orderAndUser.forEach(order -> {System.out.println(order);});}
}

效果

Opening JDBC Connection
Created connection 2024453272.
Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@78aab498]
==>  Preparing: select * from orders
==> Parameters: 
<==    Columns: id, ordertime, total, uid
<==        Row: 1, 2019-12-12, 3000.0, 1
====>  Preparing: select * from user where id=?
====> Parameters: 1(Integer)
<====    Columns: id, username, password, birthday
<====        Row: 1, lucy, 123, 2019-12-12
<====      Total: 1
<==        Row: 2, 2019-12-12, 4000.0, 1
<==        Row: 3, 2019-12-12, 5000.0, 2
====>  Preparing: select * from user where id=?
====> Parameters: 2(Integer)
<====    Columns: id, username, password, birthday
<====        Row: 2, tom, 123, 2019-12-12
<====      Total: 1
<==      Total: 3
Order{id=1, orderTime='2019-12-12', total=3000.0, user=User{id=1, username='lucy'}}
Order{id=2, orderTime='2019-12-12', total=4000.0, user=User{id=1, username='lucy'}}
Order{id=3, orderTime='2019-12-12', total=5000.0, user=User{id=2, username='tom'}}Process finished with exit code 0

调用过程分析

image-20220901002006366

一对多查询

一对多查询的模型

用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户。

一对多查询需求:查询一个用户,与此同时查出该用户具有的订单。

@startuml !include https://unpkg.com/plantuml-style-c4@latest/core.puml ' uncomment the following line and comment the first to use locally '!include core.puml left to right direction class orders { ordertime: varchar(255) total: double uid: int(11) id: int(11) } class user { username: varchar(50) password: varchar(50) birthday: varchar(50) id: int(11) } orders -[#595959,plain]-^ user : "uid:id" @enduml

一对多查询语句

对应查询语句:

对应的 sql 语句

select * from user;
select * from orders where uid=查询出用户的id;

查询结果如下:

idordertimetotaluididusernamepasswordbirthday
12019-12-12300011lucy1232019-12-12
22019-12-12400011lucy1232019-12-12
32019-12-12500021lucy1232019-12-12
12019-12-12300012tom1232019-12-12

修改 User 实体

/*** 订单** @name: Order* @author: terwer* @date: 2022-03-17 17:42**/
public class Order {private Integer id;private String orderTime;private Double total;// 代表当前订单属于哪一个用户private User user;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getOrderTime() {return orderTime;}public void setOrderTime(String orderTime) {this.orderTime = orderTime;}public Double getTotal() {return total;}public void setTotal(Double total) {this.total = total;}public User getUser() {return user;}public void setUser(User user) {this.user = user;}@Overridepublic String toString() {return "Order{" +"id=" + id +", orderTime='" + orderTime + '\'' +", total=" + total +", user=" + user +'}';}
}
/*** 用户** @name: User* @author: terwer* @date: 2022-05-25 13:25**/
public class User {private Integer id;private String username;// 代表当前用户具备那些订单private List<Order> orderList;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public List<Order> getOrderList() {return orderList;}public void setOrderList(List<Order> orderList) {this.orderList = orderList;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", orderList=" + orderList +'}';}
}

创建 IUserMapper 接口

/*** 用户映射** @name: IUserMapper* @author: terwer* @date: 2022-05-25 13:27**/
public interface IUserMapper {/*** 查询用户和订单** @return*/List<User> findUserAndOrder();
}

使用注解配置 Mapper

/*** 用户映射** @name: IUserMapper* @author: terwer* @date: 2022-05-25 13:27**/
public interface IUserMapper {/*** 查询用户和订单** @return*/@Results({@Result(property = "id", column = "id"),@Result(property = "username", column = "username"),@Result(property = "orderList", column = "id", many = @Many(select = "com.terwergreen.mapper.IOrderMapper.findOrderByUid"), javaType = List.class)})@Select("select * from user")List<User> findUserAndOrder();
}
/*** 订单映射** @name: IUserMapper* @author: terwer* @date: 2022-03-17 17:54**/
public interface IOrderMapper {@Select("select * from orders where uid=#{uid}")public List<Order> findOrderByUid(Integer uid);
}

测试结果

public class IUserMapperTest {private IUserMapper userMapper;private SqlSession sqlSession;@Beforepublic void before() throws Exception {System.out.println("before...");InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);sqlSession = sqlSessionFactory.openSession();// 这样也是可以的,这样的话后面就不用每次都设置了// sqlSession = sqlSessionFactory.openSession(true);userMapper = sqlSession.getMapper(IUserMapper.class);}@Testpublic void testGetUserOrders() {List<User> userAndOrder = userMapper.findUserAndOrder();userAndOrder.forEach(user -> {System.out.println(user);});}
}

结果如下:

Opening JDBC Connection
Created connection 98394724.
Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@5dd6264]
==>  Preparing: select * from user
==> Parameters: 
<==    Columns: id, username, password, birthday
<==        Row: 1, lucy, 123, 2019-12-12
====>  Preparing: select * from orders where uid=?
====> Parameters: 1(Integer)
<====    Columns: id, ordertime, total, uid
<====        Row: 1, 2019-12-12, 3000.0, 1
<====        Row: 2, 2019-12-12, 4000.0, 1
<====      Total: 2
<==        Row: 2, tom, 123, 2019-12-12
====>  Preparing: select * from orders where uid=?
====> Parameters: 2(Integer)
<====    Columns: id, ordertime, total, uid
<====        Row: 3, 2019-12-12, 5000.0, 2
<====      Total: 1
<==        Row: 8, 测试2, null, null
====>  Preparing: select * from orders where uid=?
====> Parameters: 8(Integer)
<====      Total: 0
<==        Row: 9, 测试3, null, null
====>  Preparing: select * from orders where uid=?
====> Parameters: 9(Integer)
<====      Total: 0
<==      Total: 4
User{id=1, username='lucy', orderList=[Order{id=1, orderTime='2019-12-12', total=3000.0, user=null}, Order{id=2, orderTime='2019-12-12', total=4000.0, user=null}]}
User{id=2, username='tom', orderList=[Order{id=3, orderTime='2019-12-12', total=5000.0, user=null}]}
User{id=8, username='测试2', orderList=[]}
User{id=9, username='测试3', orderList=[]}Process finished with exit code 0

多对多查询

多对多查询的模型

用户表和角色表的关系为,一个用户有多个角色,一个角色被多个用户使用。

@startuml !include https://unpkg.com/plantuml-style-c4@latest/core.puml ' uncomment the following line and comment the first to use locally '!include core.puml left to right direction class sys_role { rolename: varchar(255) roleDesc: varchar(255) id: int(11) } class sys_user_role { userid: int(11) roleid: int(11) } class user { username: varchar(50) password: varchar(50) birthday: varchar(50) id: int(11) } sys_user_role -[#595959,plain]-^ sys_role : "roleid:id" sys_user_role -[#595959,plain]-^ user : "userid:id" @enduml

多对多查询需求

查询用户的同时查询该用户对应的角色。

多对多查询的语句

select * from user;
select * from sys_role r,sys_user_role ur where r.id=ur.roleid and ur.userid=用户的id

查询结果如下:

idrolenameroleDescuseridroleid
1CTOCTO11
2CEOCEO12

代码实现

  • 创建 User 实体和 Role 实体

    /*** 用户** @name: User* @author: terwer* @date: 2022-05-25 13:25**/
    public class User {private Integer id;private String username;// 代表当前用户具备那些订单private List<Order> orderList;// 代表当前用户具备的那些角色private List<Role> roleList;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public List<Order> getOrderList() {return orderList;}public void setOrderList(List<Order> orderList) {this.orderList = orderList;}public List<Role> getRoleList() {return roleList;}public void setRoleList(List<Role> roleList) {this.roleList = roleList;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", orderList=" + orderList +", roleList=" + roleList +'}';}
    }
    
  • 创建 IRoleMapper

    /*** 角色映射** @name: IRoleMapper* @author: terwer* @date: 2022-09-06 00:04**/
    public interface  IRoleMapper {@Select("select * from sys_role r,sys_user_role ur where r.id=ur.roleid and ur.userid=#{userId}")List<Role> findRolesByUserId(Integer userId);
    }
    
    /*** 角色** @name: Role* @author: terwer* @date: 2022-05-12 14:14**/
    public class Role {private Integer id;private String rolename;@Overridepublic String toString() {return "Role{" +"id=" + id +", rolename='" + rolename + '\'' +'}';}
    }
    
  • 修改 IUserMapper

    /*** 用户映射** @name: IUserMapper* @author: terwer* @date: 2022-05-25 13:27**/
    public interface IUserMapper {@Results({@Result(property = "id", column = "id"),@Result(property = "username", column = "username"),@Result(property = "roleList", column = "id", javaType = List.class,many = @Many(select = "com.terwergreen.mapper.IRoleMapper.findRolesByUserId"))})@Select("select * from user")List<User> findUserAndRole();
    }
    
  • 添加测试方法

    public class IUserMapperTest {private IUserMapper userMapper;private SqlSession sqlSession;@Beforepublic void before() throws Exception {System.out.println("before...");InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);sqlSession = sqlSessionFactory.openSession();// 这样也是可以的,这样的话后面就不用每次都设置了// sqlSession = sqlSessionFactory.openSession(true);userMapper = sqlSession.getMapper(IUserMapper.class);}@Testpublic void testFindUserAndRole() {userMapper.findUserAndRole().forEach(user -> {System.out.println(user);});}
    }
    
  • 效果如下

    Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@51e5fc98]
    ==>  Preparing: select * from user
    ==> Parameters: 
    <==    Columns: id, username, password, birthday
    <==        Row: 1, lucy, 123, 2019-12-12
    ====>  Preparing: select * from sys_role r,sys_user_role ur where r.id=ur.roleid and ur.userid=?
    ====> Parameters: 1(Integer)
    <====    Columns: id, rolename, roleDesc, userid, roleid
    <====        Row: 1, CTO, CTO, 1, 1
    <====        Row: 2, CEO, CEO, 1, 2
    <====      Total: 2
    <==        Row: 2, tom, 123, 2019-12-12
    ====>  Preparing: select * from sys_role r,sys_user_role ur where r.id=ur.roleid and ur.userid=?
    ====> Parameters: 2(Integer)
    <====    Columns: id, rolename, roleDesc, userid, roleid
    <====        Row: 1, CTO, CTO, 2, 1
    <====        Row: 2, CEO, CEO, 2, 2
    <====      Total: 2
    <==        Row: 8, 测试2, null, null
    ====>  Preparing: select * from sys_role r,sys_user_role ur where r.id=ur.roleid and ur.userid=?
    ====> Parameters: 8(Integer)
    <====      Total: 0
    <==        Row: 9, 测试3, null, null
    ====>  Preparing: select * from sys_role r,sys_user_role ur where r.id=ur.roleid and ur.userid=?
    ====> Parameters: 9(Integer)
    <====      Total: 0
    <==      Total: 4
    User{id=1, username='lucy', orderList=null, roleList=[Role{id=1, rolename='CTO'}, Role{id=2, rolename='CEO'}]}
    User{id=2, username='tom', orderList=null, roleList=[Role{id=1, rolename='CTO'}, Role{id=2, rolename='CEO'}]}
    User{id=8, username='测试2', orderList=null, roleList=[]}
    User{id=9, username='测试3', orderList=null, roleList=[]}Process finished with exit code 0
    

文章更新历史

2024/05/13 同步文章到其他平台

2022-08-30 feat:初稿

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/12183.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【csv-parse】使用parse方法的时候来转换为csv字符串时,会导致输出有乱码

&#x1f601; 作者简介&#xff1a;一名大四的学生&#xff0c;致力学习前端开发技术 ⭐️个人主页&#xff1a;夜宵饽饽的主页 ❔ 系列专栏&#xff1a;前端bug记录 &#x1f450;学习格言&#xff1a;成功不是终点&#xff0c;失败也并非末日&#xff0c;最重要的是继续前进…

Vue3组件库开发项目实战——02项目搭建(配置Eslint/Prettier/Sass/Tailwind CSS/VitePress/Vitest)

摘要&#xff1a;在现代前端开发中&#xff0c;构建一个高效、可维护且易于协作的开发环境至关重要。特别是在开发Vue3组件库时&#xff0c;我们需要确保代码的质量、一致性和文档的完整性。本文将带你从0搭建vue3组件库开发环境&#xff0c;以下是配置代码规范、格式化、CSS样…

扩散模型diffusion model

一 什么是扩散模型 1.1 现有生成模型 已经有大量的方法证明深度生成模型能够模拟人类的想象思维&#xff0c;生成人类难以分辨真伪的内容&#xff0c;主要方法如下&#xff1a; 1、GAN&#xff1a;用神经网络训练生成器和判别器 GAN 的主要思想&#xff1a; GAN 就是一个互搏的…

49.乐理基础-拍号的类型-单拍子、复拍子

当前写的东西&#xff0c;如果只是想要看懂乐谱的话&#xff0c;它是没什么意义的&#xff0c;就像我们要把 0&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5。。。称为自然数&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5称为正整…

H5 云商城 file.php 文件上传致RCE漏洞复现

0x01 产品简介 H5 云商城是一个基于 H5 技术的电子商务平台,旨在为用户提供方便快捷的在线购物体验。多平台适配:H5 云商城采用 H5 技术开发,具有良好的跨平台适配性。无论是在电脑、手机还是平板等设备上,用户都可以通过网页浏览器访问和使用云商城,无需安装额外的应用程…

销量?模糊销量?精准销量?如何获取淘宝商品销量数据接口

淘宝爬虫商品销量数据采集通常涉及以下几个步骤&#xff1a; 1、确定采集目标&#xff1a;需要明确要采集的商品类别、筛选条件&#xff08;如天猫、价格区间&#xff09;、销量和金额等数据。例如&#xff0c;如果您想了解“小鱼零食”的销量和金额&#xff0c;您需要设定好价…

vueday1

1.作用&#xff1a;利用表达式进行插值&#xff0c;渲染到页面中 三元表达式、点语法、数组对应项&#xff0c;方法、点语法方法 1.使用的时候需要存在&#xff0c;需要在data里面声明&#xff0c;如果没有声明会报错 2.ifelse不能用 3.不能在标签属性中使用{{}}插值 <!DO…

【前端】打砖块游戏:实现细节介绍

打砖块游戏:实现细节介绍 在本文中,我将详细介绍如何使用HTML、CSS和JavaScript技术构建一个简单的打砖块游戏。我们将重点讨论游戏的三个核心技术方面:碰撞检测、画图和事件监听。 完整代码我放在:github可以直接拉取代码测试。 游戏概览 打砖块游戏中,玩家通过控制底…

静态住宅IP优缺点总结

在进行海外 IP 代理时&#xff0c;了解动态住宅 IP 和静态住宅 IP 的区别以及如何选择合适的类型非常重要。本文将介绍精态住宅 IP 特点和&#xff0c;并提供选择建议&#xff0c;帮助您根据需求做出明智的决策。 静态住宅 IP 的特点 静态住宅 IP 是指 IP 地址在一段时间内保…

涨点神器:即插即用特征融合模块!超低参数,性能依旧SOTA

在写论文时&#xff0c;一些通用性模块可以在不同的网络结构中重复使用&#xff0c;这简化了模型设计的过程&#xff0c;帮助我们加快了实验的迭代速度。 比如在视觉任务中&#xff0c;即插即用的特征融合模块可以无缝集成到现有网络中&#xff0c;以灵活、简单的方式提升神经…

7.STL中string的一些超常用函数 (附习题)

目录 1.find 2.atoi 3.to_string 4.getline 【leetcode 习题】 387.字符串中的第一个唯一字符 125. 验证回文串 1.find 1.查找第一次出现的目标字符串&#xff1a;说明&#xff1a;如果查找成功则输出查找到的第一个位置&#xff0c;否则返回-1&#xff1b; s1.find(s2…

宇宙(科普)

宇宙&#xff08;Universe&#xff09;在物理意义上被定义为所有的空间和时间&#xff08;统称为时空&#xff09;及其内涵&#xff0c;包括各种形式的所有能量&#xff0c;比如电磁辐射、普通物质、暗物质、暗能量等&#xff0c;其中普通物质包括行星、卫星、恒星、星系、星系…

【目标检测】YOLOv5|YOLOv8模型QT界面可视化部署

YOLO-Deploy-QT_Interface 最近笔者做了YOLO系列算法的部署工作,现做一个总结。主要工作是做了用于部署YOLOv5和YOLOv8的可视化QT界面,可实现图片、文件夹、视频、摄像头的ONNX与OpenVino部署,具体效果如下: 代码链接:https://github.com/Zency-Sun/YOLO-Deploy-QT_Inte…

Centos7 配置 DNS服务器

Centos 7 配置DNS服务器 环境描述&#xff1a; 一台服务器和一台用于测试的客户机 服务器IP&#xff1a;192.168.200.132 客户机IP&#xff1a;192.168.200.143 服务器配置 yum install bind bind-utils -y #安装软件包vim /etc/named.conf //编辑named主配置文件listen-on p…

【Linux】解析键盘组合键产生信号的完整过程:从硬件中断到信号发送

前言 每一个了解Linux的都知道这样一个知识&#xff0c;CtrlC组合键能够终止一个进程。 个人了解进程相关知识之后知道&#xff0c;一个进程被终止只会有有三种情况&#xff1a; 代码运行完毕&#xff0c;结果正确代码运行完毕&#xff0c;结果不正确代码运行异常&#xff…

huggingface 笔记:pipeline

1 介绍 pipeline() 是使用预训练模型进行推理的最简单和最快速的方式。可以针对不同模态的许多任务直接使用 pipeline() 2 举例&#xff1a;情感分析 2.1 创建pipeline实例 from transformers import pipelineclassifier pipeline("sentiment-analysis") #首先创…

SystemC学习使用记录

一、概述 对于复杂的片上系统&#xff0c;在进行RTL编码前&#xff0c;需进行深入的系统级仿真&#xff0c;以确认设计的体系结构是否恰当、总线是否能满足吞吐量和实现性要求以及存储器是否浪费&#xff0c;所进行的这些仿真要求在芯片的仿真模型上运行大量的软件&#xff0c…

跨境必看|TikTok账号运营的八大秘籍

国内的传统生意都是可以在抖音上做&#xff0c;那么也可以在TikTok 上重新做一遍。那该如何才能把握住这片巨大的蓝海&#xff0c;TikTok 账号的运营就成为了主要的关键了&#xff0c;对于TikTok账号运营的八大秘籍&#xff0c;大家一起看看是如何做的&#xff1f; 一、固定节…

为什么需要使用SOCKS5代理?

SOCKS代表Socket Secure&#xff0c;是一种网络协议&#xff0c;能够在网络上进行数据传输。SOCKS5是SOCKS协议的第五个版本&#xff0c;它提供了更加安全和灵活的数据传输方式&#xff0c;因此在网络安全和隐私保护方面被广泛应用。在我们的日常生活中&#xff0c;为什么需要使…

VMware虚拟机安装详细教程

VMware下载安装好后&#xff0c;下载好我们要安装的操作系统的镜像文件后&#xff0c;此处安装的为centos7版本&#xff0c;就可以开始安装了。 1点击下一步 image 2、勾选【我接受条件款协议中的条款】&#xff0c;然后点击【下一步】。 image 3、取消勾选&#xff0c;然后点…