SSM框架的学习与应用(Spring + Spring MVC + MyBatis)-Java EE企业级应用开发学习记录(第二天)Mybatis的深入学习

SSM框架的学习与应用(Spring + Spring MVC + MyBatis)-Java EE企业级应用开发学习记录(第二天)Mybatis的深入学习(增删改查的操作)

上一篇我们的项目搭建好了,也写了简答的Junit测试类进行测试,可以正确映射到数据库中。

那么这篇文章来深入学习一下以下几个点:

  • 了解MyBatis的核心对象SqlSessionFactoryBuilder以及它的作用
  • 掌握MyBatis核心配置文件以及元素的使用
  • 掌握MyBatis映射文件及其元素的使用

一、什么是MyBatis的核心对象?

在这里插入图片描述

可以看到红色框住的这部分代码,我们使用了SqlSessionFactoryBuilder().build(reader)创建MyBatis的SqlSessionFactory的一个实例

稍微解释一下代码吧(这是一种链式操作,使得代码更为紧凑方便阅读):

  1. SqlSessionFactoryBuilder():这是 MyBatis 框架提供的 SqlSessionFactoryBuilder 类的构造方法,用于创建 SqlSessionFactory 实例的构建器。
  2. build(reader):这是 SqlSessionFactoryBuilder 类build 方法,用于**构建 SqlSessionFactory 实例。**该方法需要一个 Reader 参数,该 Reader 包含了 MyBatis 配置文件的内容。通常,配置文件名为 mybatis-config.xml

但是呢,写入数据库的操作是SqlSession对象完成的,所以我们上面创建了SqlSessionFactory的实例就是为了通过其中的build()方法创建出一个SqlSession对象,这样才能进行数据库操作

 //创建SqlSession实例SqlSession session = sqlSessionFactory.openSession();//调用方法,传入参数进行查询\插入\更新\删除等操作PasswordMS passwordMS = session.selectOne("findById",1);//SqlSession中查询单个对象的方法,若是要查询多条则要使用selectList(),方法不同返回值也不同。
//日志输出信息查看返回结果logger.info("姓名:"+passwordMS.getAccount()+",密码:"+passwordMS.getPassword()+",网站:"+passwordMS.getWebsiteName());//关闭sessionsession.close();
因此SqlSessionFactoryBuilder通常被认为是Mybatis的核心对象!(若是上面的代码解释,还是不太懂的话,建议去看看我的其他俩个专栏,先把Java基础和Java高级编程学习这俩专栏学习看完,或者也可以单独看一下Java方法详解这一篇文章,即可理解大概的逻辑思路。)

SqlSessionFactoryBuilder中有多个重载的build()方法

在这里插入图片描述

​ 可以看出都是构建出SqlSessionFactory对象, 通过以上代码可知,配置信息可以通过InputStream(字节流)、Reader(字符流)、Configuration(类)三种形式提供给SqlSessionFactoryBuilder的build()方法。

我们是以读取XML文件的方式构造SqlSessionFactory对象

//字符流 读取配置文件
Reader reader = Resources.getResourceAsReader("配置文件位置");
// 根据配置文件构建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = 
new SqlSessionFactoryBuilder().build(reader);-----------------------------------------------------------------------------
//字节流 读取配置文件
InputStream inputStream = Resources.getResourceAsStream("配置文件位置");
// 根据配置文件构建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = 
new SqlSessionFactoryBuilder().build(inputStream);----------------------------------------------------------------------------
//类方式可以自己去尝试编写一下,开发中常用这种方式

SqlSessionFactory对象是线程安全的,它一旦被创建,在整个应用程序执行期间都会存在。如果我们多次创建同一个数据库的SqlSessionFactory对象,那么该数据库的资源将很容易被耗尽。通常每一个数据库都只创建一个SqlSessionFactory对象,所以在构建SqlSessionFactory对象时,建议使用单例模式


通过SqlSessionFactory的openSession()方法创建出SqlSession来操作数据库

