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

认识Mybatis的关联关系映射,灵活关联表对象之间的关系

                              

目录    

一、概述

( 1 )  介绍

( 2 )  关联关系映射

( 3 ) 关联讲述

二、一对一关联映射

2.1 数据库创建

2.2 配置文件 

2.3 代码生成

2.4 编写测试

三、一对多关联映射

四 、多对多关联映射

给我们带来的收获


一、概述

( 1 )  介绍

关联关系映射是指在数据库中,通过定义表之间的关联关系,将多个表的数据进行关联查询和映射的过程。通过关联关系映射,可以方便地获取相关联表的数据,并将其映射到对应的实体类中。

Mybatis是一种Java持久层框架,它提供了一种将数据库表和Java对象之间进行关联关系映射的方式。在Mybatis中,可以通过配置文件或注解的方式,定义表之间的关联关系,并将查询结果映射到对应的Java对象中。通过Mybatis的关联关系映射,可以方便地进行复杂的数据库查询操作。

在Mybatis中,可以通过配置映射文件来实现关联关系的映射。通过定义实体类和映射文件,可以将数据库中的多个表进行关联查询,并将查询结果映射到实体类的属性上。

在进行数据库查询操作时,通过关联查询获取到关联表中的相关数据,并将其映射到实体类中的关联属性上。

总结来说,关联关系映射是指通过配置映射文件,将数据库中的关联表进行关联查询,并将查询结果映射到实体类的关联属性上。通过扩展关联关系映射,可以方便地进行复杂的数据库查询操作,提高查询效率和简化数据操作的代码。

( 2 )  关联关系映射

关联关系映射在Mybatis中主要通过三种方式实现:一对一关联和一对多关联及多对多关联。

一对一关联:
在一对一关联中,两个表之间存在一对一的关系,例如学生表和身份证表,一个学生只有一个身份证,而一个身份证也只属于一个学生。在Mybatis中,可以通过在实体类中定义关联属性,然后在映射文件中使用<association>标签来定义关联关系。通过配置映射关系,可以查询到学生表和身份证表的数据,并将其映射到对应的实体类中。

一对多关联:
在一对多关联中,两个表之间存在一对多的关系,例如部门表和员工表,一个部门可以有多个员工,而一个员工只属于一个部门。在Mybatis中,可以通过在实体类中定义关联属性,然后在映射文件中使用<collection>标签来定义关联关系。通过配置映射关系,可以查询到部门表和员工表的数据,并将其映射到对应的实体类中。

多对多关联:

是指两个表之间存在多对多的关联关系,即一个表的一条记录可以对应另一个表的多条记录,反之亦然。在数据库中,多对多关系通常需要通过中间表来实现。

在Mybatis中,可以通过定义中间表来映射多对多关系。假设有两个表,学生表和课程表,一个学生可以选择多门课程,而一门课程也可以被多个学生选择。为了映射这种多对多关系,需要创建一个中间表,例如选课表,用来记录学生和课程的关联关系。

( 3 ) 关联讲述

在关联关系映射中,还可以使用嵌套查询和延迟加载等技术来优化查询性能。嵌套查询是指在查询主表数据时,同时查询关联表的数据;延迟加载是指在需要使用关联数据时才进行查询,避免一次性查询所有关联数据。这些技术可以根据具体需求进行配置和使用。

在进行关联关系映射时,可以使用不同的标签来配置不同的关联关系,如<association>标签用于一对一关联,<collection>标签用于一对多关联。通过配置映射关系,可以根据具体需求查询到相关的数据,并将其映射到实体类中。

总结来说,关联关系映射是Mybatis中非常重要的特性之一,关联关系映射是指通过配置映射文件,将数据库中的关联表进行关联查询,并将查询结果映射到实体类的关联属性上。通过扩展关联关系映射,可以方便地进行复杂的数据库查询操作,也方便地进行表之间的关联查询和映射操作,提高了数据查询和操作的灵活性和效率及简化数据操作的代码。

二、一对一关联映射

这里进行一对一关联关系实例演示

这里的代码基于我博客文章中的 : Spring与Mybatis集成且Aop整合

2.1 数据库创建

创建名为 t_hibernate_book (书籍表) 数据表

创建名为 t_hibernate_book_category (书籍类别表) 数据表

其中名为 bid 的属性字段为 t_hibernate_book (书籍表) 的 bid(主键) 的外键

