【MyBatis】MyBatis基础操作
文章目录
- 前言
- 注解方式书写 MyBatis
- 打印 MyBatis 日志
- 参数传递
- MyBatis 增加操作
- 返回主键
- MyBatis 删除操作
- MyBatis 修改操作
- MyBatis 查找操作
- 1. 对查询结果进行别名
- 2. @Results注解
- 3. 开启驼峰命名(推荐)
- XML 配置文件方法书写 MyBatis
- 配置数据库的相关配置
- 指定XML的文件路径
- xml 实现
- 增加操作
- 删除操作
- 修改操作
- 查找操作
- 1. 别名
- 2. 定义 result
- 3. 开启驼峰命名
前言
前面我们学习了什么是 MyBatis,为什么要使用 MyBatis,如何创建 MyBatis 环境,并且了解了使用单元测试对代码功能进行测试。那么今天这篇文章将为大家分享关于 MyBatis 的基础操作。
书写 MyBatis 的方法有两种:注解和XML的方法,这里我们两种方法都是给大家写到。
注解方式书写 MyBatis
打印 MyBatis 日志
前面文章中也提到了日志对于我们开发人员的重要性,在使用 MyBatis 框架的过程中,我们同样也可以看到执行 MyBatis 代码的过程中产生的日志。
那么如何打印出 MyBatis 日志呢?我们需要在配置文件中添加配置项来告知 Spring,我们需要知道 MyBatis 代码执行过程中产生的日志。
mybatis:configuration: # 配置打印 MyBatis⽇志log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
添加这个配置了之后,我们在启动项目就会发现,MyBatis 执行过程中的日志就可以看到了。
参数传递
假设我们需要查询 id 为 4 的用户的信息的时候,对应的 SQL 语句就是 select * from userinfo where id=4;
,对应到我们的 MyBatis 就是这样的。
@Select("select * from userinfo where id=4")
public UserInfo getById();
但是可以发现,这样写 SQL 语句的话,这个查询的条件就写死了,那么是否有一种方法可以根据我们用户传递的参数查询指定条件的数据呢?答案是可以的,这就需要用到 MyBatis 中参数传递的知识了。
MyBatis 中使用 #{}
来获取方法中的参数,当我们调用这个方法并且传入参数的时候通过这个 #{}
就能将传递过来的参数给 SQL 语句。
@Select("select * from userinfo where id=#{id}")
public UserInfo getById1(int id);
@Test
void getById1() {UserInfo userInfo = userInfoMapper.getById1(3);log.info(userInfo.toString());
}
如果 mapper 接口类型的方法只有一个普通类型的参数,#{…}里面的属性名可以随便写,但是还是建议和参数名保持一致。
@Select("select * from userinfo where id=#{userid}")
public UserInfo getById1(Integer id);
当然,如果我们觉得方法参数的名字不好的话,我们也可以使用 @Param
对方法的参数进行重命名,但是如果使用 @Param
对参数进行重命名的话,#{…}里面的属性名必须和别名是相同的。
@Select("select * from userinfo where id=#{userid}")
public UserInfo getById1(@Param("userid") Integer id);
@Select("select * from userinfo where id=#{id}")
public UserInfo getById1(@Param("userid") Integer id);
MyBatis 增加操作
数据库的主要操作无非就是增删改查,那么我们使用 MyBatis 如何实现数据库的增删改查呢?
MyBatis 增加操作需要使用到 @Insert
注解。
@Insert("insert into userinfo (username, `password`, age, gender, phone)" +"values (#{username}, #{password}, #{age}, #{gender}, #{phone})")
public Integer insert(UserInfo userInfo);
@Test
void insert() {UserInfo userInfo = new UserInfo();userInfo.setUsername("小美");userInfo.setPassword("小美");userInfo.setAge(18);userInfo.setGender(2);userInfo.setPhone("3139812381");int ret = userInfoMapper.insert(userInfo);log.info(ret + "行被更新");
}
这里可以选择将插入的数据封装成Java对象作为参数传入,也可以将这每个些信息当成一个参数进行传递。当以Java对象的形式作为参数进行传递的话,Java对象中的属性名需要保持和数据库中的列名相同,因为当传递的参数是对象的话,MyBatis 会进入到这个对象中,查看这个对象中的属性,然后与数据库中的列名做比较,如果相同就将Java对象中属性的值代入 SQL 语句中,不相同则不带入。
返回主键
Insert 语句默认返回的是受影响的行数,如果我们需要只需要将方法的返回类型声明为 int/Integer 就可以了,如果不需要,就将方法的返回类型声明为 void。
但是有些时候,我们不仅仅需要 insert 语句影响的行数,可能还需要获取到其他的信息,比如自增主键的值,那么我们如何获取到 insert 之后自增主键的值呢?如果我们直接拿到Java对象中与自增主键列同名的属性,能拿到吗?
log.info(ret + "行被更新" + userInfo.getId());
按理来说这个自增主键应该是 5 了,但是拿到的确实 0,说明这个还是初始值,那么应该进行什么操作才能拿到这个 insert 的一行的自增主键的值呢?
如果想要拿到自增主键的值,需要在 Mapper 接口的方法上添加一个 @Options
注解。
@Options(useGeneratedKeys = true, keyProperty = "id")
@Insert("insert into userinfo (username, `password`, age, gender, phone)" +"values (#{username}, #{password}, #{age}, #{gender}, #{phone})")
public Integer insert(UserInfo userInfo);
- useGeneratedKeys:这会令 MyBatis 使⽤ JDB 的 getGeneratedKeys ⽅法来取出由数据库内部⽣成的主键(⽐如:像 MySQL 和 SQL Server 这样的关系型数据库管理系统的⾃动递增字段),默认值:false
- keyProperty:指定能够唯⼀识别对象的属性,MyBatis 会使⽤ getGeneratedKeys 的返回值或 insert 语句的 selectKey ⼦元素设置它的值,默认值:未设置(unset)
useGeneratedKeys 参数是是否需要使用到自增主键,然后 keyProperty 参数表示将获取到的自增主键的值赋值给 Java 的哪个属性,因为这里我们传递的参数是 Java 对象,所以当获取到 insert 插入的那行的自增主键赋值给 id 之后,MyBatis 就会去这个对象的属性去找有没有 id 这个属性,如果有就赋值给它。如果传递的参数是多个普通类型参数的话,那么 MyBatis 就会在这些传递的参数中找,看是否有相同名称的参数,然后赋值给它。
因为我这里为大家演示的时候,多次插入了,所以获取到的自增主键的值是8,这影响不大,我们关键看是否 insert 插入的这行的自增主键赋值给了 userInfo 对象中的 id 属性。
如果传递的是对象,并且在接收参数的时候对这个参数进行了重命名的话,SQL 中的 #{} 参数就需要指定是哪个引用的哪个属性。
@Options(useGeneratedKeys = true, keyProperty = "id")
@Insert("insert into userinfo (username, `password`, age, gender, phone)" +"values (#{user.username}, #{user.password}, #{user.age}, #{user.gender}, #{user.phone})")
public Integer insert(@Param("user") UserInfo userInfo);
MyBatis 删除操作
使用 MyBatis 进行删除数据的操作需要使用到 @Delete
注解。
@Delete("delete from userinfo where id=#{id}")
public void delete(Integer id);
@Test
void delete() {userInfoMapper.delete(1);
}
MyBatis 修改操作
MyBatis 实现修改操作需要使用到 @Update
注解。
@Update("update userinfo set gender=#{gender} where id=#{id}")
public void update(Integer gender, Integer id);
@Test
void update() {userInfoMapper.update(0, 8);
}
MyBatis 查找操作
查询操作不就是 select
吗,还有什么需要讲的吗?
通过前面的查询我们可以发现,我们 Java 的 userInfo 对象中的 deleteFlag createTime updateTime
都是初识值,也就是说,这些属性并没有被赋值,那么这是为什么呢?我的 select SQL 语句不是查询出结果了吗?
还记得我们前面说了什么吗?需要保证 Java 中的属性名和数据库表中的列名保持一致,因为当 select 查询出结果之后,MyBatis 会根据方法的返回值类型,如果是普通类型的话,并且 select 查询出来的结果的类型和方法返回值的类型相同的话,那么就会直接将这个查询出来的结果进行返回;但是如果方法返回值的类型是 Java 对象的话,MyBatis 会将查询出来的结果按照列名与 Java 对象中的属性名进行匹配,如果相同就赋值给这个属性,没有相同的属性名,那么 Java 对象的这个属性就是初始值。
虽然保证数据库表中的列名和 Java 对象中的属性名保持一致很重要,但是由于 SQL 和 Java 的变量名命名规则和习惯存在差异,比如:在 SQL 中,deletflg 就是这样表示——delete_flag,而在 Java 中是以小驼峰的习惯进行命名,也就是——deleteFlag,那么这样的话,就无法保证名称一致了,那么这样该怎么办呢?有三种解决方法:
1. 对查询结果进行别名
前面我们学习 SQL 的时候肯定学过对查询结果进行重命名吧,我们可以将列名与Java属性名不相同的列进行重命名。
@Select("select id, username, password, age, gender, delete_flag as deleteFlag," +"create_time as createTime, update_time as updateTime from userinfo")
public List<UserInfo> selectAll1();
@Test
void selectAll1() {List<UserInfo> list = userInfoMapper.selectAll1();log.info(list.toString());
}
2. @Results注解
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Results {String id() default "";Result[] value() default {};
}
@Results 注解的参数有两个,一个是 String 类型,这个参数的用法稍后给大家讲,第二个参数就是 Result[] 一个数组,数组中的每个元素都是一个 Result 类型,而 Result 中也有很多参数,但是这里我们主要用到两个:
@Results(value = {@Result(column = "delete_flag", property = "deleteFlag"),@Result(column = "create_time", property = "createTime"),@Result(column = "update_time", property = "updateTime")})
@Select("select id, username, password, age, gender, delete_flag," +"create_time, update_time from userinfo")
public List<UserInfo> selectAll2();
@Test
void selectAll2() {List<UserInfo> list = userInfoMapper.selectAll1();log.info(list.toString());
}
如果我们又想根据给定的 id 进行查询的话,因为表的列名和Java的属性名不同,那么是否又需要写跟上面一样的 @Results
注解吗?不是的,这就需要用到 @Results 注解的第一个参数了,通过指定 @Results 的第一个参数,可以使得这个 @Results 注解可以重复使用。
@Results(id = "BaseMap", value = {@Result(column = "delete_flag", property = "deleteFlag"),@Result(column = "create_time", property = "createTme"),@Result(column = "update_time", property = "updateTime")
})
如果后面的方法也想使用和这个 @Results 注解相同的配置的话,只需要在方法上加上 @ResultMap
注解就可以了。
@ResultMap("BaseMap")
@Select("select id, username, password, age, gender, delete_flag," +"create_time, update_time from userinfo where id=#{id}")
public UserInfo getById2(Integer id);
这个 @ResultMap 中的参数需要保证和 @Results 注解中的第一个参数 id 的值保持一致才可以使用该 @Results 的相同配置。
3. 开启驼峰命名(推荐)
通常数据库列使⽤蛇形命名法进⾏命名(下划线分割各个单词),⽽ Java 属性⼀般遵循驼峰命名法约定。为了在这两种命名⽅式之间启⽤⾃动映射,需要将 mapUnderscoreToCamelCase 设置为 true。
mybatis:configuration:map-underscore-to-camel-case: true #配置驼峰⾃动转换
当在配置文件添加这个配置之后,我们再试一次看看结果:
@Select("select * from userinfo")
public List<UserInfo> selectAll3();
@Test
void selectAll3() {List<UserInfo> list = userInfoMapper.selectAll3();log.info(list.toString());
}
可以发现通过在配置文件中添加配置从而解决 SQL 和 Java 命名规则不同而导致的问题非常的方便,所以也建议大家使用这个做法。
XML 配置文件方法书写 MyBatis
配置数据库的相关配置
不管使用什么方法书写 MyBatis,首先就是需要配置数据库相关的信息,这里 XML 配置数据库信息的方式跟注解配置数据库的方式是一样的,我这里就不过多介绍了。
# 数据库连接配置
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=falseusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driver
指定XML的文件路径
当配置完成数据库相关配置之后,还需要指定我们的 MyBatis XML 的文件路径。
mybatis:mapper-locations: classpath:mapper/**Mapper.xml
这个路径在我们的项目中这样显示:
classpath 就是我们项目的 resources 文件夹,mapper 是我们自己创建的用来操作 MyBatis 的文件夹,这个文件夹中存放的都是 xml 文件,而这个配置中的 **Mapper.xml
则表示所有以 Mapper.xml 结尾的文件,如果想表示以 .xml
结尾的文件,则用 **.xml
来表示。通常我们的操作 MyBatis 的 XML 文件都是以 Mapper.xml 作为后缀。这里的 mapper
文件夹和 **Mapper.xml
都是程序员自定义的,只要能够对上就可以了。
xml 实现
首先我们需要在 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 <mapper namespace="com.example.mybatis20231226.Mapper.UserInfoXMLMapper"></mapper>
这里 namespace 中的值是我们的要实现的接口的全限定类名。
这里的接口就正常写,主要的操作在我们的 xml 文件中。
package com.example.mybatis20231226.Mapper;import com.example.mybatis20231226.Model.UserInfo;
import org.apache.ibatis.annotations.Mapper;import java.util.List;@Mapper
public interface UserInfoXMLMapper {public List<UserInfo> selectAll();
}
后面的实现就是写在 <mapper>
标签中的,假设我们这里还是查询,就可以这样写:
<mapper namespace="com.example.mybatis20231226.Mapper.UserInfoXMLMapper"><select id="selectAll" resultType="com.example.mybatis20231226.Model.UserInfo">select * from userinfo</select>
</mapper>
id 参数指定要实现的接口中的方法名称,resultType 指定该方法的返回的数据的类型的路径,这里不是 List,而是 List 中的元素的类型 UserInfo。
@Slf4j
@SpringBootTest
class UserInfoXMLMapperTest {@Autowiredprivate UserInfoXMLMapper userInfoXMLMapper;@Testvoid selectAll() {List<UserInfo> list = userInfoXMLMapper.selectAll();log.info(list.toString());}
}
增加操作
public Integer insert(UserInfo userInfo);
<insert id="insert">insert into userinfo (username, password, age, gender, phone)values(#{username}, #{password}, #{age}, #{gender}, #{phone})
</insert>
@Test
void insert() {UserInfo userInfo = new UserInfo();userInfo.setUsername("小帅");userInfo.setPassword("小帅");userInfo.setAge(28);userInfo.setGender(1);userInfo.setPhone("31737137128");int ret = userInfoXMLMapper.insert(userInfo);log.info(ret + "被更新");
}
获取插入数据的自增主键
要想获取到插入数据的自增主键,需要在 <insert>
标签中配置 userGenerateKeys
参数和 keyProperty
参数。
<insert id="insert" useGeneratedKeys="true" keyProperty="id">insert into userinfo (username, password, age, gender, phone)values(#{username}, #{password}, #{age}, #{gender}, #{phone})
</insert>
别名
xml 别名的操作和使用注解的操作是类似的。
public Integer insert(@Param("user") UserInfo userInfo);
<insert id="insert" useGeneratedKeys="true" keyProperty="id">insert into userinfo (username, password, age, gender, phone)values(#{user.username}, #{user.password}, #{user.age}, #{user.gender}, #{user.phone})
</insert>
删除操作
public void delete(Integer id);
<delete id="delete">delete from userinfo where id=#{id}
</delete>
@Test
void delete() {userInfoXMLMapper.delete(2);
}
修改操作
public void update(Integer gender, Integer id);
<update id="update">update userinfo set gender=#{gender} where id=#{id}
</update>
@Test
void update() {userInfoXMLMapper.update(0, 3);
}
查找操作
这里也是主要为了解决 SQL 命名规则和 Java 命名规则不同导致的问题,解决方法和通过注解是一样的。
1. 别名
public List<UserInfo> selectAll2();
<select id="selectAll2" resultType="com.example.mybatis20231226.Model.UserInfo">select id, username, password, age, gender, delete_flag as deleteFlag,create_time as createTime, update_time as updateTime from userinfo
</select>
@Test
void selectAll2() {List<UserInfo> list = userInfoXMLMapper.selectAll1();log.info(list.toString());
}
2. 定义 result
public List<UserInfo> selectAll1();
<resultMap id="XmlBaseMap" type="com.example.mybatis20231226.Model.UserInfo"><id column="id" property="id"></id><result column="delete_flag" property="deleteFlag"></result><result column="create_time" property="createTime"></result><result column="update_time" property="updateTime"></result>
</resultMap><select id="selectAll1" resultMap="XmlBaseMap">select * from userinfo
</select>
id标签用于标识主键列和Java对象的对应关系,<result>
标签则用于标识非主键列和Java对象的对应关系
@Test
void selectAll1() {List<UserInfo> list = userInfoXMLMapper.selectAll1();log.info(list.toString());
}
3. 开启驼峰命名
这个和前面注解的做法是一样的,都是在配置文件中讲驼峰转换的配置的值设置为 true 就可以了。
mybatis:configuration:map-underscore-to-camel-case: true #配置驼峰⾃动转换
相关文章:
【MyBatis】MyBatis基础操作
文章目录 前言注解方式书写 MyBatis打印 MyBatis 日志参数传递MyBatis 增加操作返回主键 MyBatis 删除操作MyBatis 修改操作MyBatis 查找操作1. 对查询结果进行别名2. Results注解3. 开启驼峰命名(推荐) XML 配置文件方法书写 MyBatis配置数据库的相关配…...
Automatic merge failed; fix conflicts and then commit the result.如何处理
当你在Git中遇到 “Automatic merge failed; fix conflicts and then commit the result.” 的错误时,这意味着你尝试合并两个分支时出现了冲突。Git无法自动解决这些冲突,因此需要你手动解决。以下是处理这种情况的步骤: 找出冲突文件: 运行…...
一文读懂 $mash 通证 “Fair Launch” 规则(幸运池玩法解读篇)
Solmash 是 Solana 生态中由社区主导的铭文资产 LaunchPad 平台,该平台旨在为 Solana 原生铭文项目,以及通过其合作伙伴 SoBit 跨链桥桥接到 Solana 的 Bitcoin 生态铭文项目提供更广泛的启动机会。有了 Solmash,将会有更多的 Solana 生态的铭…...
Qt3D QGeometryRenderer几何体渲染类使用说明
Qt3D中的QGeometryRenderer派生出来的几何体类包括: Qt3DExtras::QConeMesh, Qt3DExtras::QCuboidMesh, Qt3DExtras::QCylinderMesh, Qt3DExtras::QExtrudedTextMesh, Qt3DExtras::QPlaneMesh, Qt3DExtras::QSphereMesh, Qt3DExtras::QTorusMesh, and Qt3DRender::QMesh 有球…...
pandasDataFrame读和写csv文件
从.csv文件读数据 import pandas as pd# 从CSV文件中读取数据 train_df pd.read_csv("datasets/train01.csv") val_df pd.read_csv("datasets/val01.csv") test_df pd.read_csv("datasets/test01.csv")# 显示数据框的前几行,确保…...
力扣122. 买卖股票的最佳时机 II
动态规划 思路: 假设 dp[i][0] 是第 i 天手上没有股票时的最大利润, dp[i][1] 是第 i 天手上有 1 支股票的最大利润;dp[i][0] 的迁移状态为: dp[i - 1][0],前一天手上已经没有股票,没有发生交易࿱…...
Go语言断言和类型查询
Go语言断言和类型查询 1、类型断言 类型断言(Type Assertion)是一个使用在接口值上的操作,用于检查接口类型变量所持有的值是否实现了期望的接 口或者具体的类型。 在Go语言中类型断言的语法格式如下: // i.(TypeNname) value, ok : x.(T)其中&…...
02 Deep learning algorithm
Neural Networks target: inference(prediction)training my own modelpractical advice for building machine learning systemdecision Tress application: speech(语音识别) ----> images(计算机视觉)—> t…...
代码随想录算法训练营第二十四天 | 回溯算法
理论基础 代码随想录原文 什么是回溯法 回溯也可以叫做回溯搜索法,它是一种搜索的方式。 回溯是递归的副产品,只要有递归就会有回溯。 回溯法的效率 虽然回溯法很难,不好理解,但是回溯法并不是什么高效的算法。因为回溯的本…...
Spring Cloud Gateway 缓存区异常
目录 1、问题背景 2、分析源码过程 3、解决办法 最近在测试环境spring cloud gateway突然出现了异常,在这里记录一下,直接上干货 1、问题背景 测试环境spring cloud gateway遇到以下异常 DataBufferLimitException: Exceeded limit on max bytes t…...
Spring Boot依赖版本声明
链接 官网 Spring Boot文档官网:https://docs.spring.io/spring-boot/docs/https://docs.spring.io/spring-boot/docs/ Spring Boot 2.0.7.RELEASE Spring Boot 2.0.7.RELEASE reference相关:https://docs.spring.io/spring-boot/docs/2.…...
Java项目:109SpringBoot超市仓管系统
博主主页:Java旅途 简介:分享计算机知识、学习路线、系统源码及教程 文末获取源码 一、项目介绍 超市仓管系统基于SpringBootMybatis开发,系统使用shiro框架做权限安全控制,超级管理员登录系统后可根据自己的实际需求配角色&…...
【React系列】Redux(三) state如何管理
本文来自#React系列教程:https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. reducer拆分 1.1. reducer代码拆分 我们来看一下目前我们的reducer: function reducer(state ini…...
3D 纹理的综合指南
在线工具推荐:3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 我们经常看到超现实主义的视频游戏和动画电影角色出现在屏幕上。他们皮肤上的…...
LLM之RAG实战(十一)| 使用Mistral-7B和Langchain搭建基于PDF文件的聊天机器人
在本文中,使用LangChain、HuggingFaceEmbeddings和HuggingFace的Mistral-7B LLM创建一个简单的Python程序,可以从任何pdf文件中回答问题。 一、LangChain简介 LangChain是一个在语言模型之上开发上下文感知应用程序的框架。LangChain使用带prompt和few-…...
VLOOKUP的使用方法
VLOOKUP是Excel中一个非常有用的函数,用于在一个表格或范围中查找某个值,并返回该值所在行或列的相应数据。 VLOOKUP函数的基本语法如下: VLOOKUP(lookup_value, table_array, col_index_num, [range_lookup])lookup_value:要查…...
数据加密、端口管控、行为审计、终端安全、整体方案解决提供商
PC端访问地址: https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 以下是关于这几个概念的解释: 数据加密:这是一种通过加密算法和密钥将明文转换为密文,以及通过解密算法和解密密钥将密文恢复为明文…...
编码器原理详解
编码器 什么是编码器 编码器可以用来将信息编码成为二进制代码,有点类似于取代号,人为的将二进制代码与对应的信息联系起来。 如下图所示: 假设有这三种情况会发生,且每次只发生一种情况 为了给这三种情况做一个区分ÿ…...
linux下docker搭建mysql8
1:环境信息 centos 7,mysql8 安装docker环境 2.创建mysql容器 2.1 拉取镜像 docker pull mysql:8.0.23 2.2 查询镜像拉取成功 docker images 2.3 创建挂载的目录文件 mkdir /usr/mysql8/conf mkdir /usr/mysql8/data ##给data文件赋予操作权限 chmod 777 /…...
书生·浦语大模型实战1
书生浦语大模型全链路开源体系 视频链接:书生浦语大模型全链路开源体系_哔哩哔哩_bilibili 大模型之所以能收到这么高的关注度,一个重要原因是大模型是发展通用人工智能的重要途径 深度信念网络: (1)又被称为贝叶斯网…...
前端JS加密对抗由浅入深-1
前言: 本文主要讲解,针对前端加密数据传输站点,如何进行动态调试以获取加密算法、秘钥,本次实验不涉及漏洞挖掘,仅为学习演示,环境为本地搭建环境 此次站点加密方式为AES加密方式,现如今越来越…...
八股文打卡day17——计算机网络(17)
面试题:拥塞控制是怎么实现的? 我的回答: 1.慢启动 在连接刚建立的时候,会缓慢调大滑动窗口的大小,从而加大网络传输速率,避免速率太快,造成拥塞。 2.拥塞避免 慢启动之后,会进入拥…...
Java-经典算法-logcat获取数据
1 需求 2 语法 3.1 示例:打印本次查询数据 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader;/*** 功能:adb logcat -b main -s PRIVA_LOG -d*/ public class Test {public …...
APache 网页优化
技能目标: 掌握 Apache 网页压缩 掌握 Apache 网页缓存 掌握 Apache 网页防盗链 掌握 Apache 隐藏版本信息 4.1 网页压缩与缓存 在使用 Apache 作为 Web 服务器的过程中,只有对 Apache 服务器进行适当的优化配 置&…...
C语言实现关键字匹配算法(复制即用)
文章目录 前言功能要求运行截图全部代码 前言 无套路,均已上机通过,求个关注求个赞,提供答疑解惑服务。 功能要求 一份C源代码存储在一个文本文件中,请统计该文件中关键字出现的频度,并按此频度对关键字进行排序。要…...
【大数据】安装 Zookeeper 单机版
安装 Zookeeper 单机版 下面安装 Zookeeper,由于它是 Apache 的一个顶级项目,所以域名是 zookeeper.apache.org,所有 Apache 的顶级项目的官网都是以项目名 .apache.org 来命名的。 点击 Download 即可下载,这里我们选择的版本是 …...
Django 快速整合 Swagger:实用步骤和最佳实践
Django ,作为 Python 编写的一个优秀的开源 Web 应用框架,特别适用于快速开发的团队。对于很多场景来说,我们需要一份 API 文档,好处实在太多了: 提高开发效率:开发者可以基于 API 文档 快速学习和尝试 AP…...
C++ cstdio
头文件 <cstdio> 是 C 中的标准输入输出库(C Standard Input and Output Library)头文件,它提供了一系列的输入输出函数。以下是其中一些主要的函数: 输入函数: scanf: 格式化输入函数,用于从标准输入…...
昇腾多卡通信教程【配置网络检测对象IP】
无法通信会出现的错误如下 一、网络健康状态报错 命令原型 hccn_tool [-i %d] -netdetect -s [address %s]命令功能 本功能支持用户执行命令获取网络健康状态(本端与所配置的检测IP之间的连通状态),用户可指定上报的状态信息名称。 状态信…...
PKI 公钥基础设施,公钥私钥,信息摘要,数字签名,数字证书
PKI 公钥基础设施 https 基于 PKI 技术。PKI(Public Key Infrastructure,公钥基础设施)是一种安全体系结构,用于管理数字证书和密钥对,以确保安全的数据传输和身份验证。PKI 采用了公钥加密技术,其中每个实…...
新网站怎样做推广/2024北京又开始核酸了吗今天
小程序的消息推送很简单,主要把几个步骤理清就好了。 在小程序的微信开发平台上配置服务器前端传递必要参数后端实现推送功能 下发条件说明 支付 当用户在小程序内完成过支付行为,可允许开发者向用户在7天内推送有限条数的模板消息(1次支付…...
营销型网站./新媒体
基于MQTT协议的消息传输为什么MQTT?之前刚写了一篇关于socket的文章,为什么又来一个MQTT?因为MQTT协议就是socket接口实现的啊(socket和MQTT只是层级不一样而已),并且感觉发布/订阅模式非常棒,于…...
win10建站wordpress/今日热点新闻事件摘抄
点击“运行”,在子菜单中选择“运行”。1、在运行窗口中输入:cmd /k javac "$(FULL_CURRENT_PATH)" & echo 编译成功! & PAUSE & EXIT点击保存后,在弹出的窗口中设置名称:取名为JAVA编译2、重复…...
html学校网站模板/seo优化技术排名
国密算法 国密即国家密码局认定的国产密码算法,即商用密码。 国密算法是国家密码局制定标准的一系列算法。其中包括了对称加密算法,椭圆曲线非对称加密算法,杂凑算法。具体包括SM1,SM2,SM3等,其中: SM2为国家密码管理…...
网站如何做链接/热搜榜排名今日
嗨喽,大家好!我是舌尖尝美食,“尝遍人间百味,每样都很对胃”,每天亲手为家人做美食,享受健康美味的食物,今天分享给大家的是一道“腌芥菜”,喜欢这道菜的朋友欢迎关注我。导语&#…...
深圳 高端网站建设宝安/优化关键词规则
PV操作的核心就是 PV操作可以同时起到同步与互斥的作用。 1.同步就是通过P操作获取信号量,V操作释放信号量来进行。 2.互斥其实就是,同时操作P操作,结束后进行V操作即可做到。 Java上实现PV操作可以通过Semaphore来实现。 package com.multit…...