当前位置: 首页 > 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程序到电脑端;只能修改…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制

目录 节点的功能承载层&#xff08;GATT/Adv&#xff09;局限性&#xff1a; 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能&#xff0c;如 Configuration …...

LangFlow技术架构分析

&#x1f527; LangFlow 的可视化技术栈 前端节点编辑器 底层框架&#xff1a;基于 &#xff08;一个现代化的 React 节点绘图库&#xff09; 功能&#xff1a; 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...

嵌入式常见 CPU 架构

架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集&#xff0c;单周期执行&#xff1b;低功耗、CIP 独立外设&#xff1b;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel&#xff08;原始…...