其中名为 cid 的属性字段为 t_hibernate_category (类别表) 的 category_id (主键) 的外键

创建名为 t_hibernate_category (类别表) 数据表

 创建名为 t_hibernate_order (订单表) 数据表

 创建名为 t_hibernate_order_item (订单详情表) 数据表

其中名为 order_id 的属性字段为 t_hibernate_order (订单表) 的 oid (主键) 的外键

2.2 配置文件 

修改名为 generatorConfig.xml 的 配置文件,修改后的所有代码如下 : 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >
<generatorConfiguration><!-- 引入配置文件 --><properties resource="jdbc.properties"/><!--指定数据库jdbc驱动jar包的位置--><classPathEntry location="D:\\temp\\mvn_repository\\mysql\\mysql-connector-java\\5.1.44\\mysql-connector-java-5.1.44.jar"/><!-- 一个数据库一个context --><context id="infoGuardian"><!-- 注释 --><commentGenerator><property name="suppressAllComments" value="true"/><!-- 是否取消注释 --><property name="suppressDate" value="true"/> <!-- 是否生成注释代时间戳 --></commentGenerator><!-- jdbc连接 --><jdbcConnection driverClass="${jdbc.driver}"connectionURL="${jdbc.url}" userId="${jdbc.username}" password="${jdbc.password}"/><!-- 类型转换 --><javaTypeResolver><!-- 是否使用bigDecimal, false可自动转化以下类型(Long, Integer, Short, etc.) --><property name="forceBigDecimals" value="false"/></javaTypeResolver><!-- 01 指定javaBean生成的位置 --><!-- targetPackage:指定生成的model生成所在的包名 --><!-- targetProject:指定在该项目下所在的路径  --><javaModelGenerator targetPackage="com.CloudJun.model"targetProject="src/main/java"><!-- 是否允许子包,即targetPackage.schemaName.tableName --><property name="enableSubPackages" value="false"/><!-- 是否对model添加构造函数 --><property name="constructorBased" value="true"/><!-- 是否针对string类型的字段在set的时候进行trim调用 --><property name="trimStrings" value="false"/><!-- 建立的Model对象是否 不可改变  即生成的Model对象不会有 setter方法,只有构造方法 --><property name="immutable" value="false"/></javaModelGenerator><!-- 02 指定sql映射文件生成的位置 --><sqlMapGenerator targetPackage="com.CloudJun.mapper"targetProject="src/main/java"><!-- 是否允许子包,即targetPackage.schemaName.tableName --><property name="enableSubPackages" value="false"/></sqlMapGenerator><!-- 03 生成XxxMapper接口 --><!-- type="ANNOTATEDMAPPER",生成Java Model 和基于注解的Mapper对象 --><!-- type="MIXEDMAPPER",生成基于注解的Java Model 和相应的Mapper对象 --><!-- type="XMLMAPPER",生成SQLMap XML文件和独立的Mapper接口 --><javaClientGenerator targetPackage="com.CloudJun.mapper"targetProject="src/main/java" type="XMLMAPPER"><!-- 是否在当前路径下新加一层schema,false路径com.oop.eksp.user.model, true:com.oop.eksp.user.model.[schemaName] --><property name="enableSubPackages" value="false"/></javaClientGenerator><!-- 配置表信息 --><!-- schema即为数据库名 --><!-- tableName为对应的数据库表 --><!-- domainObjectName是要生成的实体类 --><!-- enable*ByExample是否生成 example类 --><!--<table schema="" tableName="t_book" domainObjectName="Book"--><!--enableCountByExample="false" enableDeleteByExample="false"--><!--enableSelectByExample="false" enableUpdateByExample="false">--><!--&lt;!&ndash; 忽略列,不生成bean 字段 &ndash;&gt;--><!--&lt;!&ndash; <ignoreColumn column="FRED" /> &ndash;&gt;--><!--&lt;!&ndash; 指定列的java数据类型 &ndash;&gt;--><!--&lt;!&ndash; <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> &ndash;&gt;--><!--</table>--><table schema="" tableName="t_hibernate_book" domainObjectName="HBook"enableCountByExample="false" enableDeleteByExample="false"enableSelectByExample="false" enableUpdateByExample="false"></table><table schema="" tableName="t_hibernate_category" domainObjectName="Category"enableCountByExample="false" enableDeleteByExample="false"enableSelectByExample="false" enableUpdateByExample="false"></table><table schema="" tableName="t_hibernate_book_category" domainObjectName="HBookCategory"enableCountByExample="false" enableDeleteByExample="false"enableSelectByExample="false" enableUpdateByExample="false"></table><table schema="" tableName="t_hibernate_order" domainObjectName="Order"enableCountByExample="false" enableDeleteByExample="false"enableSelectByExample="false" enableUpdateByExample="false"></table><table schema="" tableName="t_hibernate_order_item" domainObjectName="OrderItem"enableCountByExample="false" enableDeleteByExample="false"enableSelectByExample="false" enableUpdateByExample="false"></table></context>
</generatorConfiguration>

