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

MyBatis —— 多种查询及映射关系

前言

        上一篇文章中荔枝梳理了有关MyBatis的相关环境配置和核心配置文件及其模板的设置和生成,而在这篇文章中荔枝会着重梳理MyBatis多种查询情况、特殊SQL执行以及两表联查时映射关系的处理。希望对需要的小伙伴有帮助~~~


文章目录

前言

一、多种查询情况

1.1 查询单条数据

1.2 查询多条数据

1.3 特殊SQL的执行 

1.3.1 模糊查询

1.3.2 批量删除

1.3.3 动态设置表名

1.3.4 获取自增主键

二、自定义映射

2.1 解决字段名和属性名不一致的三种方案

2.2 多对一的映射关系

2.2.1 通过级联属性赋值解决多对一映射

2.2.2 通过association解决多对一映射问题

2.2.3 association分步查询解决多对一映射问题

2.2.4 延迟加载 

2.3 一对多映射关系 

2.3.1 Collection解决一对多映射关系

2.3.2 分步查询解决一对多映射关系

总结


一、多种查询情况

        在MyBatis中,对于数据库的查询来说,如果查询出来的数据只有一条,可以通过实体类对象或者集合(list、map)来接收,如果查询的数据有多条,则一定不能通过实体类来接收,否则会抛出异常TooManyResultException。

1.1 查询单条数据

实体类对象:

User getUserById(@Param("id") Integer id);

list集合:

List<User> getAllUser(@Param("id") Integer id);

map集合

Map<String,Object> getUserByIdToMap(@Param("id") Integer id);

1.2 查询多条数据

 list集合:

List<User> getAllUser(@Param("id") Integer id);

map集合:

List<Map<String,Object>> getAllUserToMap(@Param("id") Integer id);

或者借助@MapKey注解

@MapKey("id")  //把查询到的数据的某一个字段作为key,查询到的所有数据作为值value
Map<String,Object> getAllUserToMap2(@Param("id") Integer id);

1.3 特殊SQL的执行 

在MyBatis中,大多数的查询都可以使用#{}的格式来获取参数,但是有一些特殊SQL的执行则不能直接采用#{}的格式。

1.3.1 模糊查询

采用${}格式 

<mapper namespace="com.crj.mapper.SQLMapper">
<!--    List<User> getUserByLike(@Param("username") String username);--><select id="getUserByLike" resultType="User">select * from t_user where username like '%${username}%'</select>
</mapper>

 采用concat拼接并采用#{}

