Mybatis---MyBatis映射文件SQL深入、多表查询

目录

第一章:MyBatis映射文件SQL深入

1.动态SQL 语句之if标签

2. 动态SQL语句之where标签

3. 动态SQL语句之foreach标签

4. 提取公用的SQL语句

提取公用SQL片段

定义分页模板

第二章:多表查询

1. 多表设计

2.搭建开发的环境

3.多对一查询(一对一查询)

4.一对多查询

5.多对多查询


第一章:MyBatis映射文件SQL深入

1.动态SQL 语句之if标签

UserMapper接口

package com.qcby.mapper;import com.qcby.domain.User;import java.util.List;public interface UserMapper {//条件查询public List<User> findByWhere(User user);
}

UserMapper.xml配置文件

<!-- if标签 -->
<select id="findByWhere" parameterType="com.qcby.domain.User" resultType="com.qcby.domain.User">select * from user where 1 = 1<if test="username !=null and username != ''">and username like #{username}</if><if test="sex !=null and sex != ''">and sex like #{sex}</if>
</select>

测试方法

package com.qcby.mapper;import com.qcby.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;public class UserTest {private InputStream in;private SqlSession session;private UserMapper mapper;@Beforepublic void init() throws Exception{//加载配置文件in = Resources.getResourceAsStream("SqlMapConfig.xml");// 创建工厂对象SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);// 创建Session对象session = factory.openSession();// 获取到代理对象mapper = session.getMapper(UserMapper.class);}@Afterpublic void destory() throws IOException {in.close();session.close();}//条件查询(if标签/where标签)@Testpublic void findByWhereTest() throws Exception{User user = new User();user.setUsername("%熊%");user.setSex("女");List<User> list = mapper.findByWhere(user);for(User user1 : list){System.out.println(user1);}
}

2. 动态SQL语句之where标签

1.where标签目的就是为了去掉 where 1=1的拼接的
2.where标签使用在if标签的外面

<!-- where标签 自动处理开头的 AND 或 OR -->
<select id="findByWhere" parameterType="com.qcby.domain.User" resultType="com.qcby.domain.User">select * from user<where><if test="username !=null and username != ''">and username like #{username}</if><if test="sex !=null and sex != ''">and sex like #{sex}</if></where>
</select>

测试方法和使用if标签测试方法相同

3. 动态SQL语句之foreach标签

两种SQL语句

第一种

1.需求的SQL语句:select * from user where id = 1 or id = 2 or id = 3

2.在User类中添加属性

package com.qcby.domain;import java.io.Serializable;
import java.util.Date;
import java.util.List;public class User implements Serializable{private Integer id;private String username;private Date birthday;private String sex;private String address;//演示foreach标签private List<Integer> ids;//get和set方法
}

3.在UserMapper接口中添加方法

public List<User> findByIds(User user);

4.配置文件

<!-- foreach标签 select * from user where id = 1 or id = 2 or id = 3 -->
<select id="findByIds" parameterType="com.qcby.domain.User" resultType="com.qcby.domain.User">select * from user<where><!--open 表示在集合中的第一个元素前加上 id = ,separator 表示在每个元素之间用 or id = 分隔。--><foreach collection="ids" open="id = " separator="or id = " item="i">#{i}</foreach></where>
</select>

collection="ids"

        指定要遍历的集合,ids是User 对象中的一个属性。

item="i":

        每次遍历的元素赋值给i。

5.测试方法

//foreach标签
@Test
public void findByIdsTest() throws Exception{User user = new User();//创建User对象List<Integer> ids = new ArrayList<>();ids.add(1);//添加要查询的idids.add(2);ids.add(3);user.setIds(ids);//将集合设置到user对象中List<User> list = mapper.findByIds(user);for(User user1 : list){System.out.println(user1);}
}

第二种

1.需求SQL:select * from user where id in (1,2,3)
2.配置文件编写

<!--foreach标签 select * from user where id in (1,2,3)-->
<select id="findByIds" parameterType="com.qcby.domain.User" resultType="com.qcby.domain.User">select * from user<where><foreach collection="ids" open="id in (" separator="," close=")" item="i">#{i}</foreach></where>
</select>

open="id in ("

        在遍历的第一个元素前追加 id in (

separator=","

        在每个元素之间插入 , ,用来连接多个条件。

close=")"

        在遍历的最后一个元素后追加 )

4. 提取公用的SQL语句

        为了避免SQL的重复编写和维护困难,MyBatis 提供了提取和复用 SQL 语句的功能,可以将公共的 SQL 片段提取出来,通过引用的方式在不同的 SQL 中复用。

提取公用SQL片段

使用标签定义公共SQL

  • MyBatis 提供了 标签,用于定义可以复用的 SQL 片段。
  • 通过 标签引用该 SQL 片段。

定义公共SQL

<!-- 提取公共的SQL -->
<sql id="findAllSql">select * from user
</sql>

在查询中引用公共SQL

<select id="findAll" resultType="com.qcby.domain.User"><include refid="findAllSql"/>/*select * from user*/
</select>

定义分页模板

<sql id="pagination">limit #{start}, #{size}
</sql>

在分页查询中使用

<select id="findUsersWithPagination" resultType="com.qcby.domain.User">select<include refid="baseColumns"/>from user<include refid="userConditions"/><include refid="pagination"/>
</select>

动态生成SQL:

select id, username, birthday, sex, address from user limit 5, 5

第二章:多表查询

1. 多表设计

1.一对一        其实一对一可以设计成一张表结构
2.一对多        再一的一方添加多的一方的集合属性
3.多对一         在多的一方添加一的对象属性
4.多对多        在要查询的实体类中加入对方的集合属性。通过中间表,三表联查

2.搭建开发的环境

建表语句

CREATE TABLE `user` (`id` int(11) NOT NULL auto_increment,`username` varchar(32) NOT NULL COMMENT '用户名称',`birthday` datetime default NULL COMMENT '生日',`sex` char(1) default NULL COMMENT '性别',`address` varchar(256) default NULL COMMENT '地址',PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
​
insert  into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (1,'老王','2018-02-27 17:47:08','男','北京'),(2,'熊大','2018-03-02 15:09:37','女','上海'),(3,'熊二','2018-03-04 11:34:34','女','深圳'),(4,'光头强','2018-03-04 12:04:06','男','广州');
​
CREATE TABLE `account` (`ID` int(11) NOT NULL COMMENT '编号',`UID` int(11) default NULL COMMENT '用户编号',`MONEY` double default NULL COMMENT '金额',PRIMARY KEY  (`ID`),KEY `FK_Reference_8` (`UID`),CONSTRAINT `FK_Reference_8` FOREIGN KEY (`UID`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
​
insert  into `account`(`ID`,`UID`,`MONEY`) values (1,1,1000),(2,2,1000),(3,2,2000);

编写Account的JavaBean类

package com.qcby.domain;import java.io.Serializable;/*** 账号*/
public class Account implements Serializable{private Integer id;private Integer uid;private Double money;
​public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public Integer getUid() {return uid;}public void setUid(Integer uid) {this.uid = uid;}public Double getMoney() {return money;}public void setMoney(Double money) {this.money = money;}
}

编写AccountMapper接口

package com.qcby.mapper;public interface AccountMapper {
}

编写AccountMapper.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.qcby.mapper.AccountMapper"></mapper>

主配置文件中引入映射配置文件

<!-- 加载映射的配置文件 -->
<mappers><mapper resource="com/qcby/mapper/UserMapper.xml"/><mapper resource="com/qcby/mapper/AccountMapper.xml"/>
</mappers>

3.多对一查询(一对一查询)

1.需求:查询的数据中包含account所有的字段,再包含用户的名称和地址

2.在Account类中添加user的属性,表示该帐户只属于这个用户

package com.qcby.domain;import java.io.Serializable;/*** 账号*/
public class Account implements Serializable{private Integer id;private Integer uid;private Double money;//用户private User user;public Account(Integer id, Integer uid, Double money, User user) {this.id = id;this.uid = uid;this.money = money;this.user = user;}public Account() {}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public Integer getUid() {return uid;}public void setUid(Integer uid) {this.uid = uid;}public Double getMoney() {return money;}public void setMoney(Double money) {this.money = money;}public User getUser() {return user;}public void setUser(User user) {this.user = user;}@Overridepublic String toString() {return "Account{" +"id=" + id +", uid=" + uid +", money=" + money +", user=" + user +'}';}
}

3.在AccountMapper接口中编写查询的方法

package com.qcby.mapper;import com.qcby.domain.Account;import java.util.List;public interface AccountMapper {public List<Account> findAll();
}

4.编写配置文件

<?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.qcby.mapper.AccountMapper"><!-- 内连接查询 --><select id="findAll" resultMap="accountMap">select a.*,u.username,u.address from account a,user u where a.uid = u.id</select><!-- 进行数据封装--><resultMap id="accountMap" type="com.qcby.domain.Account"><result property="id" column="id"/><result property="uid" column="uid"/><result property="money" column="money"/><!--property:设置需要处理映射关系的属性的属性名column:设置要处理映射关系的属性对应的列名javaType:设置要处理的属性的类型--><!-- <association> 标签:一对一关系 --><association property="user" javaType="com.qcby.domain.User"><result property="username" column="username"/><result property="address" column="address"/></association></resultMap>
</mapper>

5.测试方法

//多对一查询
@Test
public void findAllTest() throws Exception{List<Account> list = mapper.findAll();for(Account accout : list){System.out.println(accout);}
}

4.一对多查询

1.如果想查询 select u.*,a.money from user u left join account a on u.id = a.uid 语句的内容

2.在User类中添加List的属性

package com.qcby.domain;import java.io.Serializable;
import java.util.Date;
import java.util.List;public class User implements Serializable{private Integer id;private String username;private Date birthday;private String sex;private String address;//演示foreach标签private List<Integer> ids;//演示一对多查询private List<Account> accounts;public User(Integer id, String username, Date birthday, String sex, String address, List<Integer> ids, List<Account> accounts) {this.id = id;this.username = username;this.birthday = birthday;this.sex = sex;this.address = address;this.ids = ids;this.accounts = accounts;}public User() {}public List<Account> getAccounts() {return accounts;}public void setAccounts(List<Account> accounts) {this.accounts = accounts;}public List<Integer> getIds() {return ids;}public void setIds(List<Integer> ids) {this.ids = ids;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", birthday=" + birthday +", sex='" + sex + '\'' +", address='" + address + '\'' +", ids=" + ids +", accounts=" + accounts +'}';}
}

3.在UserMapper接口中定义方法

//查询一对多
public List<User> findOneToMany();

4.编写配置文件

<!-- 一对多查询 -->
<select id="findOneToMany" resultMap="userMap">select u.*,a.money from user u left join account a on u.id = a.uid
</select><resultMap id="userMap" type="com.qcby.domain.User"><result property="id" column="id"/><result property="username" column="username"/><result property="birthday" column="birthday"/><result property="address" column="address"/><!--ofType 属性用于指定集合中的每个元素的 Java 类型。用于处理一对多--><collection property="accounts" ofType="com.qcby.domain.Account"><result property="money" column="money"/></collection>
</resultMap>

5.测试方法

//一对多查询
@Test
public void testOneToManyTest() throws Exception{List<User> list = mapper.findOneToMany();//遍历list集合for(User user : list){System.out.println(user);}
}

5.多对多查询

1.创建表

CREATE TABLE `role` (`ID` int(11) NOT NULL COMMENT '编号',`ROLE_NAME` varchar(30) default NULL COMMENT '角色名称',`ROLE_DESC` varchar(60) default NULL COMMENT '角色描述',PRIMARY KEY  (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
​
insert  into `role`(`ID`,`ROLE_NAME`,`ROLE_DESC`) values (1,'组长','管理整个组'),(2,'班主任','管理整个班级'),(3,'校长','管理整个学校');
​
CREATE TABLE `user_role` (`UID` int(11) NOT NULL COMMENT '用户编号',`RID` int(11) NOT NULL COMMENT '角色编号',PRIMARY KEY  (`UID`,`RID`),KEY `FK_Reference_10` (`RID`),CONSTRAINT `FK_Reference_10` FOREIGN KEY (`RID`) REFERENCES `role` (`ID`),CONSTRAINT `FK_Reference_9` FOREIGN KEY (`UID`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
​
insert  into `user_role`(`UID`,`RID`) values (1,1),(1,2),(2,2);

2.编写JavaBean

package com.qcby.domain;import java.io.Serializable;
import java.util.List;public class Role implements Serializable{private Integer id;private String role_name;private String role_desc;private List<User> users;public Role(Integer id, String role_name, String role_desc, List<User> users) {this.id = id;this.role_name = role_name;this.role_desc = role_desc;this.users = users;}public List<User> getUsers() {return users;}public void setUsers(List<User> users) {this.users = users;}public Role() {}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getRole_name() {return role_name;}public void setRole_name(String role_name) {this.role_name = role_name;}public String getRole_desc() {return role_desc;}public void setRole_desc(String role_desc) {this.role_desc = role_desc;}@Overridepublic String toString() {return "Role{" +"id=" + id +", role_name='" + role_name + '\'' +", role_desc='" + role_desc + '\'' +", users=" + users +'}';}
}

3.编写接口

package com.qcby.mapper;import com.qcby.domain.Role;import java.util.List;public interface RoleMapper {public List<Role> findAll();
}

4.编写配置文件

<?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.qcby.mapper.RoleMapper"><select id="findAll" resultMap="roleMap">select r.*,u.username from user u,user_role ur,role r where u.id = ur.UID and ur.RID = r.ID</select><resultMap id="roleMap" type="role"><id property="id" column="id"/><result property="role_name" column="role_name"/><result property="role_desc" column="role_desc"/><collection property="users" ofType="com.qcby.domain.User"><result property="username" column="username"/></collection></resultMap>
</mapper>

5.编写测试方法

package com.qcby.mapper;import com.qcby.domain.Account;
import com.qcby.domain.Role;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;import javax.swing.tree.RowMapper;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;public class Test03 {private InputStream in;private SqlSession session;private RoleMapper mapper;@Beforepublic void init() throws Exception{//加载配置文件in = Resources.getResourceAsStream("SqlMapConfig.xml");// 创建工厂对象SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);// 创建Session对象session = factory.openSession();// 获取到代理对象mapper = session.getMapper(RoleMapper.class);}@Afterpublic void destory() throws IOException {in.close();session.close();}//多对多查询@Testpublic void findAllTest() throws Exception{List<Role> list = mapper.findAll();for(Role role : list){System.out.println(role);}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/887466.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Python的飞机大战复现

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

MR30分布式 IO 模块在冷却水泵系统中的卓越应用

在当今各类工业生产以及大型设施运行的场景中&#xff0c;冷却水泵系统起着至关重要的作用&#xff0c;它犹如保障整个运转体系顺畅运行的 “血液循环系统”&#xff0c;维持着设备适宜的温度环境&#xff0c;确保其稳定、高效地工作。而随着科技的不断发展&#xff0c;明达技术…

银河麒麟桌面系统——桌面鼠标变成x,窗口无关闭按钮的解决办法

银河麒麟桌面系统——桌面鼠标变成x&#xff0c;窗口无关闭按钮的解决办法 1、支持环境2、详细操作说明步骤1&#xff1a;用root账户登录电脑步骤2&#xff1a;导航到kylin-wm-chooser目录步骤3&#xff1a;编辑default.conf文件步骤4&#xff1a;重启电脑 3、结语 &#x1f49…

多线程常见问题集

一、多线程预防和避免线程死锁 如何预防死锁&#xff1f; 破坏死锁的产生的必要条件即可&#xff1a; 破坏请求与保持条件&#xff1a;一次性申请所有的资源。破坏不剥夺条件&#xff1a;占用部分资源的线程进一步申请其他资源时&#xff0c;如果申请不到&#xff0c;可以主动释…

Java ArrayList 与顺序表:在编程海洋中把握数据结构的关键之锚

我的个人主页 我的专栏&#xff1a;Java-数据结构&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;点赞❤ 收藏❤ 前言&#xff1a;在 Java编程的广袤世界里&#xff0c;数据结构犹如精巧的建筑蓝图&#xff0c;决定着程序在数据处理与存储时的效率、灵活性以…

【第三方云音乐播放器SPlayer本地安装结合内网穿透打造个性化远程音乐库】

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” 文章目录 前言1. 安装Docker2. 创建并启动Splayer容器3. 本地访问测试4. 公网远程访问本地Splayer4.1 内网穿…

easyui combobox 只能选择第一个问题解决

easyui combobox 只能选择第一个问题解决 问题现象 在拆分开票的时候&#xff0c;弹出框上面有一个下拉框用于选择需要新增的明细行&#xff0c;但是每次只能选择到第一个 选择第二条数据的时候默认选择到第一个了 代码如下 /*新增发票编辑窗口*/function addTicketDialog…

从零开始:Linux 环境下的 C/C++ 编译教程

个人主页&#xff1a;chian-ocean 文章专栏 前言&#xff1a; GCC&#xff08;GNU Compiler Collection&#xff09;是一个功能强大的编译器集合&#xff0c;支持多种语言&#xff0c;包括 C 和 C。其中 gcc 用于 C 语言编译&#xff0c;g 专用于 C 编译。 Linux GCC or G的安…

transformer.js(三):底层架构及性能优化指南

Transformer.js 是一个轻量级、功能强大的 JavaScript 库&#xff0c;专注于在浏览器中运行 Transformer 模型&#xff0c;为前端开发者提供了高效实现自然语言处理&#xff08;NLP&#xff09;任务的能力。本文将详细解析 Transformer.js 的底层架构&#xff0c;并提供实用的性…

STM32 Keil5 attribute 关键字的用法

这篇文章记录一下STM32中attribute的用法。之前做项目的时候产品需要支持远程升级&#xff0c;要求版本只能向上迭代&#xff0c;不支持回退。当时想到的方案是把版本号放到bin文件的头部&#xff0c;设备端收到bin文件的首包部数据后判断是否满足升级要求&#xff0c;这里就可…

aws服务--机密数据存储KMS(1)介绍和使用

在AWS(Amazon Web Services)中存储机密数据时,安全性和合规性是最重要的考虑因素。AWS 提供了多个服务和工具,帮助用户确保数据的安全性、机密性以及合规性。AWS Secrets Manager、KMS(Key Management Service)是推荐的存储机密数据的AWS服务和最佳实践。这里先看KMS。 …

51c~C语言~合集2

我自己的原文哦~ https://blog.51cto.com/whaosoft/12652943 一、嵌入式开发中的C语言编译器 如果你和一个优秀的程序员共事&#xff0c;你会发现他对他使用的工具非常熟悉&#xff0c;就像一个画家了解他的画具一样。----比尔.盖茨1 不能简单的认为是个工具 嵌入式程序开发…

ensp静态路由实验

一、实验目的 1、熟练掌握交换机的基本配置命令 2、熟练掌握静态路由的使用方法 3. 熟练掌握交换机端口模式 二、实验内容 需求&#xff1a; 根据要求利用现有实验设备组建小型局域网 实验设备&#xff1a; 交换机S37002台&#xff1b;PC机2台&#xff1b;路由器2台。 …

深度学习3

五、自动微分 1、基础概念 模块 autograd 负责自动计算张量操作的梯度&#xff0c;具有自动求导功能&#xff1b;autograd 创建一个动态计算图来跟踪张量的操作&#xff0c;每个张量是计算图中的一个节点&#xff0c;节点之间的操作构成图的边。 属性 requires_grad 决定…

路由器中继与桥接

一 . 背景 现在的路由器大多数已经开始支持多种网络连接模式&#xff0c;以下将以TP-Link迷你无线路由器为例进行展开介绍。在TP-Link迷你无线路由器上一般有AP&#xff08;接入点&#xff09;模式&#xff0c;Router&#xff08;无线路由&#xff09;模式&#xff0c;Repeate…

人工智能|计算机视觉——微表情识别(Micro expression recognition)的研究现状

一、简述 微表情是一种特殊的面部表情,与普通的表情相比,微表情主要有以下特点: 持续时间短,通常只有1/25s~1/3s;动作强度低,难以察觉;在无意识状态下产生,通常难以掩饰或伪装;对微表情的分析通常需要在视频中,而普通表情在图像中就可以分析。由于微表情在无意识状态…

嵌入式系统与OpenCV

目录 一、OpenCV 简介 二、嵌入式 OpenCV 的安装方法 1. Ubuntu 系统下的安装 2. 嵌入式 ARM 系统中的安装 3. Windows10 和树莓派系统下的安装 三、嵌入式 OpenCV 的性能优化 1. 介绍嵌入式平台上对 OpenCV 进行优化的必要性。 2. 利用嵌入式开发工具&#xff0c;如优…

React(五)——useContecxt/Reducer/useCallback/useRef/React.memo/useMemo

文章目录 项目地址十六、useContecxt十七、useReducer十八、React.memo以及产生的问题18.1组件嵌套的渲染规律18.2 React.memo18.3 引出问题 十九、useCallback和useMemo19.1 useCallback对函数进行缓存19.2 useMemo19.2.1 基本的使用19.2.2 缓存属性数据 19.2.3 对于更新的理解…

STM32设计学生宿舍监测控制系统-分享

目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 电路图采用Altium Designer进行设计&#xff1a; 三、实物设计图 四、程序源代码设计 五、获取资料内容 前言 本项目旨在利用STM32单片机为核心&#xff0c;结合传感器技术、无线通信技…

华为无线AC+AP组网实际应用小结

之前公司都是使用的H3C的交换机、防火墙以及无线AC和AP的&#xff0c;最近优化下无线网络&#xff0c;说新的设备用华为的&#xff0c;然后我是直到要部署的当天才知道用华为设备的&#xff0c;就很无语了&#xff0c;一点准备没有&#xff0c;以下为这次的实际操作记录吧&…