2.3 代码生成

配置好 generatorConfig.xml 的配置文件后进行,自动生成代码,操作如图 : 

 代码生成后就会出现以下的实体类对象,配置文件,接口类,如图 : 

 

                            然后将每个实体类对象里面重写一下toString()方法

 2.4 编写测试

创建一个 名为 OrderItemVo 的类,继承OrderItem类,及属性有Order对象

package com.CloudJun.vo;import com.CloudJun.model.Order;
import com.CloudJun.model.OrderItem;/*** @author CloudJun* @create  2023-08-26 15:54*/
public class OrderItemVo extends OrderItem {private Order order;public Order getOrder() {return order;}public void setOrder(Order order) {this.order = order;}}

在自动生成的OrderItemMapper.xml配置文件中进行增加以下配置

<resultMap id="OrderItemMap" type="com.CloudJun.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="order" javaType="com.CloudJun.model.Order"><result column="order_id" property="orderId" ></result><result column="order_no" property="orderNo" ></result></association>
</resultMap>
<select id="selectByBiid" resultMap="OrderItemMap" parameterType="java.lang.Integer" >SELECT * FROMt_hibernate_order o ,t_hibernate_order_item oiWHERE o.order_id = oi.oidAND oi.order_item_id = #{oiid}
</select>

在自动生成的 OrderItemMapper 接口中进行增加以下代码

 OrderItemVo selectByBiid(@Param("oiid") Integer oiid);

创建一个接口名为 : OrderItemBiz 接口

package com.CloudJun.biz;import com.CloudJun.model.OrderItem;
import com.CloudJun.vo.OrderItemVo;
import org.apache.ibatis.annotations.Param;public interface OrderItemBiz {OrderItemVo selectByBiid(Integer oiid);}

实现以上创建的接口,创建一个实现了名为 OrderItemBizImpl

package com.CloudJun.biz.impl;import com.CloudJun.biz.OrderItemBiz;
import com.CloudJun.mapper.OrderItemMapper;
import com.CloudJun.vo.OrderItemVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;/*** @author CloudJun* @create  2023-08-26 16:23*/
@Service
public class OrderItemBizImpl implements OrderItemBiz {@Autowiredprivate OrderItemMapper orderItemMapper;@Overridepublic OrderItemVo selectByBiid(Integer oiid) {return orderItemMapper.selectByBiid(oiid);}
}

创建一个测试类 名为 Test01 ,用来进行方法测试

package com.CloudJun.biz.impl;import com.CloudJun.biz.OrderBiz;
import com.CloudJun.biz.OrderItemBiz;
import com.CloudJun.vo.OrderItemVo;
import com.CloudJun.vo.OrderVo;
import org.junit.After;
import org.junit.Before;
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;/*** @author CloudJun* @create  2023-08-26 15:03*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring-context.xml"})
public class Test01 {@Autowiredprivate OrderItemBiz orderItemBiz;@Beforepublic void setUp() throws Exception {}@Afterpublic void tearDown() throws Exception {}@Testpublic void selectByBiid() {OrderItemVo orderItemVo = orderItemBiz.selectByBiid(27);System.out.println(orderItemVo);System.out.println(orderItemVo.getOrder());}}

执行测试类中selectByBiid()的方法,结果如图 : 

三、一对多关联映射

创建一个 名为 OrdeVo 的类,继承Order类,及属性有List<OrderItem>集合

用来存储查询到的OrderItem对象,因为是一对多所有查询出有多个对象

package com.CloudJun.vo;import com.CloudJun.model.Order;
import com.CloudJun.model.OrderItem;
import com.CloudJun.utils.PageBean;import java.util.ArrayList;
import java.util.List;/*** @author CloudJun* @create  2023-08-26 14:54*/
public class OrderVo extends Order {private List<OrderItem> orderItems = new ArrayList<OrderItem>();public List<OrderItem> getOrderItems() {return orderItems;}public void setOrderItems(List<OrderItem> orderItems) {this.orderItems = orderItems;}}