<mapper namespace="com.crj.mapper.SQLMapper">
<!--    List<User> getUserByLike(@Param("username") String username);--><select id="getUserByLike" resultType="User">select * from t_user where username like concat('%',#{username},'%')</select>
</mapper>

采用" "拼接SQL 

<mapper namespace="com.crj.mapper.SQLMapper">
<!--    List<User> getUserByLike(@Param("username") String username);--><select id="getUserByLike" resultType="User">select * from t_user where username like "%"#{username}"%"</select>
</mapper>

1.3.2 批量删除

在执行批量删除的时候为什么不能使用#{}?这是因为#{}会自动加上单引号从而导致SQL异常无法实现批量删除的功能。 

<!--    int deleteMore(@Param("ids") String ids);--><delete id="deleteMore">delete from t_user where id in (${ids})</delete>

1.3.3 动态设置表名

在数据库执行完水平分表之后,MyBatis在执行数据操作的时候就需要动态设置表名从而实现分表查询。这里因为表名是不能加单引号的,所以这里还是采用${}的形式来实现动态分表查询。

<!--    List<User> getUserByTableName(@Param("tableName") String tableName);--><select id="getUserByTableName" resultType="User">select * from ${tableName} where id=1</select>

1.3.4 获取自增主键

插入数据时使用自增主键需要设置insert标签的两个属性: 

  • useGeneratedKeys:设置当前标签中的SQL使用了自增主键
  • keyProperty:将自增的主键的值赋值给传输到映射文件中参数的某个属性
<!--    void insertUser(User user);--><insert id="insertUser" useGeneratedKeys="true" keyProperty="id">insert into t_user values (null,#{username},#{password})</insert>

二、自定义映射

        在之前我们使用resultType要求字段名和属性名一致,使用的是一种默认的自动创建的映射关系。但是当字段名和属性名不一致的时候或者处理一对多和多对一的映射关系的时候,我们需要自定义映射关系resultMap

2.1 解决字段名和属性名不一致的三种方案

  • 为字段起别名,保持与属性名一致
<select id="getAllEmp" resultType="Emp">select eid,emp_name empName from t_emp
</select>
  • 在核心配置文件中借助setting标签中的mapUnderscoreToCameCase 
<!--设置mybatis的全局设置--><settings>
<!--        mapUnderscoreToCameCase:将下划线映射到驼峰命名,默认是false不支持--><setting name="mapUnderscoreToCameCase" value="true"/></settings>

 通过将mapUnderscoreToCameCase属性值设置为true,开启mybatis将下划线映射为驼峰命名的功能 

  • 使用resultMap来自定义映射
<?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.crj.mybatis.mapper.EmpMapper">
<!--    List<Emp> getAllEmp();--><resultMap id="empResultMap" type="Emp"><!--使用resultMap后建议要把所有字段名和属性之间的关系都声明出来--><id property="eid" column="eid"/><result column="emp_name" property="empName"/>  <!--注意这里的映射关系--><result column="age" property="age"/><result column="sex" property="sex"/></resultMap><select id="getAllEmp" resultMap="empResultMap">select * from t_emp</select>
</mapper>

        id:唯一标识,不能重复

        type:设置映射关系中的实体类类型

这里有两个子标签:id和result。

id:设置主键的映射关系

result:设置普通字段的映射关系

属性 :

        property:设置映射关系中的属性名,必须是type属性所设置的实体类类型的属性名

        column:设置映射关系中的字段名,是SQL语句查询出的字段名

2.2 多对一的映射关系

这里有员工和部门两张表,分别为二者创建实现类Emp和Dept。在多对一的映射关系中,我们考虑的是多个员工同属于一个部门。

package com.crj.mybatis.pojo;public class Emp {private Integer eid;private  String empName;private Integer age;private String sex;private String email;private Dept dept;@Overridepublic String toString() {return "Emp{" +"eid=" + eid +", empName='" + empName + '\'' +", age=" + age +", sex='" + sex + '\'' +", email='" + email + '\'' +", dept=" + dept +'}';}public Dept getDept() {return dept;}public void setDept(Dept dept) {this.dept = dept;}public Emp(Integer eid, String empName, Integer age, String sex, String email) {this.eid = eid;this.empName = empName;this.age = age;this.sex = sex;this.email = email;}public Emp(){}public Integer getEid() {return eid;}public void setEid(Integer eid) {this.eid = eid;}public String getEmpName() {return empName;}public void setEmpName(String empName) {this.empName = empName;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}
}

2.2.1 通过级联属性赋值解决多对一映射

    <resultMap id="getEmpAndDept" type="Emp"><id property="eid" column="eid"/><result column="emp_name" property="empName"/><result column="age" property="age"/><result column="sex" property="sex"/><result column="did" property="dept.did"/><result column="dept_name" property="dept.deptName"/></resultMap><!--    Emp getEmpAndDept(@Param("eid") Integer eid);--><select id="getEmpAndDept" resultMap="getEmpAndDept">select * from t_emp left join t_dept on t_emp.did=t_dept.did where t_emp.eid = #{eid}</select>

2.2.2 通过association解决多对一映射问题

其中,对于association中的属性我们需要了解:

  • property:需要处理多对一映射关系的属性名
  • javaType: 该属性的类型
    <resultMap id="getEmpAndDept" type="Emp"><id property="eid" column="eid"/><result column="emp_name" property="empName"/><result column="age" property="age"/><result column="sex" property="sex"/><association property="dept" javaType="Dpet"><id property="did" column="did"></id><result property="deptName" column="dept_name"></result></association></resultMap>

2.2.3 association分步查询解决多对一映射问题

此时association中的property属性的含义不变,但还有两个比较重要的属性需要设置相应的属性值

  • select:设置分步查询的sql的唯一标识(一般是设置多对一中一处的mapper接口全类名.方法名)
  • column:设置分布查询的条件,在这个例子中,分布查询是依据两个表之间的关系也就是did来实现的。 
  • fetchType:当开启了全局的延迟加载之后,可以通过此属性手动控制延迟加载的效果

分步查询的第一步:查询员工信息 

EmpMapper.java

package com.crj.mybatis.mapper;import com.crj.mybatis.pojo.Emp;
import org.apache.ibatis.annotations.Param;import java.util.List;public interface EmpMapper {/*** 通过分布查询员工以及员工所对应的部门信息* 分布查询第一步:查询员工信息*/Emp getEmpAndDeptByStepOne(@Param("eid") Integer eid);
}

EmpMapper.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.crj.mybatis.mapper.EmpMapper">
<!--    分步查询,两表联查--><resultMap id="empAndDeptByStepResultMap" type="Emp"><id property="eid" column="eid"/><result column="emp_name" property="empName"/><result column="age" property="age"/><result column="sex" property="sex"/><association property="dept" select="com.crj.mybatis.mapper.DeptMapper.getEmpAndDeptByStepTwo" column="did"></association></resultMap>
<!--    Emp getEmpAndDeptByStepOne(@Param("eid") Integer eid);--><select id="getEmpAndDeptByStepOne" resultMap="empAndDeptResultMapTwo">select * from t_emp where eid = #{eid}</select></mapper>

分步查询第二步:根据查询到的员工信息中的did来查询相应的部门信息

DpetMapper.java

package com.crj.mybatis.mapper;import com.crj.mybatis.pojo.Dept;
import org.apache.ibatis.annotations.Param;public interface DeptMapper {/*** 通过分布查询员工以及员工所对应的部门信息* 分布查询第二步:通过did查询员工所对应的部门*/Dept getEmpAndDeptByStepTwo(@Param("did") Integer did);}

DeptMapper.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.crj.mybatis.mapper.DeptMapper">
<!--    Dept getEmpAndDeptByStepTwo(@Param("did") Integer did);--><select id="getEmpAndDeptByStepTwo" resultType="Dept">select * from t_dept where did = #{did}</select>
</mapper>

需要注意的是,分步查询在实际的应用场景中使用的会比较多。 

注意:为什么更推荐使用分步查询呢?

这是因为通过分步查询我们可以实现MyBatis的延迟加载(懒加载 )功能,通过分步查询我们可以做到需要查询什么信息就执行什么SQL语句,比如我们仅需要查询员工信息而不需要部门的内容时,通过延迟加载我们只会执行EmpMapper中的SQL语句,同时分步查询也实现了两种不同的查询功能的隔离。MyBatis中默认是不会开启延迟加载的功能滴,

2.2.4 延迟加载 

要想实现延迟加载的功能,就必须在全局配置文件中开启相应的延迟加载的开关: 

  • lazyLoadingEnabled:延迟加载的全局开关。当开启时,所有关联对象都会延迟加载,默认true;
  • aggressiveLazyLoading:当开启时,任何方法的调用都会加载该对像的所有属性。否则,每个属性会按需加载,默认false;

        开启延迟加载时针对于当前的所有的分步查询,如果哪一步不需要延迟加载可通过associationcollection中的fetchType属性设置当前的分步查间是否使用延迟加载,fetchType="lazy(延迟加载) l eager(立即加载)' 

    <settings>
<!--        开启延迟加载--><setting name="lazyLoadingEnabled" value="true"/></settings>

2.3 一对多映射关系 

2.3.1 Collection解决一对多映射关系

Dpet.java 

//一对多的映射关系private List<Emp> emps;

DeptMapper.java 

    /*** 以部门为主表来获取部门中所有的员工信息*/Dept getDeptAndEmp(@Param("did") Integer did);

DeptMapper.xml 

<resultMap id="deptAndEmpResultMap" type="Dept"><id property="did" column="did"></id><result property="deptName" column="dept_name"></result><!--注意区分ofType和association中属性javaType的区别--><collection property="emps" ofType="Emp"><id property="did" column="did"></id><result property="empName" column="emp_name"></result><result property="age" column="age"></result><result property="sex" column="sex"></result><result property="email" column="email"></result></collection></resultMap>
<!--    Dept getDeptAndEmp(@Param("did") Integer did);--><select id="getDeptAndEmp" resultMap="deptAndEmpResultMap">select * from t_dept left join t_emp on t_dept.did = t_emp.did where t_dept.did = #{did}</select>

2.3.2 分步查询解决一对多映射关系

分步查询的第一步:查询部门信息 

DeptMapper.java

package com.crj.mybatis.mapper;import com.crj.mybatis.pojo.Dept;
import org.apache.ibatis.annotations.Param;public interface DeptMapper {/*** 分步查询处理一对多的关系* 第一步:查询部门信息*/Dept getDeptAndEmpByStepOne(@Param("did") Integer did);}

DeptMapper.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.crj.mybatis.mapper.DeptMapper"><resultMap id="deptAndEmpByStepResultMap" type="Dept"><id property="did" column="did"></id><result property="deptName" column="dept_name"></result><collection property="emps" select="com.crj.mybatis.mapper.EmpMapper.getDeptAndEmpByStepTwo" column="did"></collection></resultMap>
<!--    Dept getDeptAndEmpByStepOne(@Param("did") Integer did);--><select id="getDeptAndEmpByStepOne" resultMap="deptAndEmpByStepResultMap">select * from t_dept where did = #{did}</select>
</mapper>

分步查询第二步:根据查询到的员工信息中的did来查询相应的部门信息

EmpMapper.java

package com.crj.mybatis.mapper;import com.crj.mybatis.pojo.Emp;
import org.apache.ibatis.annotations.Param;import java.util.List;public interface EmpMapper {/*** 分步查询处理一对多的关系* 第二步:根据did查询员工信息*/List<Emp> getDeptAndEmpByStepTwo();
}

EmpMapper.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.crj.mybatis.mapper.EmpMapper"><!--    List<Emp> getDeptAndEmpByStepTwo();--><select id="getDeptAndEmpByStepTwo" resultType="Emp">select * from t_emp where did = #{did}</select></mapper>

总结

        弄清楚两种映射关系以及相应的文件依赖关系和处理无疑时学习的重点,荔枝学习的时候也是感觉好像懂了,但复盘的时候还是有很多概念明显没有弄清楚。最近荔枝的学习状态有点波动,可能是摆烂了两周的缘故。。。接下来荔枝也会调整状态滴,继续学习Java后端技术栈并作出相应的Blog输出。最近看了丙哥的文章,喜欢一句话分享给大家:你知道的越多,你不知道的越多。共勉共勉哈哈哈哈~~~

今朝已然成为过去,明日依然向往未来!我是小荔枝,在技术成长的路上与你相伴,码文不易,麻烦举起小爪爪点个赞吧哈哈哈~~~ 比心心♥~~~

相关文章:

MyBatis —— 多种查询及映射关系

前言 上一篇文章中荔枝梳理了有关MyBatis的相关环境配置和核心配置文件及其模板的设置和生成&#xff0c;而在这篇文章中荔枝会着重梳理MyBatis多种查询情况、特殊SQL执行以及两表联查时映射关系的处理。希望对需要的小伙伴有帮助~~~ 文章目录 前言 一、多种查询情况 1.1 查…...

腾讯云服务器镜像TencentOS Server操作系统详细介绍

腾讯云TencentOS Server镜像是腾讯云推出的Linux操作系统&#xff0c;完全兼容CentOS生态和操作方式&#xff0c;TencentOS Server操作系统为云上运行的应用程序提供稳定、安全和高性能的执行环境&#xff0c;TencentOS可以运行在腾讯云CVM全规格实例上&#xff0c;包括黑石物理…...

Docker 中下载各版本的 CentOS、CentOS Steam 方式

如果你跟我一样&#xff0c;想要在docker下载centos的镜像&#xff0c;但是无奈访问不了 https://hub.docker.com/&#xff0c;于是不知道有哪些tag可以下载&#xff0c;该如何办呢&#xff1f; 方法如下&#xff0c;以供参考。 访问&#xff1a;https://quay.io/repository/…...

多线程使用HashMap,HashMap和HashTable和ConcurrentHashMap区别(面试题常考),硬盘IO,顺便回顾volatile

一、回顾&#x1f49b; 谈谈volatile关键字用法 volatile能够保证内存可见性&#xff0c;会强制从主内存中读取数据&#xff0c;此时如果其他线程修改被volatile修饰的变量&#xff0c;可以第一时间读取到最新的值。 二、&#x1f499; HashMap线程不安全没有锁,HashTable线程…...

专线连接交换机设置 – 如何实现高效率的网络连接?

专线链接交换机设置 – 如何实现高效率的网络连接&#xff1f; 什么是专线连接交换机&#xff1f; 在现代互联网中&#xff0c;网络连接的快速和高效是至关重要的。尤其是对于需要大量数据传输和保证网络稳定性的企业和组织来说&#xff0c;专线连接交换机是一项非常重要的技…...

C#,数值计算——Midexp的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { public class Midexp : Midpnt { public new double func(double x) { return funk.funk(-Math.Log(x)) / x; } public Midexp(UniVarRealValueFun funcc, double aa, d…...

微信小程序使用本地存储方法wx.setStorageSync()和wx.getStorageSync()

微信小程序的本地存储可以使用wx.setStorageSync()和wx.getStorageSync()方法实现 使用wx.setStorageSync()方法可以将数据以键值对的方式存储到本地存储中&#xff1a; wx.setStorageSync(demo, demo123);获取数据&#xff1a;使用wx.getStorageSync()方法可以从本地存储中获…...

题解:ABC317C - Remembering the Days

题解&#xff1a;ABC317C - Remembering the Days 题目 链接&#xff1a;Atcoder。 链接&#xff1a;洛谷。 难度 算法难度&#xff1a;B。 思维难度&#xff1a;B。 调码难度&#xff1a;C。 综合评价&#xff1a;普及-。 算法 深度优先搜索。 思路 先建图&#x…...

【CSS】简记CSS效果:通过transition(动画过渡属性)实现侧边栏目滑入滑出

需求 在资金明细的页面中&#xff0c;点击按钮时筛选区域从左侧滑出&#xff0c;完成筛选点击确认后调用接口完成数据查询&#xff0c;筛选区域滑入左侧&#xff1b; 基于微信小程序页面实现 wxml代码 <view><!-- 操作按钮 --><button type"primary&qu…...

LeetCode——最大子数组和(中等)

题目 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 示例 1&#xff1a; 输入&#xff1a;nums [-2,1,-3,4,-1,2,1,-5,4] 输出&#x…...

Zookeeper集成SpringBoot

Curator 是 Apache ZooKeeper 的Java客户端库。 Zookeeper现有常见的Java API如&#xff1a;原生JavaAPI、Curator、ZkClient等。 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"…...

ModaHub魔搭社区:星环科技致力于打造更优越的向量数据库

在数字化时代,数据成为了最重要的资源之一。随着人工智能、大数据等技术的不断发展,向量数据库成为了处理这类数据的关键工具。星环科技作为一家专注于数据存储和管理技术的公司,其重要目标就是将向量数据库打造得更为优越。 在星环科技,有一个专注于向量数据库的团队。这个…...

Dubbo默认使用什么序列化框架?还有哪些?

Dubbo默认使用的序列化框架是Hessian 2.0。Hessian是一种基于二进制的序列化协议&#xff0c;它具有简单、高效的特点&#xff0c;适用于网络传输和存储数据。Hessian在Dubbo中被广泛使用&#xff0c;因为它可以在不同的编程语言之间进行对象的序列化和反序列化。 除了Hessian…...

攻防世界-What-is-this

原题 解题思路 解压后文件 没有后缀&#xff0c;不知道是什么文件。用notepad打开找不到flag。 尝试当成压缩包解压。 用stegsolve以打开图片1&#xff0c; 合成两张图片。...

[C++]构造与毁灭:深入探讨C++中四种构造函数与析构函数

个人主页&#xff1a;北海 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏✨收录专栏&#xff1a;C/C&#x1f91d;希望作者的文章能对你有所帮助&#xff0c;有不足的地方请在评论区留言指正&#xff0c;大家一起学习交流&#xff01;&#x1f9…...

【跟小嘉学 Rust 编程】二十一、网络编程

系列文章目录 【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念 【跟小嘉学 Rust 编程】五、使用结构体关联结构化数据 【跟小嘉学…...

一文了解聚合支付

第四方支付是相对于第三方支付而提出的概念&#xff0c;又被称为“聚合支付”是指通过聚合第三方支付平台、合作银行、等多种支付工具进行的综合支付服务。 简言而之&#xff0c;把支付接口聚合到一个平台上面&#xff0c;来给商家或者个人来提供支付服务。 第四方支付集中了各…...

118.杨辉三角

一、题目 118. 杨辉三角 - 力扣&#xff08;LeetCode&#xff09; 二、代码 class Solution { public:vector<vector<int>> generate(int numRows) {vector<vector<int>>data(numRows);for(int i0;i<numRows;i){data[i].resize(i1);//扩容data[i]…...

第7节——渲染列表+Key作用

一、列表渲染 我们再react中如果渲染列表&#xff0c;一般使用map方法进行渲染 import React from "react";export default class LearnJSX2 extends React.Component {state {infos: [{name: "张三",age: 18,},{name: "李四",age: 20,},{nam…...

NTP服务器时间配置

简介 ntp服务器是一个同步时间都服务器。 开启ntpd 1.查看状态&#xff08;可以看到状态为&#xff1a;inactive&#xff0c;也就是没有启动ntp服务&#xff09; [rootlocalhost]$ systemctl status ntpd ● ntpd.service - Network Time ServiceLoaded: loaded (/usr/lib/…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...