方法名称描述
SqlSession openSession()开启一个事务。
SqlSession openSession(Boolean autoCommit)参数autoCommit可设置是否开启事务。
SqlSession openSession(Connection connection)参数connection可提供自定义连接。
SqlSession openSession(TransactionIsolationLevel level)参数level可设置隔离级别。
SqlSession openSession(ExecutorType execType)参数execType有三个可选值。
SqlSession openSession(ExecutorType execType,Boolean autoCommit)参数execType有三个可选值。
SqlSession openSession(ExecutorType execType, Connection connection)参数ExecutorType有三个可选值。
openSession(ExecutorType execType)简称execType参数值 有三个可选值:
  1. ExecutorType.SIMPLE:表示为每条语句创建一条新的预处理语句。
  2. ExecutorType.REUSE:表示会复用预处理语句。
  3. ExecutorType.BATCH:表示会批量执行所有更新语句。

简单理解,知道有这些方法设置就行后面才会用到。


SqlSession对象的作用

SqlSession是MyBatis框架中另一个重要的对象,它是应用程序与持久层之间执行交互操作的一个单线程对象,主要作用是执行持久化操作,类似于JDBC中的Connection。SqlSession对象包含了执行SQL操作的方法,由于其底层封装了JDBC连接,所以可以直接使用SqlSession对象来执行已映射的SQL语句。


以下是一些常见的 SqlSession 方法:

  1. selectOne(String statement, Object parameter): 执行查询并返回单个结果对象。statement 是 SQL 语句的唯一标识符,parameter 是查询所需的参数。

  2. selectList(String statement, Object parameter): 执行查询并返回结果列表。与 selectOne 类似,只是返回多个结果

  3. insert(String statement, Object parameter): 执行插入操作,插入一条数据。

  4. update(String statement, Object parameter): 执行更新操作,更新数据。

  5. delete(String statement, Object parameter): 执行删除操作,删除数据。

  6. commit(): 提交事务。

  7. rollback(): 回滚事务。

  8. close(): 关闭 SqlSession 实例。

  9. getMapper(Class type): 获取一个 Mapper 接口的实例,通过该实例可以调用映射文件中配置的 SQL 语句。

示例使用:

SqlSession session = sqlSessionFactory.openSession();// 查询单个结果
User user = session.selectOne("getUserById", 1);// 查询结果列表
List<User> userList = session.selectList("getAllUsers");// 插入数据
User newUser = new User("John", "john@example.com");
int rowsInserted = session.insert("insertUser", newUser);// 更新数据
User updatedUser = new User(1, "UpdatedName", "updated@example.com");
int rowsUpdated = session.update("updateUser", updatedUser);// 删除数据
int rowsDeleted = session.delete("deleteUser", 1);// 提交事务
session.commit();// 关闭 SqlSession
session.close();

上述示例中的方法参数 "getUserById""getAllUsers""insertUser""updateUser""deleteUser" 是 MyBatis 配置文件中定义的 SQL 语句的唯一标识符。这些标识符与映射文件中的配置相对应,可以在映射文件中查找具体的 SQL 语句。

PS(名词科普):提交事务

​ 在数据库中,事务(Transaction)是指一系列的数据库操作,这些操作被当作一个单独的工作单元来执行。事务的目的是确保数据库的一组操作要么全部执行成功,要么全部失败,以保持数据的一致性和完整性

提交事务(Commit Transaction)是指将之前在一个事务中进行的一系列数据库操作永久地保存到数据库中,使这些操作对其他事务可见。当你执行提交事务操作时,数据库会将所有的变更持久保存,而且这些变更对其他事务和查询都是可见的。如果事务中的所有操作都执行成功,那么提交事务会将这些操作永久保存到数据库中。如果事务中的任何一个操作失败,那么整个事务都会被回滚(Rollback),即取消之前的操作,使数据库回到事务开始前的状态。

提交事务是数据库管理系统中确保数据一致性和持久性的重要机制之一,它确保了在事务执行完毕后,对数据的变更是持久保存的,而不会因为系统崩溃等情况而丢失。


SqlSession对象的使用范围:

每一个线程都应该有一个自己的SqlSession对象,并且该对象不能共享SqlSession对象是线程不安全的,因此其使用范围最好在一次请求或一个方法中,绝不能将其放在类的静态字段、对象字段或任何类型的管理范围(如Servlet的HttpSession)中使用。SqlSession对象使用完之后,要及时的关闭,SqlSession对象通常放在finally块中关闭,代码如下所示。

SqlSession sqlSession = sqlSessionFactory.openSession();
try {	// 此处执行持久化操作
} finally {		sqlSession.close();		}

二、MyBatis核心配置文件