在自动生成的 OrderMapper.xml 配置文件中增加以下配置

  <resultMap id="OrderVoMap" type="com.CloudJun.vo.OrderVo"><result column="order_id" property="orderId" ></result><result column="order_no" property="orderNo" ></result><collection property="orderItems" ofType="com.CloudJun.model.OrderItem"><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 * FROMt_hibernate_order o ,t_hibernate_order_item oiWHERE o.order_id = oi.oidAND o.order_id = #{oid}</select>

在自动生成的 OrderMapper接口中进行增加以下代码

OrderVo selectByOid(@Param("oid") Integer oid);

创建一个接口名为 : OrderBiz 接口

package com.CloudJun.biz;import com.CloudJun.vo.OrderVo;public interface OrderBiz {OrderVo selectByOid(Integer oid);}

在实现以上 OrderBiz 接口,创建一个实现类,名为 OrderBizImpl 

package com.CloudJun.biz.impl;import com.CloudJun.biz.OrderBiz;
import com.CloudJun.mapper.OrderMapper;
import com.CloudJun.vo.OrderVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;/*** @author CloudJun* @create  2023-08-26 15:06*/
@Service
public class OrderBizImpl implements OrderBiz {@Autowiredprivate OrderMapper orderMapper;@Overridepublic OrderVo selectByOid(Integer oid) {return orderMapper.selectByOid(oid);}
}

在测试类( Test01 )中增加以下测试方法及接口

    @Autowiredprivate OrderBiz orderBiz;@Testpublic void selectByOid() {OrderVo orderVo = orderBiz.selectByOid(7);System.out.println(orderVo);orderVo.getOrderItems().forEach(System.out::println);}

执行其中的方法进行测试,结果为如图  :

 

四 、多对多关联映射

在自动生成的 HBookMapper.xml 配置文件中增加以下配置

  <resultMap id="HBookVoMap" type="com.CloudJun.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.CloudJun.model.Category"><result column="category_id" property="categoryId"></result><result column="category_name" property="categoryName"></result></collection></resultMap><select id="selectByBookId" resultMap="HBookVoMap" parameterType="java.lang.Integer" >SELECT * FROMt_hibernate_book b,t_hibernate_book_category bc ,t_hibernate_category cWHERE b.book_id = bc.bidAND bc.cid = c.category_idAND b.book_id = #{bid}</select>

在自动生成的 HBookMapper 接口 中增加以下方法

  HBookVo selectByBookId(@Param("bid") Integer bid);

创建一个接口名为 HBookBiz 

package com.CloudJun.biz;import com.CloudJun.vo.HBookVo;
import org.apache.ibatis.annotations.Param;public interface HBookBiz {HBookVo selectByBookId(@Param("bid") Integer bid);}

在实现以上 HBookBiz 接口,创建一个实现类,名为 HBookBizImpl 

package com.CloudJun.biz.impl;import com.CloudJun.biz.HBookBiz;
import com.CloudJun.mapper.HBookMapper;
import com.CloudJun.vo.HBookVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;/*** @author CloudJun* @create  2023-08-26 17:43*/
@Service
public class HBookBizImpl implements HBookBiz {@Autowiredprivate HBookMapper hBookMapper;@Overridepublic HBookVo selectByBookId(Integer bid) {return hBookMapper.selectByBookId(bid);}}

在测试类( Test01 )中增加以下测试方法及接口

    @Autowiredprivate HBookBiz hbookBiz;@Testpublic void selectByBookId() {HBookVo hBookVo = hbookBiz.selectByBookId(8);System.out.println(hBookVo);hBookVo.getCategories().forEach(System.out::println);}

执行其中的方法进行测试,结果为如图  :

 

在自动生成的 CategoryMapper.xml 配置文件中增加以下配置

  <resultMap id="CategoryVoMap" type="com.CloudJun.vo.CategoryVo"><result column="category_id" property="categoryId"></result><result column="category_name" property="categoryName"></result><collection property="books" ofType="com.CloudJun.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="selectByCategoryId" resultMap="CategoryVoMap" parameterType="java.lang.Integer" >SELECT * FROMt_hibernate_book b,t_hibernate_book_category bc ,t_hibernate_category cWHERE b.book_id = bc.bidAND bc.cid = c.category_idAND c.category_id = #{cid}</select>

