Mybatis的关系关联配置
前言
MyBatis是一个流行的Java持久化框架,它提供了一种简单而强大的方式来映射Java对象和关系数据库之间的数据。在MyBatis中,关系关联配置是一种用于定义对象之间关系的方式,它允许我们在查询数据库时同时获取相关联的对象。
在MyBatis中,有三种主要的关系关联配置方式:一对一(One-to-One)、一对多(One-to-Many)和多对多(Many-to-Many)。
一. Mybatis关系关联配置的优劣
1.1 MyBatis中的关系关联配置具有以下好处:
-
简化数据查询:通过关系关联配置,可以在查询数据时自动加载相关联的数据,无需手动编写复杂的SQL语句。这简化了数据查询的过程,减少了开发人员的工作量。
-
提高代码可读性:通过关系关联配置,可以将数据表之间的关系直观地映射到Java对象中。这使得代码更易于理解和维护,提高了代码的可读性。
-
减少数据库访问次数:通过关系关联配置,可以一次性加载多个相关联的数据,减少了与数据库的交互次数。这可以提高系统的性能和响应速度。
-
支持对象导航:通过关系关联配置,可以在Java对象中直接访问相关联的数据,而无需手动编写额外的查询语句。这简化了代码的编写,提高了开发效率。
1.2 然而,MyBatis中的关系关联配置也存在一些缺点:
-
学习成本较高:关系关联配置需要了解MyBatis的配置文件和相关标签的使用方法。对于初学者来说,可能需要花费一些时间来学习和理解这些配置。
-
配置复杂性:对于复杂的关系关联,配置文件可能会变得复杂和冗长。这可能增加了维护和调试的难度。
-
性能问题:如果关系关联配置不合理,可能会导致数据加载过多或过少,从而影响系统的性能。因此,在配置关系关联时需要注意性能优化的问题。
二. 关联关系的方向
在MyBatis中,关系关联的方向可以分为两种:单向关联和双向关联。
单向关联
单向关联表示关系只在一个方向上存在,其中一个表可以关联到另一个表,但反过来不行。在单向关联中,只有一个表的对象包含了关联对象的引用,而关联对象本身不包含对关联表的引用。
例如,假设我们有两个表:User和Order,一个用户可以有多个订单。在这种情况下,我们可以在User对象中定义一个关联属性List<Order> orders,表示一个用户关联多个订单。但是,在Order对象中并不包含对用户的引用。
单向关联的配置在MyBatis中非常简单,只需要在<resultMap>中使用<collection>或<association>标签来定义关联即可。
双向关联
双向关联表示关系在两个表之间是相互关联的,每个表的对象都包含了对另一个表的引用。这样,我们可以通过一个表的对象访问到关联表的对象,也可以通过关联表的对象访问到原始表的对象。
以前面的例子为例,我们可以在User对象中定义一个关联属性List<Order> orders,表示一个用户关联多个订单。同时,在Order对象中也定义一个关联属性User user,表示一个订单关联一个用户。
双向关联的配置相对复杂一些,需要在<resultMap>中使用<collection>或<association>标签来定义关联,并在关联对象中使用<association>标签来定义反向关联。
需要注意的是,无论是单向关联还是双向关联,都需要在MyBatis的映射文件中进行配置。关联的方向取决于我们在配置时定义的关联属性和关联对象的引用。
总结来说,MyBatis中的关系关联可以是单向关联或双向关联。单向关联表示关系只在一个方向上存在,而双向关联表示关系在两个表之间是相互关联的。在配置关系关联时,我们需要定义关联属性和关联对象的引用,以确定关联的方向。
三. 一对一关联配置
一对一关联配置用于表示两个对象之间的一对一关系(例如夫妻关系,人与身份证)。在数据库中,这通常通过外键来实现。在MyBatis中,我们可以使用<association>元素来配置一对一关联。该元素通常嵌套在<resultMap>元素中,并使用property属性指定关联对象的属性名。
以订单表(order)和订单项表(orderItem)为例,一个订单项对应一个订单。
编写一个vo类继承orderItem,在映射文件中可以通过这个类拿到订单表和订单项表的每个属性:
package com.xissl.vo;import com.xissl.model.HOrder;
import com.xissl.model.HOrderItem;/*** @author xissl* @create 2023-09-04 9:52*/
public class OrderItemVo extends HOrderItem {private HOrder horder;public HOrder getHorder() {return horder;}public void setHorder(HOrder horder) {this.horder = horder;}
}
在映射文件中配置一对一关联,HOrderItemMapper.xml
<resultMap id="OrderItemVoMap" type="com.xissl.vo.OrderItemVo"><result column="order_item_id" property="orderItemId"></result><result column="product_id" property="productId"></result><result column="quantity" property="quantity"></result><result column="oid" property="oid"></result><association property="horder" javaType="com.xissl.model.HOrder"><result column="order_id" property="orderId"></result><result column="order_no" property="orderNo"></result></association></resultMap><select id="selectByOrderItemId" resultMap="OrderItemVoMap" parameterType="java.lang.Integer">select * from t_hibernate_order o,t_hibernate_order_item oi
where o.order_id=oi.oid and order_item_id= #{orderItemId}</select>
在上面的示例中,我们首先定义了一个resultMap,用于映射OrderItem对象和Order对象之间的关系。在resultMap中,我们使用association元素来配置一对一关联。association元素中的property属性指定了在OrderItem对象中表示Order对象的属性名,javaType属性指定了关联对象的类型。
然后,我们定义了一个查询语句selectByOrderItemId,使用resultMap来映射查询结果。
编写mapper层接口:
OrderItemVo selectByOrderItemId(@Param("orderItemId") Integer orderItemId);
业务逻辑层:
package com.xissl.biz;import com.xissl.model.HOrderItem;
import com.xissl.vo.OrderItemVo;
import org.apache.ibatis.annotations.Param;public interface HOrderItemBiz {OrderItemVo selectByOrderItemId(Integer orderItemId);
}
实现业务层接口:
package com.xissl.biz.impl;import com.xissl.biz.HOrderItemBiz;
import com.xissl.mapper.HOrderItemMapper;
import com.xissl.vo.OrderItemVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;/*** @author xissl* @create 2023-09-04 9:59*/
@Service
public class HOrderItemBizImpl implements HOrderItemBiz {@Autowiredprivate HOrderItemMapper hOrderItemMapper;@Overridepublic OrderItemVo selectByOrderItemId(Integer orderItemId) {return hOrderItemMapper.selectByOrderItemId(orderItemId);}
}
测试代码及结果:
package com.xissl.biz.impl;import com.xissl.biz.HOrderItemBiz;
import com.xissl.vo.OrderItemVo;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import static org.junit.Assert.*;/*** @author xissl* @create 2023-09-04 10:01*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring-context.xml"})
public class HOrderItemBizImplTest {@Autowiredprivate HOrderItemBiz hOrderItemBiz;@Testpublic void selectByOrderItemId() {OrderItemVo orderItemVo = hOrderItemBiz.selectByOrderItemId(27);System.out.println(orderItemVo);System.out.println(orderItemVo.getHorder());}
}
四. 一对多关联配置
一对多关联配置用于表示一个对象与多个相关对象之间的关系(例如用户与用户的订单,锁和钥匙)。在数据库中,这通常通过外键来实现。在MyBatis中,我们可以使用<collection>元素来配置一对多关联。该元素通常嵌套在<resultMap>元素中,并使用property属性指定关联对象的属性名。
以订单表(order)和订单项表(orderItem)为例,一个订单可以有多个订单项。
编写一个vo类继承order,在映射文件中可以通过这个类拿到订单表和订单项表的每个属性:
package com.xissl.vo;import com.xissl.model.HOrder;
import com.xissl.model.HOrderItem;import java.util.ArrayList;
import java.util.List;/*** @author xissl* @create 2023-09-04 8:49*/
public class OrderVo extends HOrder {private List<HOrderItem> orderItems = new ArrayList<>();public List<HOrderItem> getOrderItems() {return orderItems;}public void setOrderItems(List<HOrderItem> orderItems) {this.orderItems = orderItems;}
}
在映射文件中配置一对多关联,HOrderMapper.xml
<resultMap id="OrderVoMap" type="com.xissl.vo.OrderVo" ><result column="order_id" property="orderId"></result><result column="order_no" property="orderNo"></result><collection property="orderItems" ofType="com.xissl.model.HOrderItem"><result column="order_item_id" property="orderItemId"></result><result column="product_id" property="productId"></result><result column="quantity" property="quantity"></result><result column="oid" property="oid"></result></collection></resultMap><select id="selectByOid" resultMap="OrderVoMap" parameterType="java.lang.Integer">select * from t_hibernate_order o,t_hibernate_order_item oiwhere o.order_id=oi.oid and order_id= #{oid}</select>
在上面的示例中,我们首先定义了一个resultMap,用于映射Order对象和OrderItem对象之间的关系。在resultMap中,我们使用collection元素来配置一对多关联。collection元素中的property属性指定了在Order对象中表示订单项表的属性名,ofType属性指定了关联对象的类型。
然后,我们定义了一个查询语句selectByOid,使用resultMap来映射查询结果。
编写mapper层接口:
OrderVo selectByOid(@Param("oid") Integer oid);
业务逻辑层:
OrderVo selectByOid(Integer oid);
实现业务层接口:
package com.xissl.biz.impl;import com.xissl.biz.HOrderBiz;
import com.xissl.mapper.HOrderMapper;
import com.xissl.vo.OrderVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;/*** @author xissl* @create 2023-09-04 9:08*/
@Service
public class HOrderBizImpl implements HOrderBiz {@Autowiredprivate HOrderMapper hOrderMapper;@Overridepublic OrderVo selectByOid(Integer oid) {return hOrderMapper.selectByOid(oid);}
}
测试代码及结果:
package com.xissl.biz.impl;import com.xissl.biz.HOrderBiz;
import com.xissl.vo.OrderVo;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import static org.junit.Assert.*;/*** @author xissl* @create 2023-09-04 9:10*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring-context.xml"})
public class HOrderBizImplTest {@Autowiredprivate HOrderBiz hOrderBiz;@Testpublic void selectByOid() {OrderVo orderVo = hOrderBiz.selectByOid(7);System.out.println(orderVo);orderVo.getOrderItems().forEach(System.out::println);}
}
五. 多对多关联配置
多对多关联配置用于表示两个对象之间的多对多关系(例如老师和学生)。在数据库中,这通常通过中间表来实现。在MyBatis中,我们可以使用<collection>元素来配置多对多关联。该元素通常嵌套在<resultMap>元素中,并使用property属性指定关联对象的属性名。
多对多关系就是和一对多的关系的大同小异,只是多对多的关系可以看成两个一对多关系。
vo类 BookVo:
package com.xissl.vo;import com.xissl.model.HBook;
import com.xissl.model.HCategory;import java.util.List;/*** @author xissl* @create 2023-09-04 10:43*/
public class HBookVo extends HBook {private List<HCategory> categories;public List<HCategory> getCategories() {return categories;}public void setCategories(List<HCategory> categories) {this.categories = categories;}
}
CategoryVo:
package com.xissl.vo;import com.xissl.model.HBook;
import com.xissl.model.HCategory;import java.util.ArrayList;
import java.util.List;/*** @author xissl* @create 2023-09-04 11:03*/
public class CategroyVo extends HCategory {private List<HBook> hbooks = new ArrayList<>();public List<HBook> getHbooks() {return hbooks;}public void setHbooks(List<HBook> hbooks) {this.hbooks = hbooks;}
}
映射文件 HBookMapper.xml
<resultMap id="HBookVoMap" type="com.xissl.vo.HBookVo"><result column="book_id" property="bookId"></result><result column="book_name" property="bookName"></result><result column="price" property="price"></result><collection property="categories" ofType="com.xissl.model.HCategory"><result column="category_id" property="categoryId"></result><result column="category_name" property="categoryName"></result></collection></resultMap><!-- 根据书籍id查询出书籍信息及所属类别--><select id="selectByBid" resultMap="HBookVoMap" parameterType="java.lang.Integer">select * from t_hibernate_book b, t_hibernate_book_category bc,
t_hibernate_category c where b.book_id = bc.bid and bc.cid = c.category_id
and b.book_id= #{bid}</select>
HCategoryMapper.xml
<resultMap id="CategoryVoMap" type="com.xissl.vo.CategroyVo"><result column="category_id" property="categoryId"></result><result column="category_name" property="categoryName"></result><collection property="hbooks" ofType="com.xissl.model.HBook"><result column="book_id" property="bookId"></result><result column="book_name" property="bookName"></result><result column="price" property="price"></result></collection></resultMap><select id="selectByCategroyId" resultMap="CategoryVoMap" parameterType="java.lang.Integer">select * from t_hibernate_book b, t_hibernate_book_category bc,
t_hibernate_category c where b.book_id = bc.bid and bc.cid = c.category_id
and c.category_id= #{cid}</select>
mapper层接口 BookMapper:
HBookVo selectByBid(@Param("bid") Integer bid);
CategoryMapper
HBookVo selectByBid(@Param("bid") Integer bid);
业务逻辑层:
HBookVo selectByBid(Integer bid);
CategroyVo selectByCategroyId(Integer cid);
实现业务层 BookBiz
package com.xissl.biz.impl;import com.xissl.biz.HBookBiz;
import com.xissl.mapper.HBookMapper;
import com.xissl.vo.HBookVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;/*** @author xissl* @create 2023-09-04 10:55*/
@Service
public class HBookBizImpl implements HBookBiz {@Autowiredprivate HBookMapper hBookMapper;@Overridepublic HBookVo selectByBid(Integer bid) {return hBookMapper.selectByBid(bid);}
}
实现CategoryBiz
package com.xissl.biz.impl;import com.xissl.biz.HCategoryBiz;
import com.xissl.mapper.HCategoryMapper;
import com.xissl.vo.CategroyVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;/*** @author xissl* @create 2023-09-04 11:11*/
@Service
public class HCategoryBizImpl implements HCategoryBiz {@Autowiredprivate HCategoryMapper hCategoryMapper;@Overridepublic CategroyVo selectByCategroyId(Integer cid) {return hCategoryMapper.selectByCategroyId(cid);}
}
测试代码及结果:
package com.xissl.biz.impl;import com.xissl.biz.HBookBiz;
import com.xissl.vo.HBookVo;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import static org.junit.Assert.*;/*** @author xissl* @create 2023-09-04 10:56*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring-context.xml"})
public class HBookBizImplTest {@Autowiredprivate HBookBiz hBookBiz;@Testpublic void selectByBid() {HBookVo hBookVo = hBookBiz.selectByBid(8);System.out.println(hBookVo);hBookVo.getCategories().forEach(System.out::println);}
}
package com.xissl.biz.impl;import com.xissl.biz.HCategoryBiz;
import com.xissl.vo.CategroyVo;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import static org.junit.Assert.*;/*** @author xissl* @create 2023-09-04 11:12*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring-context.xml"})
public class HCategoryBizImplTest {@Autowiredprivate HCategoryBiz hCategoryBiz;@Testpublic void selectByCategroyId() {CategroyVo categroyVo = hCategoryBiz.selectByCategroyId(8);System.out.println(categroyVo);categroyVo.getHbooks().forEach(System.out::println);}
}
除了上述关系关联配置方式,MyBatis还提供了其他一些配置选项,如延迟加载(Lazy Loading)和级联操作(Cascade)。延迟加载允许我们在需要时才加载关联对象的数据,而级联操作允许我们在操作主对象时同时操作关联对象。
总结起来,MyBatis中的关系关联配置提供了一种灵活而强大的方式来处理对象之间的关系。通过合理配置关系关联,我们可以轻松地进行复杂的数据库查询和操作。
相关文章:

Mybatis的关系关联配置
前言 MyBatis是一个流行的Java持久化框架,它提供了一种简单而强大的方式来映射Java对象和关系数据库之间的数据。在MyBatis中,关系关联配置是一种用于定义对象之间关系的方式,它允许我们在查询数据库时同时获取相关联的对象。 在MyBatis中&…...

【知识积累】准确率,精确率,召回率,F1值
二分类的混淆矩阵(预测图片是否是汉堡) 分类器到底分对了多少? 预测的图片中正确的有多少? 有多少张应该预测为是的图片没有找到? 精确率和召回率在某种情况下会呈现此消彼长的状况。举个极端的例子…...
什么是分布式系统?
分布式系统是由多个独立的计算机或计算节点组成的系统,这些节点通过消息传递或共享数据的方式进行协调和通信,以实现共同的目标。分布式系统的设计目标是提高系统的可靠性、可扩展性、性能和容错性。 在一个分布式系统中,各个计算机节点之间…...
[AGC043D] Merge Triplets
题目传送门 引 很有意思的计数题 解法 考虑经过操作后得到的排列的性质 性质1: 设 p r e ( i ) pre(i) pre(i):前i个位置的最大值,则不会出现超过3个的连续位置的 p r e pre pre相同 必要性: 考虑反证,若有超过 3 3 3个的连续…...
2023年人工智能开源项目前20名
推荐:使用 NSDT场景编辑器快速搭建3D应用场景 1. Tensorflow 2. Hugging Face Transformers 3. Opencv 4. Pytorch 5. Keras 6. Stable Diffusion 7. Deepfacelab 8. Detectron2 9. Apache Mxnet 10. Fastai 11. Open Assistant 12. Mindsdb 13. Dall E…...

ThinkPHP 集成 jwt 技术 token 验证
ThinkPHP 集成 jwt 技术 token 验证 一、思路流程二、安装 firebase/php-jwt三、封装token类四、创建中间件,检验Token校验时效性五、配置路由中间件六、写几个测试方法,通过postman去验证 一、思路流程 客户端使用用户名和密码请求登录服务端收到请求&…...

gerrit 如何提交进行review
前言 本文主要介绍如何使用gerrit进行review。 下述所有流程都是参考: https://gerrit-review.googlesource.com/Documentation/intro-gerrit-walkthrough.html 先给一个commit后但是还没有push上去的一个办法: git reset --hard HEAD^可以多次reset.…...
罗勇军 →《算法竞赛·快冲300题》每日一题:“游泳” ← DFS+剪枝
【题目来源】http://oj.ecustacm.cn/problem.php?id1753http://oj.ecustacm.cn/viewnews.php?id1023【题目描述】 游泳池可以等分为n行n列的小区域,每个区域的温度不同。 小明现在在要从游泳池的左上角(1, 1)游到右下角(n, n),小明只能向上下左右四个方…...
【教程】PyTorch Timer计时器
转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn] OpenCV的Timer计时器可以看这篇:Python Timer和TimerFPS计时工具类 Timer作用说明:统计某一段代码的运行耗时。 直接上代码,开箱即用。 import time import torch import os …...

因果推断(六)基于微软框架dowhy的因果推断
因果推断(六)基于微软框架dowhy的因果推断 DoWhy 基于因果推断的两大框架构建:「图模型」与「潜在结果模型」。具体来说,其使用基于图的准则与 do-积分来对假设进行建模并识别出非参数化的因果效应;而在估计阶段则主要…...

探索隧道ip如何助力爬虫应用
在数据驱动的世界中,网络爬虫已成为获取大量信息的重要工具。然而,爬虫在抓取数据时可能会遇到一些挑战,如IP封禁、访问限制等。隧道ip(TunnelingProxy)作为一种强大的解决方案,可以帮助爬虫应用更高效地获…...
题目:2629.复合函数
题目来源: leetcode题目,网址:2629. 复合函数 - 力扣(LeetCode) 解题思路: 倒序遍历计算。 解题代码: /*** param {Function[]} functions* return {Function}*/ var compose function(…...

【实训项目】精点考研
1.设计摘要 如果说高考是一次能够改变命运的考试,那么考研应该是另外一次。为什么那么多人都要考研呢?从中国教育在线官方公布是考研动机调查来看,大家扎堆考研的原因大概集中在这6个方面:本科就业压力大,提升竞争力、…...

软件测试Pytest实现接口自动化应该如何在用例执行后打印日志到日志目录生成日志文件?
Pytest可以使用内置的logging模块来实现接口自动化测试用例执行后打印日志到日志目录以生成日志文件。以下是实现步骤: 1、在pytest配置文件(conftest.py)中,定义一个日志输出路径,并设置logging模块。 import loggi…...

深入理解作用域、作用域链和闭包
🎬 岸边的风:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 📚 前言 📘 1. 词法作用域 📖 1.2 示例 📖 1.3 词法作用域的…...

7款适合3D建模和渲染的GPU推荐
选择一款完美的 GPU 并不是一件容易的事;您不仅必须确保有特定数量的线程和内核来处理图像,而且还应该有足够的 RAM。 这是因为 3D 渲染是一个活跃的工作过程,因为您必须坐在 PC 前并持续与软件交互。为了在 3D 场景中积极工作,您…...
边缘计算物联网网关在机械加工行业的应用及作用分享
随着工业4.0的推进,物联网技术正在逐渐渗透到各个行业领域。机械加工行业作为制造业的基础领域之一,其生产过程的自动化、智能化水平直接影响到产品质量和生产效率。边缘计算物联网网关作为物联网技术的重要组成部分,在机械加工行业中发挥着越…...

(笔记六)利用opencv进行图像滤波
(1)自定义卷积核图像滤波 import numpy as np import matplotlib.pyplot as plt import cv2 as cvimg_path r"D:\data\test6-6.png" img cv.imread(img_path)# 图像滤波 ker np.ones((6, 6), np.float32)/36 # 构建滤波器(卷积…...

WPF C# .NET7 基础学习
学习视频地址:https://www.bilibili.com/video/BV1hx4y1G7C6?p3&vd_source986db470823ebc16fe0b3d235addf050 开发工具:Visual Studio 2022 Community 基础框架:.Net 6.0 下载创建过程略 .Net和.Framework 区别是Net是依赖项ÿ…...
QT里使用sqlite的问题,好多坑
1. 我使用sqlite,开发机上好好的,测试机上却不行。后来发现是缺少驱动(Driver not loaded Driver not loaded),代码检查了又检查,发现应该是缺少dll文件(系统不提示,是自己使用 QMes…...

(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

ArcGIS Pro+ArcGIS给你的地图加上北回归线!
今天来看ArcGIS Pro和ArcGIS中如何给制作的中国地图或者其他大范围地图加上北回归线。 我们将在ArcGIS Pro和ArcGIS中一同介绍。 1 ArcGIS Pro中设置北回归线 1、在ArcGIS Pro中初步设置好经纬格网等,设置经线、纬线都以10间隔显示。 2、需要插入背会归线…...
41道Django高频题整理(附答案背诵版)
解释一下 Django 和 Tornado 的关系? Django和Tornado都是Python的web框架,但它们的设计哲学和应用场景有所不同。 Django是一个高级的Python Web框架,鼓励快速开发和干净、实用的设计。它遵循MVC设计,并强调代码复用。Django有…...

Linux操作系统共享Windows操作系统的文件
目录 一、共享文件 二、挂载 一、共享文件 点击虚拟机选项-设置 点击选项,设置文件夹共享为总是启用,点击添加,可添加需要共享的文件夹 查询是否共享成功 ls /mnt/hgfs 如果显示Download(这是我共享的文件夹)&…...

Linux入门(十五)安装java安装tomcat安装dotnet安装mysql
安装java yum install java-17-openjdk-devel查找安装地址 update-alternatives --config java设置环境变量 vi /etc/profile #在文档后面追加 JAVA_HOME"通过查找安装地址命令显示的路径" #注意一定要加$PATH不然路径就只剩下新加的路径了,系统很多命…...