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

Mybatis 框架 ( 一 ) 基本步骤

1.概念

1.1.什么是Mybatis框架

(1)Mybatis是一个半ORM(Object Relation Mapping 对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直接编写原生态sql,可以严格控制sql执行性能,灵活度高。

(2)MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

(3)通过xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。(从执行sql到返回result的过程)

1.2.Mybatis框架与JDBC区别

两者都是持久化的技术

连接数据库时 : mybatis 使用了 连接池技术 , 而jdbc需要自己写

持久化操作时 : mybatis 在映射文件中集中管理SQL语句 , 并且支持动态SQL
通常使用Mapper接口封装成面向对象的语法
而JDBC中的SQL是以参数的形式传入

结果集封装 : mybatis 封装了过程 , 只要指明对应结构就可以 , 而JDBC全手动

1.3.Mybatis框架与Hibernate框架区别

Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。

而Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具。

2.步骤

在这里插入图片描述

相较于JDBC来说, Mybatis完成持久化操作也分4个步骤, 需要七个参数

4个步骤 : 连接数据库, 持久化操作, 结果集封装, 释放资源

7个参数 : 驱动类路径, 连库信息, 用户名, 密码, SQL语句, SQL参数, 结果集封装结构

2.0.在idea中创建 Maven项目

2.1.依赖包

通过Maven 导入依赖, 同时导入 MySQL数据库的驱动依赖

    <dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.7</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.21</version></dependency>

2.2.增加配置文件( 4/7参数 )

在 resources 文件夹中增加Mybatis的配置文件 mybatis-config.xml

在文件中 指明连接数据库的 4 个信息 驱动类路径, url, 用户名, 密码

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><environments default="development"><environment id="development"><transactionManager type="JDBC"></transactionManager><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/metamooc"  /><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments></configuration>

2.3.连接数据库( 1/4 操作)

建立一个操作类, 增加连接数据库代码

  // 读取myBatis的配置文件Reader reader = Resources.getResourceAsReader("mybatis-config.xml");// 创建SessionFactory工厂 与数据库建立 连接  connSqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);

2.4.Mapper映射 ( 3/7 参数 , 1/4 操作)

2.4.1.实体类Entity

实体类Entity 用于封装数据, 通常与数据库的表对应 , 这里以 Teacher为例

import java.io.Serializable;
import java.util.Date;/*** 教师  teacher* @TableName teacher*/public class Teacher implements Serializable {/*** 讲师主键*/private Integer tchId;/*** 讲师姓名*/private String tchName;/*** 讲师介绍*/private String tchInfo;/*** 讲师性别*/private Integer tchSex;/*** 讲师注册时间*/private Date tchRegTime;/*** 讲师头像*/private String tchPic;/*** 登录账号*/private String tchUser;/*** 登录密码*/private String tchPass;@Overridepublic String toString() {return "Teacher{" +"tchId=" + tchId +", tchName='" + tchName + '\'' +", tchInfo='" + tchInfo + '\'' +", tchSex=" + tchSex +", tchRegTime=" + tchRegTime +", tchPic='" + tchPic + '\'' +", tchUser='" + tchUser + '\'' +", tchPass='" + tchPass + '\'' +'}';}public Integer getTchId() {return tchId;}public void setTchId(Integer tchId) {this.tchId = tchId;}public String getTchName() {return tchName;}public void setTchName(String tchName) {this.tchName = tchName;}public String getTchInfo() {return tchInfo;}public void setTchInfo(String tchInfo) {this.tchInfo = tchInfo;}public Integer getTchSex() {return tchSex;}public void setTchSex(Integer tchSex) {this.tchSex = tchSex;}public Date getTchRegTime() {return tchRegTime;}public void setTchRegTime(Date tchRegTime) {this.tchRegTime = tchRegTime;}public String getTchPic() {return tchPic;}public void setTchPic(String tchPic) {this.tchPic = tchPic;}public String getTchUser() {return tchUser;}public void setTchUser(String tchUser) {this.tchUser = tchUser;}public String getTchPass() {return tchPass;}public void setTchPass(String tchPass) {this.tchPass = tchPass;}
}

2.4.2.Mapper接口

对 要执行的SQL 进行抽象声明

import com.yuan.mybatis.entity.Teacher;import java.util.List;/**
* @description 针对表【teacher(教师  teacher)】的数据库操作Mapper
* @Entity com.yuan.mybatis.entity.Teacher
*/
public interface TeacherMapper  {/***  全查*/List<Teacher> selectList();/*** 添加*/int insert(Teacher teacher);/*** 修改*/int updateById(Teacher teacher);/*** 根据id 删除记录*/int removeById(Integer id);/*** 根据id 查询一条记录*/Teacher selectOneById(Integer tchId);/*** 查询指定表的记录数*/int selectCount(String tabName);/*** 根据tch_user, tch_pass 查询一条记录*/Teacher selectOneByUserNameAndPassword(@Param("userName") String name, @Param("password") String pass);}

2.4.3. ***映射文件

在 resources 文件夹下 mapper 文件夹中 增加 Mapper接口对应的映射文件 TeacherMapper.xml

其中(重点) :

2.4.3.1. namespace

根结点 mapper 的 namespace 属性 指向 Mapper 接口

<mapper namespace="com.yuan.mybatis.mapper.TeacherMapper">

2.4.3.2.resultMap

<resultMap> 结点 与 Entity 实体类 对应 , 通过 type 属性 对应类的路径

<id> 对应 主键 字段, <result> 为普通字段

property 对应 实体类的属性名 , column 对应 字段名 , jdbcType 对应类型(这个可以不写)

    <resultMap id="BaseResultMap" type="com.yuan.mybatis.entity.Teacher"><id property="tchId" column="tch_id" jdbcType="INTEGER"/><result property="tchName" column="tch_name" jdbcType="VARCHAR"/><result property="tchInfo" column="tch_info" jdbcType="VARCHAR"/><result property="tchSex" column="tch_sex" jdbcType="BOOLEAN"/><result property="tchRegTime" column="tch_reg_time" jdbcType="TIMESTAMP"/><result property="tchPic" column="tch_pic" jdbcType="VARCHAR"/><result property="tchUser" column="tch_user" jdbcType="VARCHAR"/><result property="tchPass" column="tch_pass" jdbcType="VARCHAR"/></resultMap>

2.4.3.3.SQL语句

<insert> , <delete> , <update> , <select> 是用来编写 对应SQL 语句

id 与 Mapper接口 中声明的 方法名 对应

#{属性} 在SQL语句中作属性占位符, 执行时替换成对应值, 值是从Mapper接口传入的参数对应

​ 如果传入是实体类, 属性取类的属性

 <update id="updateById" parameterType="com.yuan.mybatis.entity.Teacher">update teacherset tch_name = #{tchName},tch_info = #{tchInfo},tch_sex = #{tchSex},tch_reg_time = #{tchRegTime},tch_pic = #{tchPic},tch_user = #{tchUser},tch_pass = #{tchPass}where tch_id = #{tchId}</update>

​ 如果传入是单个值, 可以用类型如: list , array , id 等, 或者与参数名相同

    <delete id="removeById" parameterType="java.lang.Integer">delete from teacherwhere tch_id = #{id}</delete>

​ 如果传入多个参数 , 对应的方法有多种, 推荐在传参时使用@Param("别名") 进行标注(这个可以不写)

    <select id="selectOneByUserNameAndPassword"  resultMap="BaseResultMap">select<include refid="Base_Column_List" />from teacherwhere  tch_user = #{userName} and tch_pass = #{password}limit 1</select>

${值} 也是属性占位符, 直接替换为实际的参数值, 没有预编译效果,

​ 只用于与参数无关的字符类型数据, 所以代表字符串时要用 单引号包围起来 '${}'

​ #{} 只能以预编译的形式为属性赋值 , 而 ${} 可以替代SQL语句中的表名, 字段名等结构信息

    <select id="selectCount" resultType="java.lang.Integer" >select count(*)from ${tabName}</select>

2.4.3.4.delete, update

<delete> , <update> 这两个结点是用来编写 删除, 更新 对应SQL语句的

parameterType 属性 指明传入参数类型(这个可以不写)

 <update id="updateById" parameterType="com.yuan.mybatis.entity.Teacher">update teacherset tch_name = #{tchName},tch_info = #{tchInfo},tch_sex = #{tchSex},tch_reg_time = #{tchRegTime},tch_pic = #{tchPic},tch_user = #{tchUser},tch_pass = #{tchPass}where tch_id = #{tchId}</update>

2.4.3.5.insert

<insert> 用于编写插入SQL语句

​ 通常MySQL数据库主键设置成 自增长, 在添加之前不知道具体值, 通过下面的三个属性, 在添加完成后立刻可以通过实体类得到值

keyColumn=“主键字段” keyProperty=“对应实体类属性” useGeneratedKeys=“使用生成的主键, 选 : true”

   <insert id="insert" keyColumn="tch_id" keyProperty="tchId"parameterType="com.yuan.mybatis.entity.Teacher" useGeneratedKeys="true">insert into teacher (tch_name, tch_info, tch_sex,tch_reg_time, tch_pic, tch_user,tch_pass)values (#{tchName}, #{tchInfo}, #{tchSex},#{tchRegTime}, #{tchPic}, #{tchUser}, #{tchPass})</insert>

2.4.3.6.SQL片段

<sql> 编写 可复用的SQL语句片段,

​ 在其它语句中 通过 <include> 进行引入 refidid 属性对应

  <sql id="Base_Column_List">tch_id,tch_name,tch_info,tch_sex,tch_reg_time,tch_pic,tch_user,tch_pass</sql><select id="selectList" resultMap="BaseResultMap" >select <include refid="Base_Column_List"/>from teacher</select>

2.4.3.7.select

<select> 用于编写查询SQL语句 , 通过 指定返回值类型完成结果集封装

resultMap 属性 是用于指明返回的实体类 , 与 <resultMap> 结点的 id 属性对应

    <select id="selectOneById" parameterType="java.lang.Integer" resultMap="BaseResultMap">select<include refid="Base_Column_List" />from teacherwhere tch_id = #{tchId}</select>

resultType属性 也是用于指明返回值类型, 用于指明除 实体类以外的通用类型

    <select id="selectCount" resultType="java.lang.Integer" >select count(*)from ${tabName}</select>

2.4.3.8.完整文件

<?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.yuan.mybatis.mapper.TeacherMapper"><resultMap id="BaseResultMap" type="com.yuan.mybatis.entity.Teacher"><id property="tchId" column="tch_id" jdbcType="INTEGER"/><result property="tchName" column="tch_name" jdbcType="VARCHAR"/><result property="tchInfo" column="tch_info" jdbcType="VARCHAR"/><result property="tchSex" column="tch_sex" jdbcType="BOOLEAN"/><result property="tchRegTime" column="tch_reg_time" jdbcType="TIMESTAMP"/><result property="tchPic" column="tch_pic" jdbcType="VARCHAR"/><result property="tchUser" column="tch_user" jdbcType="VARCHAR"/><result property="tchPass" column="tch_pass" jdbcType="VARCHAR"/></resultMap><sql id="Base_Column_List">tch_id,tch_name,tch_info,tch_sex,tch_reg_time,tch_pic,tch_user,tch_pass</sql><select id="selectList" resultMap="BaseResultMap" >select <include refid="Base_Column_List"/>from teacher</select><select id="selectOneById" parameterType="java.lang.Integer" resultMap="BaseResultMap">select<include refid="Base_Column_List" />from teacherwhere tch_id = #{tchId}</select><select id="selectCount" resultType="java.lang.Integer" >select count(*)from ${tabName}</select><delete id="removeById" parameterType="java.lang.Integer">delete from teacherwhere tch_id = #{id}</delete><insert id="insert" keyColumn="tch_id" keyProperty="tchId"parameterType="com.yuan.mybatis.entity.Teacher" useGeneratedKeys="true">insert into teacher (tch_name, tch_info, tch_sex,tch_reg_time, tch_pic, tch_user,tch_pass)values (#{tchName}, #{tchInfo}, #{tchSex},#{tchRegTime}, #{tchPic}, #{tchUser}, #{tchPass})</insert><update id="updateById" parameterType="com.yuan.mybatis.entity.Teacher">update teacherset tch_name = #{tchName},tch_info = #{tchInfo},tch_sex = #{tchSex},tch_reg_time = #{tchRegTime},tch_pic = #{tchPic},tch_user = #{tchUser},tch_pass = #{tchPass}where tch_id = #{tchId}</update></mapper>

2.4.4.在配置文件中声明

在 Mybatis的主配置文件中, 增加映射文件的声明

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><environments default="development"><environment id="development"><transactionManager type="JDBC"></transactionManager><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/metamooc"  /><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><!-- 映射声明 --><mappers><mapper resource="mapper/TeacherMapper.xml"></mapper></mappers>
</configuration>

2.5.持久化操作( 1/4 操作)

持久化操作先要得到 SqlSession实例,

再得到Mapper接口的实例,

// 取出一个session 得到对数据持久化操作的句柄  stmt
SqlSession session = sqlSessionFactory.openSession();
// 通过session得到Mapper, 再通过 Mapper对象调用方法完成持久化操作
TeacherMapper teacherMapper = session.getMapper(TeacherMapper.class);

通过实例调用方法完成持久化操作 如:

// 插入数据 
int insert = teacherMapper.insert(teacher);
// 查询数据List<Teacher> list = teacherMapper.selectList();

2.5.1.事务提交

进行 插入数据, 修改数据, 删除数据时 要手动处理事务

如果操作没有问题 提交事务, 出现问题 事务回滚

// 提交
session.commit();
// 或者 回滚       
session.rollback();

2.6.释放资源(1/4 操作)

由于 连接数据库时 使用连接池, 所以只需要释放session实例

// 关闭 session
session.close();

相关文章:

Mybatis 框架 ( 一 ) 基本步骤

1.概念 1.1.什么是Mybatis框架 &#xff08;1&#xff09;Mybatis是一个半ORM&#xff08;Object Relation Mapping 对象关系映射&#xff09;框架&#xff0c;它内部封装了JDBC&#xff0c;开发时只需要关注SQL语句本身&#xff0c;不需要花费精力去处理加载驱动、创建连接、…...

【华为OD机试真题】We Are A Team(C++javapython)100%通过率 超详细代码注释 代码优化

We Are A Team 题目描述: 总共有n个人在机房,每个人有一个标号(1<=标号<=n) ,他们分成了多个团队,需要你根据收到的m条消息判定指定的两个人是否在 一个团队中,具体的: 1、消息构成为abc,整数a、b分别代表两个人的标号,整数C代表指令 2、c = = 0 代表a和b在一…...

Oracle_Workflow_Builder工作流工具(一)

简介 目标WORKFLOW是oracle 公司的一个标准产品&#xff0c;它通过图形化的方式来表达业务处理过程。用户使用工作流可以灵活地定义或更改流程的结构。WORKFLOW是建立在数据库基础上的一个应用&#xff0c;它由后台的数据对象和前台的客户端程序组成。本文档主要介绍工作流的基…...

JavaWeb学习--RequestResponse

目录 JavaWeb学习--Request&Response 1&#xff0c;Request和Response的概述 request:获取请求数据 response:设置响应数据 **小结** 2&#xff0c;Request对象 **小结** 2.2 Request获取请求数据 **小结** 2.4 请求参数中文乱码问题 URL编码 2.5 Request请求转…...

Linux cat 命令

cat&#xff08;英文全拼&#xff1a;concatenate&#xff09;命令用于连接文件并打印到标准输出设备上。 使用权限 所有使用者 语法格式 cat [-AbeEnstTuv] [--help] [--version] fileName 参数说明&#xff1a; -n 或 --number&#xff1a;由 1 开始对所有输出的行数编…...

力扣sql中等篇练习(十四)

力扣sql中等篇练习(十四) 1 最后一个能进入电梯的人 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # 在表某一个范围内的可以考虑自连接的方式,注意连接的表只需要精准的字段 # 需要排序是因为它需要找到最后一个上车的用户 SELECT q1.person_name…...

什么是Spring FactoryBean?有什么作用?

1、什么是Spring Spring是分层的 Java SE/EE应用 full-stack 轻量级开源框架&#xff0c;以 IOC和AOP为内核。含有七大核心模块 2、Spring的七大模块 (1)Spring Core&#xff1a;核心容器提供了Spring的基本功能。核心容器的核心功能是用IOC 容器来管理类的依赖关系&#xff…...

Python List pop()方法

在Python中&#xff0c;列表&#xff08;list&#xff09;是一种有序的可变集合&#xff0c;可以包含任何数据类型的元素。列表对象提供了许多方法来处理列表中的元素&#xff0c;其中之一是pop()方法。 pop()方法用于从列表中移除并返回指定位置的元素。如果不指定位置&#…...

HJ51 输出单向链表中倒数第k个结点

写在前面&#xff1a; 做题环境如下&#xff1a; 题目渠道&#xff1a;牛客网 HJ51 输出单向链表中倒数第k个结点 华为机试题 编程语言&#xff1a;C 一、题目描述 描述 输入一个单向链表&#xff0c;输出该链表中倒数第k个结点&#xff0c;链表的倒数第1个结点为链表的尾指针…...

c#笔记-内置类型

内置类型 内置类型是一些有关键字表示的类型。关键字具有非常高的优先级&#xff0c;可以让你在没有别的配置的情况下&#xff0c; 只要用的是c#就可以使用。这也意味着这些类型是非常重要&#xff0c;或是基本的东西。 整数&#xff1a;byte, sbyte, short, ushort, int, ui…...

功能齐全的 DIY ESP32 智能手表设计之原理图讲解一

相关设计资料下载ESP32 智能手表带心率、指南针设计资料(包含Arduino源码+原理图+Gerber+3D文件).zip 目录 USB部分原理图讲解 供电部分原理图讲解 USB转串口原理图讲解...

8年测试经验分享,15K的测试工程师需要掌握那些知识?

软件测试行业是随着软件产业的发展而兴起的一个重要领域&#xff0c;目前处于快速发展阶段。以下是软件测试行业的现状&#xff1a; 人才需求增长&#xff1a;随着互联网、移动互联网、物联网等新技术的不断发展&#xff0c;软件测试人才需求呈现出快速增长的趋势。越来越多的…...

利用通信基础设施提高电网的稳态稳定性(Matlab代码实现)

目录 1 概述 2 稳态稳定性分析 2.1 系统模型 2.2 稳态稳定性 2.3 问题说明 3 仿真结果 4 Matlab代码 1 概述 随着电力系统的复杂性和规模的增加&#xff0c;电力系统的有效控制变得越来越困难。我们提出了一种自动控制策略&#xff0c;该策略基于通过通信基础设施获得的…...

MySQL 一条SQL语句是如何执行的?

总览 ​ 所以今天我们把MySQL拆解一下&#xff0c;看看里边有哪些零件。下边是MySQL的基本架构示意图。 大体来说&#xff0c;MySQL分为Server层和存储引擎两部分。 Server 层包括连接器、查询缓存、分析器、优化器、执行器等&#xff0c;涵盖 MySQL 的大多数核心服务功能&am…...

plt.imshow 全黑解决办法

# 标签有时候数据偏小&#xff0c;需要给赋予其他颜色方便可视化 image_file "/root/autodl-tmp/datasets/consep/labels/train/000.png"classes (background,Epithelial, Inflammatory, Spindle-Shaped, Miscellaneous) palette [[0, 0, 0], [129, 127, 38], [12…...

有趣的地理题

题目 总部位于上海的“哔哩哔哩”&#xff08;简称B站&#xff09;&#xff0c;是国内知名的视频网站。在B站投稿的用户被称为“UP主”。据统计&#xff0c;B站的UP主群体中&#xff0c;来自上海的比例最高&#xff0c;200万粉丝以上的UP主&#xff0c;来自上海的比例超过 30 …...

DD驱动鼠标键盘(驱动级别机器人使用鼠标键盘)

官网下载 DD虚拟键盘虚拟鼠标 github下载 GitHub - ddxoft/master 点击下载后&#xff0c;将驱动包下&#xff0c;这里以win7为例 setup运行安装 安装成功后 可以打开电脑管理&#xff0c;可以看见DD虚拟鼠标和键盘 这里以JAVA接入为例 使用管理员权限启动eclipse &#…...

每日学术速递4.30

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Masked Frequency Modeling for Self-Supervised Visual Pre-Training(ICLR 2023) 标题&#xff1a;用于自监督视觉预训练的掩蔽频率建模 作者&#xff1a;Jiahao Xie, Wei Li, Xi…...

K8S部署及常见问题处理

目录 k8s kubeadm 一键自动化&#xff0c;安装k8s集群&#xff0c;安装所有运行需要的组件 一、环境初始化&#xff08;三台机器都需要执行&#xff09; 主机名、节点ip、部署组件 1、配置hosts&#xff08;主节点master和业务节点node都需要配置&#xff09;文件内容 2、…...

通过Robotstudio修改机器人程序的具体方法和步骤

通过Robotstudio修改机器人程序的具体方法和步骤 基本步骤可参考以下内容: 用网线连接机器人和电脑,机器人一侧要插入LAN2口;机器人和电脑的IP地址要在同一个网段内;请求写入权限;修改程序—编译—应用;加载修改后的程序到机器人;保存Robotstudio程序到电脑端;只能修改…...

第40讲:Python for-in循环语句使用索引遍历序列

文章目录 方法一&#xff1a;遍历的是序列的元素方法二&#xff1a;遍历的是序列的索引方法三&#xff1a;while循环遍历实现方法四&#xff1a;调用内置函数enumerate实现1.什么是enumerate函数2.调用内置函数enumerate实现索引遍历序列 如果在遍历序列的过程中&#xff0c;需…...

如何用Jmeter压测Netty的Echo服务之自定义Jmeter的Java Sampler

前言 如果想要压测一些三方组件&#xff0c;比如MQ&#xff0c;redis什么的&#xff0c;jmeter本身是不支持的。 本文以开发一个压测netty的echo示例&#xff0c;说明如何自定义jmeter的sampler。 开发 本文以idea示例&#xff0c; 新建工程 打开idea新建一个空的maven工程…...

GPT3.5之运用之检查模型是否满足条件

策略三&#xff1a;要求模型检查是否满足条件* 如果任务做出的假设不一定满足&#xff0c;我们可以告诉模型先检查这些假设&#xff0c;如果不满足&#xff0c;指示并停止执行。你还可以考虑潜在的边缘情况以及模型应该如何处理它们&#xff0c;以避免意外的错误或结果。 在如…...

【TCP为什么需要粘包和拆包】

如今&#xff0c;大半个互联网都建立在 TCP 协议之上&#xff0c;我们使用的 HTTP 协议、消息队列、存储、缓存&#xff0c;都需要用到 TCP 协议——这是因为 TCP 协议提供了可靠性。简单来说&#xff0c;可靠性就是让数据无损送达。但若是考虑到成本&#xff0c;就会变得非常复…...

Python | 人脸识别系统 — 姿态检测

本博客为人脸识别系统的姿态检测代码解释 人脸识别系统博客汇总&#xff1a;人脸识别系统-博客索引 项目GitHub地址&#xff1a;Su-Face-Recognition: A face recognition for user logining 注意&#xff1a;阅读本博客前请先参考以下博客 工具安装、环境配置&#xff1a;人脸…...

为什么说网络安全行业是IT行业最后的红利?

前言 2023年网络安全行业的前景看起来非常乐观。根据当前的趋势和发展&#xff0c;一些趋势和发展可能对2023年网络安全行业产生影响&#xff1a; 5G技术的广泛应用&#xff1a;5G技术的普及将会使互联网的速度更快&#xff0c;同时也将带来更多的网络威胁和安全挑战。网络安全…...

谷粒商城二十四Sentinel限流熔断降级

我们在秒杀服务加的以上所有手段都是为了快&#xff0c;除了快之外&#xff0c;我们还需要保证稳定。 我们即使再快也会有一个极限值&#xff0c;现在假设单机下每秒处理一万个单&#xff0c;这已经是超高的处理能力了&#xff0c;秒杀服务上了五台服务器&#xff0c;有三台掉…...

STM32-HAL-SPI-W25Q128FV简单读写测试(2)

文章目录 一、Flash的基本读写操作1.1 向芯片中的某个地址&#xff08;addr:0x02&#xff09;连续写入不定长的数据并读取代码示例读写流程分析函数分析 1.2 向芯片中的某个地址&#xff08;addr:0x00&#xff09;写入一个数值代码示例&#xff1a;读写流程分析 具体的配置接上…...

网易一面:如何设计线程池?请手写一个简单线程池?

说在前面 在40岁老架构师 尼恩的读者社区(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如极兔、有赞、希音、百度、网易的面试资格&#xff0c;遇到了几个很重要的面试题&#xff1a; 如何设计线程池&#xff1f; 与之类似的、其他小伙伴遇到过的问题还有&#xff1a; …...

网络安全之密码学

目录 密码学 定义 密码的分类 对称加密 非对称加密 对称算法与非对称算法的优缺点 最佳解决办法 --- 用非对称加密算法加密对称加密算法的密钥 非对称加密如何解决对称加密的困境 密钥传输风险 密码管理难 常见算法 对称算法 非对称算法 完整性与身份认证最佳解决…...

株洲高端网站建设工作室/天眼查询个人信息

jQuery代码段可获取当前网页的完整标题并将其存储在变量中&#xff0c;以与其他脚本一起使用。 这是您在浏览器标题上看到的标题。 Current page title: mytitle .安迪建议的另一种方式。 var current_href $(location).attr(href); var current_title $(document).attr(titl…...

游戏运营备案官方网站/云盘搜

赋值语句的是内存地址引用&#xff0c;不是拷贝拷贝是导入copy包&#xff0c;分copy和deepcopy两种&#xff0c;即浅拷贝和深拷贝对于非嵌套数据 copy.copy 和 copy.deepcopy 没有区别 都会开辟新空间 存储数据有嵌套的数据 copy.copy没有办法保证数据的独立性,拷贝第一层的数据…...

模板网站有利于做seo吗/百度链接收录提交入口

把握好现在&#xff0c;生活好现在&#xff0c;让自己和亲人家人朋友身边的人都快乐&#xff0c;憧憬未来---生活的真谛转载于:https://www.cnblogs.com/silentjesse/archive/2011/08/23/2150169.html...

网站升级建设方案/云优客seo排名公司

Lock是java.util.concurrent.locks包下的一个接口 主要方法有&#xff1a; Lock接口的实现类 Lock相关实现类还可以定义公平锁&#xff0c;如ReentrantLock(boolean) package cn.itcats.thread.safe.Test1;import java.util.concurrent.locks.Lock; import java.util.concurre…...

网站代码输入完成之后要怎么做/爱用建站

导读:本文是matlab类有关专科毕业论文范文与MATLAB方面专科毕业论文范文.周子健张飞【摘 要】论文前半部分根据相关理念和相关概念设计出了直流调压调速控制系统的各个环节之间的联系以及各个部分的原部件.随后对这些原部件的参数进行了精确的计算,设计出了各个部分应该采用的相…...

wordpress仿微信底部菜单css/宁波优化关键词首页排名

Linux 入侵检测小结 0x00 审计命令 在linux中有5个用于审计的命令&#xff1a; last&#xff1a;这个命令可用于查看我们系统的成功登录、关机、重启等情况&#xff1b;这个命令就是将/var/log/wtmp文件格式化输出。lastb&#xff1a;这个命令用于查看登录失败的情况&#xff…...