在自动生成的 CategoryMapper 接口 中增加以下方法

CategoryVo selectByCategoryId(@Param("cid") Integer cid);

创建一个接口名为 CategoryBiz 

package com.CloudJun.biz;import com.CloudJun.vo.CategoryVo;public interface CategoryBiz {CategoryVo selectByCategoryId( Integer cid);}

在实现以上 CategoryBiz 接口,创建一个实现类,名为 CategoryBizImpl 

package com.CloudJun.biz.impl;import com.CloudJun.biz.CategoryBiz;
import com.CloudJun.mapper.CategoryMapper;
import com.CloudJun.vo.CategoryVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;/*** @author CloudJun* @create  2023-08-26 17:56*/
@Service
public class CategoryBizImpl implements CategoryBiz {@Autowiredprivate CategoryMapper categoryMapper;@Overridepublic CategoryVo selectByCategoryId(Integer cid) {return categoryMapper.selectByCategoryId(cid);}}

在测试类( Test01 )中增加以下测试方法及接口 

    @Autowiredprivate CategoryBiz categoryBiz;    @Testpublic void selectByCategoryId() {CategoryVo categoryVo = categoryBiz.selectByCategoryId(8);System.out.println(categoryVo);categoryVo.getBooks().forEach(System.out::println);}

执行其中的方法进行测试,结果为如图  : 

 

给我们带来的收获

学习Mybatis的关联关系映射可以带来以下收获和认识:

  • 1. 灵活的数据查询:通过关联关系映射,可以方便地进行多表关联查询,获取到关联表中的相关数据。这样可以减少数据库查询的次数,提高查询效率,并且可以一次性获取到所有关联数据,减少了后续数据操作的开销。
  • 2. 数据的一致性和完整性:在进行关联关系映射时,可以通过定义中间表和映射关系,保证数据的一致性和完整性。在插入、更新和删除数据时,需要同时维护中间表的数据,以保证关联关系的正确性。
  • 3. 简化数据操作:通过关联关系映射,可以将关联表中的数据映射到实体类的关联属性上,使得获取关联数据变得简单和直观。不需要手动编写复杂的SQL语句,只需要通过配置映射文件,就可以方便地获取到关联数据。
  • 4. 提高代码的可读性和可维护性:通过Mybatis的关联关系映射,可以将数据操作的逻辑和SQL语句分离,使得代码更加清晰和易于理解。同时,通过使用映射文件,可以方便地修改和维护数据操作的逻辑,提高代码的可维护性。

总结来说,学习Mybatis的关联关系映射可以带来灵活的数据查询、数据的一致性和完整性、简化数据操作以及提高代码的可读性和可维护性等好处。通过掌握关联关系映射的知识,可以更加有效地进行数据库操作和数据查询,提高开发效率和代码质量。

 

相关文章:

认识Mybatis的关联关系映射,灵活关联表对象之间的关系

目录 一、概述 ( 1 ) 介绍 ( 2 ) 关联关系映射 ( 3 ) 关联讲述 二、一对一关联映射 2.1 数据库创建 2.2 配置文件 2.3 代码生成 2.4 编写测试 三、一对多关联映射 四 、多对多关联映射 给我们带来的收获 一、概述 ( 1 ) 介绍 关联关系映射是指在数据库中&…...

如何开发一款唯一艺术平台 区块链 /数字藏品

艺术作品是人类文化的瑰宝&#xff0c;而艺术平台则是连接艺术家与观众的桥梁。如何开发一款独一无二的艺术平台&#xff0c;既要满足专业艺术作品展示的要求&#xff0c;又要提供深度思考的空间&#xff0c;这是我们所面临的挑战。本文将从专业性、思考深度和逻辑性等多个方面…...

【UniApp开发小程序】私聊功能后端实现 (买家、卖家 沟通商品信息)【后端基于若依管理系统开发】

声明 本文提炼于个人练手项目&#xff0c;其中的实现逻辑不一定标准&#xff0c;实现思路没有参考权威的文档和教程&#xff0c;仅为个人思考得出&#xff0c;因此可能存在较多本人未考虑到的情况和漏洞&#xff0c;因此仅供参考&#xff0c;如果大家觉得有问题&#xff0c;恳…...

