Java实现数据库表中的七种连接【Mysql】
Java实现数据库表中的七种连接【Mysql】
- 前言
- 版权
- 推荐
- Java实现数据库表中的七种连接
- 左外连接
- 右外连接
- 其他连接
- 附录
- 七种连接
- SQL测试
- Java测试
- 转换方法
- 类 Cla1
- 类 Cla2
- 类Cla3
- 最后
前言
2023-8-4 16:51:42
以下内容源自《【Mysql】》
仅供学习交流使用
版权
禁止其他平台发布时删除以下此话
本文首次发布于CSDN平台
作者是CSDN@日星月云
博客主页是https://blog.csdn.net/qq_51625007
禁止其他平台发布时删除以上此话
推荐
无
Java实现数据库表中的七种连接
左外连接
/*** 左外连接* 计算* SELECT cla1.`id`,cla1.`type`,cla2.`name`* FROM cla1* LEFT JOIN cla2* ON cla1.`id`=cla2.`id`* (Where cla2.id IS NULL);** @param list1* @param list2* @param isNull 有没有括号中的IS NULL这条语句* @param out 输出吗?* @return*/public static List<Cla3> leftJoin(List<Cla3> list1, List<Cla3> list2,boolean isNull,boolean out) {List<Cla3> leftJoin=new ArrayList<>();//左表遍历list1.forEach(c1->{//在右表中有没有找到AtomicBoolean flag= new AtomicBoolean(false);list2.forEach(c2->{//找到了if(c1.id.equals(c2.id)){//如果cla2.id is null,就不需要添加if (!isNull) {leftJoin.add(new Cla3(c1.id, c1.type, c2.name));}flag.set(true);}});//没有找到添加 右表属性 NULLif(!flag.get()){leftJoin.add(new Cla3(c1.id,c1.type,"null"));}});return leftJoin;}
右外连接
/*** 右外连接* 计算* SELECT cla2.`id`,cla1.`type`,cla2.`name`* FROM cla1* RIGHT JOIN cla2* ON cla1.`id`=cla2.`id`* (WHERE cla1.`id` IS NULL);** @param list1* @param list2* @param isNull 有没有括号中的IS NULL这条语句* @return*/public static List<Cla3> rightJoin(List<Cla3> list1, List<Cla3> list2,boolean isNull,boolean out) {List<Cla3> rightJoin=new ArrayList<>();//右表遍历list2.forEach(c2->{//在左表中有没有找到AtomicBoolean flag= new AtomicBoolean(false);list1.forEach(c1->{//找到了if(c1.id.equals(c2.id)){//如果cla1.id is null,就不需要添加if (!isNull){rightJoin.add(new Cla3(c2.id, c1.type,c2.name));}flag.set(true);}});//没有找到添加 左表属性 NULLif(!flag.get()){rightJoin.add(new Cla3(c2.id,"null",c2.name));}});return rightJoin;}
其他连接
外连接* 左外+右外* 右外+左外
内连接* 左外-左外ISNULL* 右外-右外ISNULL
外连接-内连接
附录
七种连接
MySQL笔记:第06章_多表查询

SQL测试
CREATE DATABASE cla;USE cla;CREATE TABLE cla1(`id` VARCHAR(10),`type` VARCHAR(10)
);CREATE TABLE cla2(`id` VARCHAR(10),`name` VARCHAR(10)
);INSERT INTO cla1 VALUES('22','cde');
INSERT INTO cla1 VALUES('11','abc');
INSERT INTO cla1 VALUES('44','cdef');
INSERT INTO cla1 VALUES('55','cdefg');INSERT INTO cla2
VALUES
('11','name1'),
('22','name2'),
('33','name3'),
('44','name4'),
('aa','nameaa');#leftJoin
SELECT cla1.`id`,cla1.`type`,cla2.`name`
FROM cla1
LEFT JOIN cla2
ON cla1.`id`=cla2.`id`
/*
id type name
22 cde name2
11 abc name1
44 cdef name4
55 cdefg \N
*/#leftJoin isnull
SELECT cla1.`id`,cla1.`type`,cla2.`name`
FROM cla1
LEFT JOIN cla2
ON cla1.`id`=cla2.`id`
WHERE cla2.`id` IS NULL;
/*
id type name
55 cdefg \N
*/#rightJoin
SELECT cla2.`id`,cla1.`type`,cla2.`name`
FROM cla1
RIGHT JOIN cla2
ON cla1.`id`=cla2.`id`
/*
id type name
11 abc name1
22 cde name2
33 \N name3
44 cdef name4
aa \N nameaa
*/#rightJoin ISNULL
SELECT cla2.`id`,cla1.`type`,cla2.`name`
FROM cla1
RIGHT JOIN cla2
ON cla1.`id`=cla2.`id`
WHERE cla1.`id` IS NULL;
/*
id type name
33 \N name3
aa \N nameaa
*/#innerJoin leftBefore
SELECT cla1.`id`,cla1.`type`,cla2.`name`
FROM cla1
INNER JOIN cla2
ON cla1.`id`=cla2.`id`
/*
id type name
11 abc name1
22 cde name2
44 cdef name4
*/#innerJoin rightBefore
SELECT cla2.`id`,cla1.`type`,cla2.`name`
FROM cla2
INNER JOIN cla1
ON cla2.`id`=cla1.`id`
/*
id type name
11 abc name1
22 cde name2
44 cdef name4
*/#outJoin leftBefore
#左1+右2
SELECT cla1.`id`,cla1.`type`,cla2.`name`
FROM cla1
LEFT JOIN cla2
ON cla1.`id`=cla2.`id`
UNION ALL
SELECT cla2.`id`,cla1.`type`,cla2.`name`
FROM cla1
RIGHT JOIN cla2
ON cla1.`id`=cla2.`id`
WHERE cla1.`id` IS NULL;
/*
id type name
22 cde name2
11 abc name1
44 cdef name4
55 cdefg \N
33 \N name3
aa \N nameaa
*/#outJoin rightBefore
#右1+左2
SELECT cla2.`id`,cla1.`type`,cla2.`name`
FROM cla1
RIGHT JOIN cla2
ON cla1.`id`=cla2.`id`
UNION ALL
SELECT cla1.`id`,cla1.`type`,cla2.`name`
FROM cla1
LEFT JOIN cla2
ON cla1.`id`=cla2.`id`
WHERE cla2.`id` IS NULL;
/*
id type name
11 abc name1
22 cde name2
33 \N name3
44 cdef name4
aa \N nameaa
55 cdefg \N
*/
Java测试
转换方法
package test.algo;import test.algo.main2.Cla1;
import test.algo.main2.Cla2;
import test.algo.main2.Cla3;import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;public class testJoin {static List<Cla1> claList1 = new ArrayList<>();static List<Cla2> claList2 = new ArrayList<>();static List<Cla3> list1 = new ArrayList<>();static List<Cla3> list2 = new ArrayList<>();public static void main(String[] args) {test();init(claList1,claList2);leftJoin(list1, list2,false,true);/*{id: 22, type: cde, name: name2}{id: 11, type: abc, name: name1}{id: 44, type: cdef, name: name4}{id: 55, type: cdefg, name: null}*/leftJoin(list1, list2,true,true);;/*{id: 55, type: cdefg, name: null}*/rightJoin(list1, list2,false,true);/*{id: 11, type: abc, name: name1}{id: 22, type: cde, name: name2}{id: 33, type: null, name: name3}{id: 44, type: cdef, name: name4}{id: aa, type: null, name: nameaa}*/rightJoin(list1, list2,true,true);/*{id: 33, type: null, name: name3}{id: aa, type: null, name: nameaa}*/outJoin(list1, list2,true,true);/*{id: 22, type: cde, name: name2}{id: 11, type: abc, name: name1}{id: 44, type: cdef, name: name4}{id: 55, type: cdefg, name: null}{id: 33, type: null, name: name3}{id: aa, type: null, name: nameaa}*/outJoin(list1, list2,false,true);/*{id: 11, type: abc, name: name1}{id: 22, type: cde, name: name2}{id: 33, type: null, name: name3}{id: 44, type: cdef, name: name4}{id: aa, type: null, name: nameaa}{id: 55, type: cdefg, name: null}*/innerJoin(list1,list2,true,true);/*{id: 22, type: cde, name: name2}{id: 11, type: abc, name: name1}{id: 44, type: cdef, name: name4}*/innerJoin(list1,list2,false,true);/*{id: 11, type: abc, name: name1}{id: 22, type: cde, name: name2}{id: 44, type: cdef, name: name4}*/outJoin_InnerJoin(list1,list2,true,true);/*{id: 55, type: cdefg, name: null}{id: 33, type: null, name: name3}{id: aa, type: null, name: nameaa}*/outJoin_InnerJoin(list1,list2,false,true);/*{id: 33, type: null, name: name3}{id: aa, type: null, name: nameaa}{id: 55, type: cdefg, name: null}*/}/*** 初始两个表中的数据*/public static void test(){claList1.add(new Cla1("22", "cde"));claList1.add(new Cla1("11", "abc"));claList1.add(new Cla1("44", "cdef"));claList1.add(new Cla1("55", "cdefg"));claList2.add(new Cla2("11", "name1"));claList2.add(new Cla2("22", "name2"));claList2.add(new Cla2("33", "name3"));claList2.add(new Cla2("44", "name4"));claList2.add(new Cla2("aa", "nameaa"));}/*** 初始结果表中的数据*/public static void init(List<Cla1> claList1, List<Cla2> claList2){claList1.forEach(cla1 -> list1.add(new Cla3(cla1.getId(), cla1.getType(), "null")));claList2.forEach(cla2 -> list2.add(new Cla3(cla2.getId(), "null", cla2.getName())));}/***外连接-内连接* @param list1* @param list2* @param leftBefore 左边在前* @param out 是否输出* @return*/public static List<Cla3> outJoin_InnerJoin(List<Cla3> list1, List<Cla3> list2,boolean leftBefore,boolean out){List<Cla3> outJoin_InnerJoin=new ArrayList<>();outJoin_InnerJoin.addAll(outJoin(list1, list2, leftBefore, false));outJoin_InnerJoin.removeAll(innerJoin(list1, list2, leftBefore, false));if(out){System.out.println("--------------------outJoin_InnerJoin"+((leftBefore)?"leftBefore":"rightBefore")+"-------------------------------");outJoin_InnerJoin.forEach(System.out::println);System.out.println("--------------------outJoin_InnerJoin"+((leftBefore)?"leftBefore":"rightBefore")+"-------------------------------");}return outJoin_InnerJoin;}/*** 内连接* 左外-左外ISNULL* 右外-右外ISNULL* @param list1* @param list2* @param leftBefore 左边在前* @param out 是否输出* @return*/public static List<Cla3> innerJoin(List<Cla3> list1, List<Cla3> list2,boolean leftBefore,boolean out){List<Cla3> innerJoin=new ArrayList<>();if(leftBefore){innerJoin.addAll(leftJoin(list1, list2, false, false));innerJoin.removeAll(leftJoin(list1, list2, true, false));}else {innerJoin.addAll(rightJoin(list1, list2, false, false));innerJoin.removeAll(rightJoin(list1, list2, true, false));}if(out){System.out.println("--------------------innerJoin"+((leftBefore)?"leftBefore":"rightBefore")+"-------------------------------");innerJoin.forEach(System.out::println);System.out.println("--------------------innerJoin"+((leftBefore)?"leftBefore":"rightBefore")+"-------------------------------");}return innerJoin;}/*** 左外连接* 计算* SELECT cla1.`id`,cla1.`type`,cla2.`name`* FROM cla1* LEFT JOIN cla2* ON cla1.`id`=cla2.`id`* (Where cla2.id IS NULL);** @param list1* @param list2* @param isNull 有没有括号中的IS NULL这条语句* @param out 输出吗?* @return*/public static List<Cla3> leftJoin(List<Cla3> list1, List<Cla3> list2,boolean isNull,boolean out) {List<Cla3> leftJoin=new ArrayList<>();list1.forEach(c1->{AtomicBoolean flag= new AtomicBoolean(false);list2.forEach(c2->{if(c1.id.equals(c2.id)){if (!isNull) {leftJoin.add(new Cla3(c1.id, c1.type, c2.name));}flag.set(true);}});if(!flag.get()){leftJoin.add(new Cla3(c1.id,c1.type,"null"));}});if(out){System.out.println("--------------------leftJoin---"+((isNull)?"isNull":"----")+"-------------------------------");leftJoin.forEach(System.out::println);System.out.println("--------------------leftJoin---"+((isNull)?"isNull":"----")+"-------------------------------");System.out.println();}return leftJoin;}/*** 右外连接* 计算* SELECT cla2.`id`,cla1.`type`,cla2.`name`* FROM cla1* RIGHT JOIN cla2* ON cla1.`id`=cla2.`id`* (WHERE cla1.`id` IS NULL);** @param list1* @param list2* @param isNull 有没有括号中的IS NULL这条语句* @return*/public static List<Cla3> rightJoin(List<Cla3> list1, List<Cla3> list2,boolean isNull,boolean out) {List<Cla3> rightJoin=new ArrayList<>();list2.forEach(c2->{AtomicBoolean flag= new AtomicBoolean(false);list1.forEach(c1->{if(c1.id.equals(c2.id)){if (!isNull){rightJoin.add(new Cla3(c2.id, c1.type,c2.name));}flag.set(true);}});if(!flag.get()){rightJoin.add(new Cla3(c2.id,"null",c2.name));}});if (out){System.out.println("--------------------rightJoin---"+((isNull)?"isNull":"----")+"-------------------------------");rightJoin.forEach(System.out::println);System.out.println("--------------------rightJoin---"+((isNull)?"isNull":"----")+"-------------------------------");System.out.println();}return rightJoin;}/*** 外连接* 左外+右外* 右外+左外* SELECT ** FROM tableA A* FULL OUTER JOIN TableB B* ON A.key=B.key** @param leftBefore 结果集左表在前还是右边在前* @param out 输出吗* @return*/public static List<Cla3> outJoin(List<Cla3> list1, List<Cla3> list2,boolean leftBefore,boolean out) {List<Cla3> outJoin=new ArrayList<>();List<Cla3> leftJoin = leftJoin(list1, list2,!leftBefore,false);List<Cla3> rightJoin = rightJoin(list1, list2,leftBefore,false);if (leftBefore){outJoin.addAll(leftJoin);outJoin.addAll(rightJoin);}else {outJoin.addAll(rightJoin);outJoin.addAll(leftJoin);}if(out){System.out.println("--------------------outJoin"+((leftBefore)?"leftBefore":"rightBefore")+"-------------------------------");outJoin.forEach(System.out::println);System.out.println("--------------------outJoin"+((leftBefore)?"leftBefore":"rightBefore")+"-------------------------------");}return outJoin;}}
类 Cla1
package test.algo.main2;public class Cla1 {public String id;public String type;public Cla1(String id, String type) {this.id = id;this.type = type;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getType() {return type;}public void setType(String type) {this.type = type;}@Overridepublic String toString() {return "{id: " + id + ", type: " + type + "}";}
}
类 Cla2
package test.algo.main2;public class Cla2 {public String id;public String name;public Cla2(String id, String name) {this.id = id;this.name = name;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "{id: " + id + ", name: " + name + "}";}
}
类Cla3
需要重写equals()
id==id
package test.algo.main2;import java.util.Objects;public class Cla3 {public String id;public String name;public String type;public Cla3(String id, String type, String name) {this.id = id;this.type = type;this.name = name;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getType() {return type;}public void setType(String type) {this.type = type;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Cla3 cla3 = (Cla3) o;return Objects.equals(id, cla3.id);}@Overridepublic int hashCode() {return Objects.hash(id);}@Overridepublic String toString() {return "{id: " + id + ", type: " + type + ", name: " + name + "}";}
}
最后
2023-8-4 17:04:28
我们都有光明的未来
祝大家考研上岸
祝大家工作顺利
祝大家得偿所愿
祝大家如愿以偿
点赞收藏关注哦
相关文章:
Java实现数据库表中的七种连接【Mysql】
Java实现数据库表中的七种连接【Mysql】 前言版权推荐Java实现数据库表中的七种连接左外连接右外连接其他连接 附录七种连接SQL测试Java测试转换方法类 Cla1类 Cla2类Cla3 最后 前言 2023-8-4 16:51:42 以下内容源自《【Mysql】》 仅供学习交流使用 版权 禁止其他平台发布时…...
452. 用最少数量的箭引爆气球
452. 用最少数量的箭引爆气球452. 用最少数量的箭引爆气球 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points ,其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。 一支弓箭可…...
HTML <rp> 标签
实例 一个 ruby 注释: <ruby> 漢 <rt><rp>(</rp>ㄏㄢˋ<rp>)</rp></rt> </ruby>浏览器支持 元素ChromeIEFirefoxSafariOpera<rp>5.05.538.05.015.0 Internet Explorer 9, Firefox, Opera, Chrome 以及 S…...
常见的设计模式(超详细)
文章目录 单例模式饿汉式单例模式懒汉式单例模式双重检索单例模式 工厂模式简单工厂模式工厂(方法)模式抽象工厂模式 原型模式代理模式 单例模式 确保一个类只有一个实例,并且自行实例化并向整个系统提供这个实例。 饿汉式单例模式 饿汉式单…...
Excel 超牛的格式调整汇总——你还在担心你做出来的表不好看吗
Excel格式调整技巧 绘图逆序绘制条形图设置条形图宽度 条件格式透视表上的条件格式 数字格式千分位逗号数字同时显示 K M 数据分列非重复计数区域透视图新增计算列隐藏行列快捷键其他小技巧 绘图 逆序绘制条形图 设置条形图宽度 条件格式 透视表上的条件格式 条件格式随切片…...
hyperf 十二、自动化测试
文档教程:Hyperf 用co-phpunit提供测试,在composer中测试。 "scripts": {"test": "co-phpunit --prepend test/bootstrap.php -c phpunit.xml --colorsalways", } 测试中使用Hyperf\Testing\Client模拟请求,该类调用Hyp…...
dblink简单使用
1.配置tns [oraclepg1 admin]$ cat tnsnames.ora 19c (DESCRIPTION (ADDRESS_LIST (ADDRESS (PROTOCOL TCP)(HOST 192.168.56.100)(PORT 1521)))(CONNECT_DATA (SERVICE_NAME orcl)))11g (DESCRIPTION (ADDRESS_LIST (ADDRESS (PROTOCOL TCP)(HOST 192.168.56…...
Typescript 第十一章 与JavaScript互操作(外参变量声明,外参类型声明,外参模块声明)
第十一章 与JavaScript互操作 本章讨论在实际开发中如何编写Typescript。有可能你真正把代码从无类型语言向Typescript迁移。也有可能要使用第三方库。 使用类型声明逐步从JavaScript迁移到Typescript使用第三方JavaScript和Typescript 11.1 类型声明 类型声明文件的扩展名…...
从0到1框架搭建,Python+Pytest+Allure+Git+Jenkins接口自动化框架(超细整理)
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 接口测试是对系统…...
在windows配置redis的一些错误及解决方案
目录 Unable to connect to Redis; nested exception is io.lettuce.core.RedisConnectionException:用客户端Redis Desktop Manager一样的密码端口,是可以正常连接的,但是运行java程序之后使用接口请求就会报错 Unable to connect to Redis; nested e…...
真机搭建中小网络
这是b站上的一个视频,演示了如何搭建一个典型的中小网络,供企业使用 一、上行端口:上行端口就是连接汇聚或者核心层的口,或者是出广域网互联网的口。也可理解成上传数据的端口。 二、下行端口:连接数据线进行下载的端…...
Linux:shell脚本:基础使用(1)
Shell的作用 命令解释器,“翻译官”,介于系统内核与用户之间,负责解释命令行 用户的登录Shell 登录后默认使用的Shell程序,一般为 /bin/bash 不同Shell的内部指令、运行环境等会有所区别 cat /etc/shells 编写第一个Shell脚本 …...
carla中lka实现(一)
前言: 对于之前项目中工作内容进行总结,使用Carla中的车辆进行lka算法调试,整体技术路线: ①在Carla中生成车辆,并在车辆上搭载camera,通过camera采集图像数据; ②使用图像处理lka算法&#…...
常见的数据结构(顺序表、顺序表、链表、栈、队列、二叉树)
线性表(Linear List) 1.什么是线性表 2.线性表的特点 3.线性表的基本运算 顺序表 1.什么是顺序表 2.时间复杂度: 链表 1.什么是链表 2.单向链表 3. 双向链表 4.ArrayList和LinkedList的使用 栈Stack 1.什么是栈 2.栈的基本方法 队列…...
(12)理解委托,反射,Type,EvenInfo,插件, 组合枚举,BindingFlags,扩展方法及重载,XML认识
一、复习委托事件 1、委托复习。 private delegate int MyDelegate(int a, int b); //1.定义委托类型private static void Main(string[] args){MyDelegate md new MyDelegate(AddDelegate);//2.声明委托变量int result md(1, 2);//3.调用委托Console.WriteLine(result);Cons…...
软件建设方案技术方案实施方案密码评测方案等保测评方案人员培训方案项目建设与运行管理项目招标方案模板目录
第一章 项目概述 1.项目名称(包含项目全称和简称) 2.项目建设单位及负责人、项目责任人 3.项目建设依据 (1)政策依据(主要从国家、省、市、行业部门相关的政策文件要求等方面进行描述) (2)技术标准 4.项目建设目标、建设任务 5.项目主要建设内容、规模、建设周期…...
pytorch中torch.einsum函数的详细计算过程图解
第一次见到 rel_h torch.einsum(“bhwc,hkc->bhwk”, r_q, Rh)这行代码时,属实是懵了,网上找了很多博主的介绍,但都没有详细的说明函数内部的计算过程,看得我是一头雾水,只知道计算结果的维度是如何变化的…...
【iOS】App仿写--天气预报
文章目录 前言一、首页二、搜索界面三、添加界面四、浏览界面总结 前言 最近完成了暑假的最后一个任务——天气预报,特此记录博客总结。根据iPhone中天气App的功能大致可以将仿写的App分为四个界面——首页,搜索界面,添加界面,浏…...
快速远程桌面控制公司电脑远程办公
文章目录 第一步第二步第三步 远程办公的概念很早就被提出来,但似乎并没有多少项目普及落实到实际应用层面,至少在前几年,远程办公距离我们仍然很遥远。但2019年末突如其来的疫情,着实打了大家一个措手不及。尽管国内最初的大面积…...
亚信科技AntDB数据库专家出席数据库标准研讨会并参与研讨
2023年7月12日,全国信息技术标准化技术委员会数据库标准工作组(SAC/TC28/WG31)秘书处组织召开数据库标准研讨会,会议围绕数据库标准工作组2023年上半年开展的标准编制情况进行交流。亚信科技AntDB数据库相关专家出席会议ÿ…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...
【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制
目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...
零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