其中的主要元素如下:

在这里插入图片描述

以下是一些核心配置文件和配置项的含义(“”内的要重点掌握一下):
  1. properties: 用于指定一些全局的属性和变量,这些属性可以在整个配置文件中使用。
  2. “settings”: 用于配置 MyBatis 的全局性设置,例如缓存、延迟加载等。
  3. ”typeAliases“: 用于配置类型别名,使得在映射文件中可以使用简短的别名来引用 Java 类。
  4. typeHandlers: 用于配置类型处理器,用于将数据库中的数据类型映射为 Java 类型。
  5. objectFactory: 用于配置对象工厂,可以通过对象工厂来创建结果对象的实例。
  6. plugins: 用于配置插件,插件可以拦截 MyBatis 的一些操作,扩展其功能。
  7. environments: 用于配置不同的运行环境,比如开发环境、测试环境和生产环境。
  8. environment: 在 environments 中配置的运行环境,可以指定 transactionManagerdataSource
  9. transactionManager: 用于配置事务管理器,管理数据库连接的生命周期和事务的提交与回滚。
  10. dataSource: 用于配置数据源,包括数据库连接的基本信息。
  11. mappers: 用于指定映射器接口的位置,即映射文件的位置。

​ 元素是整个XML配置文件的根元素,相当于MyBatis各元素的管理员。有很多子元素,MyBatis的核心配置就是通过这些子元素完成的,子元素的顺序尽量按照上述的编号顺序,并且需要在 标签对中即可

在这里插入图片描述


这里重点讲一下****的配置元素:
配置参数描述
cacheEnabled用于配置是否开启缓存。
lazyLoadingEnabled延迟加载的全局开关。
aggressiveLazyLoading关联对象属性的延迟加载开关。
multipleResultSetsEnabled是否允许单一语句返回多结果集(需要兼容驱动)
useColumnLabel使用列标签代替列名。
useGeneratedKeys允许JDBC支持自动生成主键,需要驱动兼容。
autoMappingBehavior指定MyBatis应如何自动映射列到字段或属性。
defaultExecutorType配置默认的执行器。
defaultStatementTimeout配置超时时间,它决定驱动等待数据库响应的秒数。
mapUnderscoreToCamelCase是否开启自动驼峰命名规则(camel case)映射
jdbcTypeForNull当没有为参数提供特定的JDBC类型时,为空值指定JDBC类型。

格式如下:

<settings><!-- 是否开启缓存 --><setting name="cacheEnabled" value="true" /><!-- 是否开启延迟加载,如果开启,所有关联对象都会延迟加载 --><setting name="lazyLoadingEnabled" value="true" /><!-- 是否开启关联对象属性的延迟加载,如果开启,对任意延迟属性的调用都会使用带有延迟加载属性的对象向完整加载,否则每种属性都按需加载 --><setting name="aggressiveLazyLoading" value="true" />...
</settings>

这里重点讲一下typeAiases元素:

​ 核心配置文件若要引用一个POJO实体类,需要输入POJO实体类的全限定类名,而全限定类名比较冗长,如果直接输入,很容易拼写错误。例如,POJO实体类User的全限定类名是com.itheima.pojo.User,未设置别名之前,映射文件的select语句块若要引用POJO类User,必须使用其全限定类名,引用代码如下

<select id="findById" parameterType="int" resultType="com.example.pojo.User">select * from users where id = #{id}
</select>
设置别名的方式如下:
①在元素下,使用多个元素为每一个全限定类逐个配置别名。
<typeAliases><typeAlias alias="User" type="com.example.pojo.User"/><typeAlias alias="Student" type="com.example.pojo.Student"/><typeAlias alias="Employee" type="com.example.pojo.Employee"/><typeAlias alias="Animal" type="com.example.pojo.Animal"/>
</typeAliases>
<environments>
②通过自动扫描包的形式自定义别名。
<typeAliases><package name="com.example.pojo"/>
</typeAliases>
<environments>

注意要放在 environments上面,不然程序会报错,Error building SqlSession

​ 除了可以使用typeAliases元素为实体类自定义别名外,MyBatis框架还为许多常见的Java类型(如数值、字符串、日期和集合等)提供了相应的默认别名。例如别名_byte映射类型byte、_long映射类型long等,别名可以在MyBatis中直接使用,但由于别名不区分大小写,所以在使用时要注意重复定义的覆盖问题。