运维高级学习--Kubernetes(K8s 1.28.x)部署

一、基础环境配置&#xff08;所有主机操作&#xff09; 主机名规划 序号 主机ip 主机名规划1 192.168.1.30 kubernetes-master.openlab.cn kubernetes-master2 192.168.1.31 kubernetes-node1.openlab.cn kubernetes-node13 192.168.1.32 kubernetes-node2…...

Apache zookeeper kafka 开启SASL安全认证 —— 筑梦之路

简介 Kafka是一个高吞吐量、分布式的发布-订阅消息系统。Kafka核心模块使用Scala语言开发&#xff0c;支持多语言&#xff08;如Java、Python、Go等&#xff09;客户端&#xff0c;它可以水平扩展和具有高吞吐量特性而被广泛使用&#xff0c;并与多类开源分布式处理系统进行集成…...

lintcode 1017 · 相似的RGB颜色【进制计算】

题目链接&#xff0c;题目描述 https://www.lintcode.com/problem/1017 在本题中&#xff0c;每个大写字母代表从“0”到“f”的一些十六进制数字。红绿蓝三元色#AABBCC可以简写为#ABC。 例如&#xff0c;#15c是颜色#1155cc的简写。现在&#xff0c;定义两种颜色#ABCDEF和#UV…...

全国首台!浙江机器人产业集团发布垂起固定翼无人机-机器人自动换电机巢

展示突破性创新技术&#xff0c;共话行业发展趋势。8月25日&#xff0c;全国首台垂起固定翼无人机-机器人自动换电机巢新品发布会暨“科创中国宁波”无人机产业趋势分享会在余姚市机器人小镇成功举行。 本次活动在宁波市科学技术协会、余姚市科学技术协会指导下&#xff0c;由浙…...

采用 UML 对软件系统进行建模的基本框架

UML 包括一些可以相互组合为图标的图形元素&#xff0c; 通过提供不同形式的图形来 表述从软件分析开始的软件开发全过程的描述&#xff0c;一个图就是系统架构在某个侧面的 表示&#xff0c;所有的图组成了系统的完整视图。UML 主要提供了以下五类图&#xff1a; &#xff…...

编译tiny4412 Linux 内核

工作环境 Ubuntu 22 交叉编译器 4.5.1 解压Linux内核源码&#xff0c;进入目录 将官方配置完好的defconfig文件作为配置文件 cp tiny4412_linux_defconfig .config由于内核版本较低&#xff0c;需要下载低版本的gcc&#xff0c;选择下载gcc-9与g9 sudo apt install gcc-9 g-…...

Ubuntu22.04安装中文输入法►由踩坑到上岸版◄

Ubuntu22.04安装中文输入法►由踩坑到上岸版◄ 了解入坑上岸 更新一发&#xff1a;Gedit中文乱码问题的解决 为了方便回忆和记录甚至后面继续重装系统&#xff0c;我还是写一下以便将来用到或参考&#xff5e; 了解 安装Ubuntu22.04&#xff08;截至2023年08月26日11&#xff…...

SpringBoot简单上手

spring boot 是spring快速开发脚手架&#xff0c;通过约定大于配置&#xff0c;优化了混乱的依赖管理&#xff0c;和复杂的配置&#xff0c;让我们用java-jar方式,运行启动java web项目 入门案例 创建工程 先创建一个空的工程 创建一个名为demo_project的项目&#xff0c;并且…...

git及GitHub的使用

文章目录 git在本地仓库的使用github使用创建仓库https协议连接(不推荐&#xff0c;现在用起来比较麻烦)ssh连接&#xff08;推荐&#xff09;git分支操作冲突处理忽略文件 git在本地仓库的使用 1.在目标目录下右键打开git bash here 2.创建用户名和邮箱(注&#xff1a; 下载完…...

【考研数学】线性代数第四章 —— 线性方程组(1,基本概念 | 基本定理 | 解的结构)

文章目录 引言一、线性方程组的基本概念与表达形式二、线性方程组解的基本定理三、线性方程组解的结构写在最后 引言 继向量的学习后&#xff0c;一鼓作气&#xff0c;把线性方程组也解决了去。O.O 一、线性方程组的基本概念与表达形式 方程组 称为 n n n 元齐次线性方程组…...

使用Python写入数据到Excel:实战指南

在数据科学领域&#xff0c;Excel是一种广泛使用的电子表格工具&#xff0c;可以方便地进行数据管理和分析。然而&#xff0c;当数据规模较大或需要自动化处理时&#xff0c;手动操作Excel可能会变得繁琐。此时&#xff0c;使用Python编写程序将数据写入Excel文件是一个高效且便…...

接口测试总结分享(http与rpc)

接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 一、了解一下HTTP与RPC 1. HTTP&#xff08;H…...

数据结构(Java实现)LinkedList与链表(下)

** ** 结论 让一个指针从链表起始位置开始遍历链表&#xff0c;同时让一个指针从判环时相遇点的位置开始绕环运行&#xff0c;两个指针都是每次均走一步&#xff0c;最终肯定会在入口点的位置相遇。 LinkedList的模拟实现 单个节点的实现 尾插 运行结果如下&#xff1a; 也…...

linux查看正在运行的nginx在哪个文件夹当中

1、查出Nginx进程PID ps -ef|grep nginx2、查看Nginx进程启动时的工作目录 ls -la /proc/<PID>/cwd将<PID>替换为第一步中列出的Nginx进程的PID。该命令会显示Nginx进程在启动时所在的工作目录&#xff08;当前工作目录&#xff09;...

Vue实现Excel表格中按钮增加小数位数,减少小数位数功能,多用于处理金融数据

效果图 <template><div><el-button click"increaseDecimals">A按钮</el-button><el-button click"roundNumber">B按钮</el-button><el-table :data"tableData" border><el-table-column v-for&q…...

自然语言处理(一):词嵌入

词嵌入 词嵌入&#xff08;Word Embedding&#xff09;是自然语言处理&#xff08;NLP&#xff09;中的一种技术&#xff0c;用于将文本中的单词映射到一个低维向量空间中。它是将文本中的单词表示为实数值向量的一种方式。 在传统的文本处理中&#xff0c;通常使用独热编码&…...

【HSPCIE仿真】HSPICE仿真基础

HSPICE概述 1. HSPICE简介3. 标准输入文件4. 标准输出文件3. HSPCIE仿真过程 1. HSPICE简介 SPICE &#xff08;Simulation Program with IC Emphasis&#xff09;是1972 年美国加利福尼亚大学柏克莱分校电机工程和计算机科学系开发 的用于集成电路性能分析的电路模拟程序。 …...

二、前端监控之方案调研

前端监控体系 一个完整的前端监控体系包括了日志采集、日志上报、日志存储、日志切分&计算、数据分析、告警等流程。 对于一名前端开发工程师来说&#xff0c;也就意味着工作不再局限于前端业务的开发工作&#xff0c;需要有Nginx服务运维能力、实时/离线分析能力、Node应…...

npm 创建 node.js 项目

package.json重要说明 package.json是创建任何node.js项目必须要有的一个文件。 因为在package.json文件中&#xff0c;有详细的项目描述&#xff0c; 包括&#xff1a; (1)项目名称&#xff1a;name (2)版本&#xff1a;version (3)依赖文件&#xff1a;dependencies 等…...

JMeter性能测试(上)

一、基础简介 界面 打开方式 双击 jmeter.bat双击 ApacheJMeter.jsr命令行输入 java -jar ApacheJMeter.jar 目录 BIN 目录&#xff1a;存放可执行文件和配置文件 docs目录&#xff1a;api文档&#xff0c;用于开发扩展组件 printable-docs目录&#xff1a;用户帮助手册 li…...

自定义date工具类 DateUtils.java

自定义date工具类 DateUtils.java 简介 Date日期类型的工具类。 api 日期格式化 format(Date date)&#xff1b;日期格式化 format(Date date, String pattern)&#xff1b;计算距离现在多久&#xff0c;非精确 getTimeBefore(Date date);计算距离现在多久&#xff0c;精确…...

Linux(Ubuntu)安装docker

2017年的3月1号之后&#xff0c;Docker 的版本命名开始发生变化&#xff0c;同时将 CE 版本和 EE 版本进行分开。 Docker社区版&#xff08;CE&#xff09;&#xff1a;为了开发人员或小团队创建基于容器的应用,与团队成员分享和自动化的开发管道。docker-ce 提供了简单的安装…...

Apache Poi 实现Excel多级联动下拉框

由于最近做的功能&#xff0c;需要将接口返回的数据列表&#xff0c;输出到excel中&#xff0c;以供后续导入&#xff0c;且网上现有的封装&#xff0c;使用起来都较为麻烦&#xff0c;故参考已有做法封装了工具类。 使用apache poi实现excel联动下拉框思路 创建隐藏单元格&a…...

常见的 HTML<meta> 标签的 name 属性及其作用

HTML中的 <meta> 标签可以通过 name 属性提供元数据&#xff0c;这些元数据可以用于指定有关文档的信息&#xff0c;以及控制浏览器和搜索引擎的行为。name 属性通常与其他属性一起使用&#xff0c;如 content、charset、http-equiv 等&#xff0c;以提供更具体的元数据信…...

【网络安全】理解报文加密、数字签名能解决的实际问题

文章目录 前言1. 防止报文泄露 —— 加密体系的出现1.1 理解非对称加密体系的实施难点1.2 加密体系的实际应用 2. 防止报文被篡改 —— 数字签名的出现2.1 数字签名的原理2.2 数字签名的实施难点2.2 数字签名的实际应用 —— 引入摘要算法 3. 实体鉴别 —— CA证书 后记 前言 …...

linux中安装nodejs,卸载nodejs,更新nodejs

卸载nodejs 卸载node sudo apt-get remove nodejs清理掉自动安装的并且不需要软件包 sudo apt autoremove查看node相关的文件 sudo whereis node如果有文件需要手动删除文件 删除该文件命令 sudo rm -rf /usr/local/bin/node在此查看node -v 是未找到&#xff0c;说明你已经…...

浅谈Python网络爬虫应对反爬虫的技术对抗

在当今信息时代&#xff0c;数据是非常宝贵的资源。而作为一名专业的 Python 网络爬虫程序猿&#xff0c;在进行网页数据采集时经常会遭遇到各种针对爬虫行为的阻碍和限制&#xff0c;这就需要我们掌握一些应对反爬机制的技术手段。本文将从不同层面介绍如何使用 Python 进行网…...

推拿网站制作/海外游戏推广平台

因为下载zip的文件速度快&#xff0c;所以就使用了zip&#xff0c;zip格式的解压完后需要使用命令行安装&#xff0c;步骤大致如下&#xff1a; 1&#xff0c;首先创建一个文件叫mongo的文件&#xff0c;里面包含了数据库存放的目录以及日志&#xff0c;然后在指定的目录下创建…...

武警部门建设网站的必要/泉州seo

因为公司网站需要做一个功能&#xff0c;涉及到javascript里的document.all方法并且因为需要兼容netspace&#xff0c;firefox等浏览器&#xff0c;netspace网上的说法是用document.layers但是针对firefox的说法不一&#xff0c;有的说用document.getElementById,有的说火狐本身…...

软件开发工具也叫什么工具/郑州网站建设专业乐云seo

单片机C语言编程串行口通讯第7章 MCS-51单片机串行口 第7章 MCS-51单片机串行口 目 录 7.1 串行通信基本知识 7.2 串行口结构及控制 7.3 串行口工作方式 7.4 串行口应用举例 7.5 单片机与PC机通信的接口电路 本章要点 本章主要讲述MCS-51单片机串行口的结构、工作原理以及应用。…...

效果图网站名字/互联网推广与营销

这道题WA好多次才通过&#xff0c;中间有很多没考虑到&#xff0c;加上一点小失误&#xff0c;不过算是把题解出来了。 这道题的思想是拓扑排序问题&#xff0c;需要考虑的是拓扑排序的结果只能是一种&#xff0c;多种就不能把各个字母的大小比较出来&#xff0c;每次输入一条变…...

做游戏特效的网站/自媒体平台注册入口官网

摘 要 在以互联网为背景的时代笼罩之下&#xff0c;教育行业迈向新模式的今天&#xff0c;人们的温饱问题已不再是威胁生命安全的源头&#xff0c;我国随着义务教育的普及&#xff0c;教育水品的不断提高&#xff0c;高校师生队伍不断壮大&#xff0c;实验室安全事故代替温饱问…...

门户网站建设目标/柳州网站建设

在三维场景中查找是一个常用的操作&#xff0c;这里演示了Open Inventor实现查找的操作方法和过程&#xff0c;SoSearchAction是Open Inventor用来实现查找的节点&#xff0c;这里利用它在场景中的两个球体中查找红色的那个&#xff0c;并在控制台中输出查找结果。代码如下。 #…...