​ 并且设置完别名以后,pojo包里面的类都会自动识别,所以Mapper.xml文件里面也需要修改一下。如下图得从pojo.PasswordMS 修改➡成 PasswordMS:

在这里插入图片描述


三、MyBatis映射文件及其元素的使用

上一篇文章,我们后面自己写一个插入的sql语句,现在要检测一下能不能正确的映射到数据库中。

在这里插入图片描述

结果发现,程序一直转动,但是不能在终端输入,也没办法继续进行。神奇的是也不报错,在我查阅资料后发现,原因如下

在JUnit测试中,无法直接通过终端输入参数。JUnit测试是自动化测试,在测试过程中是无法进行交互操作的。

解决办法:pom中引入Mockito,就可以模拟用户输入了
  <!-- Mockito 依赖 --><dependency><groupId>org.mockito</groupId><artifactId>mockito-core</artifactId><version>4.0.0</version><scope>test</scope></dependency>

测试类也要修改

lass PasswordMSTest {private Logger logger= Logger.getLogger(PasswordMSTest.class);private InputStream originalSystemIn;private ByteArrayInputStream simulatedInput;@BeforeEachpublic void setUp() {originalSystemIn = System.in;}@AfterEachpublic void tearDown() {System.setIn(originalSystemIn);}@org.junit.jupiter.api.Testvoid insertOneIntoPasswordMS() {//读取文件名:String resources="mybatis-config.xml";//创建流Reader reader = null;try{reader = Resources.getResourceAsReader(resources);}catch (IOException e){e.printStackTrace();}//这里就是你模拟输入用户输入的数据String input = "John\n123456\n1234567890\nexample1.com\nhttps://example1.com\nicon.png\nSocial\n";// 将标准输入重定向到模拟输入流InputStream inputStream = new ByteArrayInputStream(input.getBytes());System.setIn(inputStream);PasswordMS passwordMS=new PasswordMS();Scanner scanner = new Scanner(System.in);System.out.println("请输入你想要存储的账号名:");passwordMS.setAccount(scanner.nextLine());System.out.println("请输入你想要存储的账号密码:");passwordMS.setPassword(scanner.nextLine());System.out.println("请输入你想要存储的与该账号绑定的手机号:");passwordMS.setPhoneNumber(scanner.nextLine());System.out.println("请输入你想要存储的账号所属网站名:");passwordMS.setWebsiteName(scanner.nextLine());System.out.println("请输入你想要存储的网址URL:");passwordMS.setWebsiteURL(scanner.nextLine());System.out.println("请输入网站的缩略图或者图标:");String WebsiteImage=scanner.nextLine();Optional<String> optionalS = Optional.ofNullable(WebsiteImage);passwordMS.setWebsiteImage(optionalS.orElse("Sorry 还没有"));//这里使用了optional对象来判断是否为空,空则为默认值System.out.println("请输入该账号的描述比如类别:");passwordMS.setAccountDescription(scanner.nextLine());//初始化mybatis数据库,创建SqlSessionFactory类的实例SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);//创建SqlSession实例SqlSession session = sqlSessionFactory.openSession();//传入参数查询,返回结果session.insert("insertOne",passwordMS);session.commit();session.close();}}

输出结果如下:

在这里插入图片描述

数据库中也成功插入记录

在这里插入图片描述


现在回过头来看,每个测试类其实有很大一部分都是重复的

在这里插入图片描述

这段代码的作用是打开mybatis-config.xml文件,用它连上数据库,然后打开数据连接,这段代码经常会在进行数据操作之前用到,但是我们又不想每次都复制粘贴它,这时我们可以把它封装起来。直接调用

操作如下:

①java包下新建一个package为utils(一般默认为工具包)

②utils包下新建一个类为:MyBatisUtil.java

代码如下:

package utils;import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;public class MyBatisUtil {private static SqlSessionFactory factory;static{在静态代码块中,factory只会被创建一次System.out.println("static factory===============");try {InputStream is = Resources.getResourceAsStream("mybatis-config.xml");factory = new SqlSessionFactoryBuilder().build(is);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public static SqlSession createSqlSession(){return factory.openSession(false);//true为自动提交事务}public static void closeSqlSession(SqlSession sqlSession){if(null != sqlSession)sqlSession.close();}
}

通过以上”静态类“的方式来保证Sql Session Factory实例只被创建一次,当然,最佳的解决方案是使用Spring框架来管理Sql Session Factory的单例模式生命周期。关于和Spring的集成,我们会在后面使用到中进行讲解。

完成以上步骤以后,我们就能去优化我们的测试类了

在这里插入图片描述

进行测试,还是能够正常运行,也能写入数据库进行交互。

在这里插入图片描述


使用Mybatis进行数据修改、删除操作

自行编写补充mapper映射文件嗷

在这里插入图片描述

在这里插入图片描述

总结

​ 这是第二天对SSM框架的学习,深入了解了Mybatis的核心对象SqlSessionFactoryBuilder掌握MyBatis核心配置文件以及元素的使用,也掌握MyBatis映射文件及其元素的使用。想要跟着学习的可以去我的资源里面找对应的文件下载,我的md文件也会发上去,项目文件会上传可以自己跟着学习一下。

PS:sql语句自己编写┗|`O′|┛ 嗷~~

作者:Stevedash

发表于:2023年8月21日 22点45分

注:本文内容基于个人学习理解,如有错误或疏漏,欢迎指正。感谢阅读!如果觉得有帮助,请点赞和分享。

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

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

相关文章

Lnton羚通算法算力云平台如何在OpenCV-Python中使用cvui库创建复选框

CVUI 之 复选框 Python import numpy as np import cv2 import cvuidef checkbox_test():WINDOW_NAME Checkbox-Testchecked [False]# 创建画布frame np.zeros((300, 400, 3), np.uint8)# 初始化窗口cvui.init(WINDOW_NAME)while True:# 画布填色frame[:] (100, 200, 100…

利用屏幕水印学习英语单词,无打扰英语单词学习

1、利用屏幕水印学习英语单词&#xff0c;不影响任何鼠标键盘操作&#xff0c;不影响工作 2、利用系统热键快速隐藏&#xff08;ALT1键 隐藏与显示&#xff09; 3、日积月累单词会有进步 4、软件下载地址: 免安装&#xff0c;代码未加密&#xff0c;安全的屏幕水印学习英语…

机器人TF坐标系变换与一些可视化工具的应用

TF坐标在ROS中是一个非常重要的概念&#xff0c;因为机器人在做日常操作任务的时候&#xff0c;对于其所在位置和朝向是需要时刻知道的&#xff0c;而机器人是由很多节点组成的协同任务&#xff0c;对于每个部件&#xff0c;我们需要知道它的位姿(位置和朝向)&#xff0c;这使得…

链表OJ题

今天讲一些关于链表的Oj题&#xff0c;相信你看完对链表又提升一个档次。 题目一 思路一 遍历一遍链表是Val值得时候free这个&#xff0c;然后我们往后走&#xff0c;一直走到末尾空指针得时候&#xff0c;新链表就是我们得答案&#xff0c;那我们用代码来表示一下吧。 struct…

rabbitMQ服务自动停止(已解决

1、 在rabbitmq的sbin目录下操作 rabbitmq-plugins enable rabbitmq_management 2、 自己去rabbitmq_server-3.7.5文件夹下创建一个data&#xff0c;再执行这个命令&#xff08;用自己的目录哈 set RABBITMQ_BASED:\RabbitTools\RabbitMQ\rabbitmq_server-3.7.5\data 然后去配…

基于YOLOV8模型的西红柿目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要&#xff1a;基于YOLOV8模型的西红柿目标检测系统可用于日常生活中检测与定位西红柿目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的目标检测&#xff0c;另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算法训练数…

微信小程序:模板使用

目录 模板的优点&#xff1a; 一、静态模板创建 二、静态模板使用 1.*.wxml引入模板 2.模板使用 3.*.wxss引入模板的样式 三、动态模板创建 四、动态模板使用 1.*.wxml引入模板 2.模板使用 3.*.js定义动态数据 五、结果展示 总结 模板的优点&#xff1a; 有利于保持网…

element-ui中二次封装一个带select的form组件

带select的form组件 样式 代码 <template><el-form-item label"是否有" class"append" prop"tag"><el-form-itemprop"isShare"><el-select v-model"query.tag"><el-option v-for"(item, …

2023年中秋月饼市场趋势分析(月饼京东销售数据分析)

中秋将至&#xff0c;月饼作为节令食品将再次掀起消费热潮。今年月饼市场的需求如何呢&#xff0c;是更受欢迎还是热度有所降低&#xff0c;结合数据我们一起来看今年月饼市场的销售表现。 在这里&#xff0c;我们分别选取了2022年第31周-32周和2023年第31周-32周&#xff08;…

算法通关村第5关【青铜】| Hash和队列的特征

1.Hash基础 &#xff08;1&#xff09;基础 哈希也称为散列&#xff0c;通过算法变成固定长度的输出值&#xff0c;存入对应的位置 例如这个算法为取模算法&#xff0c;indexnumber 模 7 存入1到15 &#xff08;2&#xff09;碰撞处理 当多个元素映射到同一位置上时就产生…

API 接口选择那个?RESTful、GraphQL、gRPC、WebSocket、Webhook

大家好&#xff0c;我是比特桃。目前我们的生活紧紧地被大量互联网服务所包围&#xff0c;互联网上每天都有数百亿次API调用。API 是两个设备相互通讯的一种方式&#xff0c;人们在手机上每次指尖的悦动&#xff0c;背后都是 API 接口的调用。 本文将列举常见的一些 API 接口&…

利用console提高写bug的效率

前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 自从入坑前端后&#xff0c;日常写bug就没离开过console。 要说用得多&#xff0c;不如说是console.log用得多&#xff0c;console.warn和console.erro…

2023年最佳JavaScript框架:React、Vue、Angular和Node.js的比较

文章目录 React&#xff1a;构建用户界面的首选Vue&#xff1a;简单优雅的前端框架Angular&#xff1a;Google支持的全面框架Node.js&#xff1a;服务器端的JavaScript运行环境比较不同框架的优势与劣势React&#xff1a;Vue&#xff1a;Angular&#xff1a;Node.js&#xff1a…

怎么查看小程序中的会员信息

商家通过查看会员信息&#xff0c;可以更好地了解用户&#xff0c;并为他们提供更个性化的服务和推荐。接下来&#xff0c;就将介绍如何查看会员信息。 商家在管理员后台->会员管理处&#xff0c;可以查看到会员列表。支持搜索会员的卡号、手机号和等级。还支持批量删除会员…

【Python】数据分析工具之各种图

1 漏斗图 漏斗图描述状态阶段的顺序递进关系&#xff0c;属于序列类图表 import plotly.express as pxdata dict(number[39, 27.4, 20.6, 11, 2],stage["Website visit", "Downloads", "Potential customers", "Requested price", &…

K8s+Docker+KubeSphere+DevOps笔记

K8sDockerKubeSphereDevOps 前言一、阿里云服务器开通二、docker基本概念1.一次构建、到处运行2、docker基础命令操作3、docker进阶操作1.部署redis中间件2.打包docker镜像 三、kubernetes 大规模容器编排系统1、基础概念&#xff1a;1、服务发现和负载均衡2、存储编排3、自动部…

QTreeWidget——信号处理

文章目录 基本属性信号一、信号种类二、信号测试1、currentItemChanged、itemCollapsed、itemExpanded三个信号的测试2、itemActivated信号3、 itemChanged信号4、其余信号的测试代码&#xff08;包含以上代码&#xff09; 基本属性 信号 一、信号种类 //当前项发生变化时触…

uniapp 顶部头部样式

<u-navbartitle"商城":safeAreaInsetTop"true"><view slot"left"><image src"/static/logo.png" mode"" class"u-w-50 u-h-50"></image></view></u-navbar>

使用Pandas处理Excel文件

Excel工作表是非常本能和用户友好的&#xff0c;这使得它们非常适合操作大型数据集&#xff0c;即使是技术人员也不例外。如果您正在寻找学习使用Python在Excel文件中操作和自动化内容的地方&#xff0c;请不要再找了。你来对地方了。 在本文中&#xff0c;您将学习如何使用Pan…

怎样做好日志分析?

首先我们要知道日志分析是指检查并理解计算机生成的日志消息&#xff0c;例如日志事件或审计来跟踪记录&#xff0c;通过日志分析可以帮助您诊断和解决计算机系统中的问题&#xff0c;以及监视系统性能和安全性。 如果您想知道您的网络中发生了什么&#xff0c;以便洞察潜在的…