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());
        //关闭session
        session.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>

这里重点讲一下****元素:

​ 核心配置文件若要引用一个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>

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

​ 除了可以使用元素为实体类自定义别名外,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;

    @BeforeEach
    public void setUp() {
        originalSystemIn = System.in;
    }

    @AfterEach
    public void tearDown() {
        System.setIn(originalSystemIn);
    }
 @org.junit.jupiter.api.Test
    void 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 还没有"));
        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 block
            e.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的集成,我们会在后面使用到中进行讲解。

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

在这里插入图片描述
blog.csdnimg.cn/c903f525bf3441ba8cc4a39acad62617.png#pic_center)

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

在这里插入图片描述


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

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

在这里插入图片描述

在这里插入图片描述

总结

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

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

作者:Stevedash

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】cpolar+JuiceSSH实现手机端远程连接Linux服务器

文章目录 1. Linux安装cpolar2. 创建公网SSH连接地址3. JuiceSSH公网远程连接4. 固定连接SSH公网地址5. SSH固定地址连接测试 处于内网的虚拟机如何被外网访问呢?如何手机就能访问虚拟机呢? cpolarJuiceSSH 实现手机端远程连接Linux虚拟机(内网穿透,手机端连接Linux虚拟机) …

商业智能BI是什么都不明白,如何实现数字化?

2021年下半年中国商业智能软件市场规模为4.8亿美元&#xff0c;2021年度市场规模达到7.8亿美元&#xff0c;同比增长34.9%&#xff0c;呈现飞速增长的趋势。数字化时代&#xff0c;商业智能BI对于企业的落地应用有着巨大价值&#xff0c;逐渐成为了现代企业信息化、数字化转型中…

贝锐蒲公英助力建设工程咨询企业,高效安全远程访问数据档案库

随着数字信息化进程的加深&#xff0c;数字化转型已成为企业实现业务流程自动化、提高工作效率、降低成本和提高用户满意度的重要手段。其中&#xff0c;档案工作的标准化、规范化是信息化建设的前提和必要条件&#xff0c;对于建设工程咨询企业而言&#xff0c;一个完善的数字…

​8th参考文献:[8]许少辉.乡村振兴战略下传统村落文化旅游设计[M]北京:中国建筑工业出版社,2022.

​&#xff18;th参考文献&#xff1a;&#xff3b;&#xff18;&#xff3d;许少辉&#xff0e;乡村振兴战略下传统村落文化旅游设计&#xff3b;&#xff2d;&#xff3d;北京&#xff1a;中国建筑工业出版社&#xff0c;&#xff12;&#xff10;&#xff12;&#xff12;&a…

Revit 3D高效处理:cad exchanger sdk 3.21 Crack

3D 格式概述&#xff1a;Revit Revit 已成为寻求高效、准确的建筑信息建模的专业人士的首选解决方案。在这篇引人入胜的功能概述中了解 Revit 的特性和影响。 什么是Revit&#xff1f; Autodesk Revit 是一款流行的 CAD 软件&#xff0c;重点关注 BIM&#xff0c;被建筑师、工…

3D角色展示

先看效果&#xff1a; 再看代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>3D卡片悬停</title><style>font-face {font-family: "Exoct";src: url("htt…

机器学习,过拟合与欠拟合,正则化与交叉验证

目录 机器学习 过拟合与欠拟合 正则化与交叉验证 正则化 交叉验证 机器学习 的目的是使学到的模型不仅对已知数据而且对未知数据都能有很好的预测能力。 不同的机器学习方法会给出不同的模型。当损失函数给定时&#xff0c;基于损失函数的模型的训练误差&#xff08;tra…

vue3、react组件数据传值对比分析——父组件传递子组件,子组件传递父组件

文章目录 ⭐前言⭐react 组件传值实例&#x1f496;父组件传值给子组件&#xff08;props&#xff09;&#x1f496;子组件传递事件给父组件props绑定事件&#x1f496;父组件触发子组件的事件Ref ⭐vue3 组件传值实例&#x1f496; 父组件传递数据给子组件props&#x1f496; …

三维重建 PyQt Python MRP 四视图(横断面,冠状面,矢状面,3D)

本文实现了 Python MPR 的 四视图&#xff0c;横断面&#xff0c;冠状面&#xff0c;矢状面&#xff0c;3D MPR(multi-planner reformation)也称多平面重建&#xff0c;多重面重建是将扫描范围内所有的轴位图像叠加起来再对某些标线标定的重组线所指定的组织进行冠状、矢状位、…

JAMstack架构:快速构建安全、高性能的现代应用

随着Web应用的快速发展&#xff0c;开发者们在寻找更加高效、安全和可维护的应用架构。JAMstack架构应运而生&#xff0c;它通过将前端、后端和部署过程分离&#xff0c;提供了一种现代化的方式来构建Web应用。在本文中&#xff0c;我们将深入探讨JAMstack架构的特点、优势以及…

ES 索引重命名--Reindex(一)

ES reindex脚本流程&#xff0c;下图为整体流程&#xff1a; 步骤&#xff08;1&#xff09;&#xff1a;每次写入把之前的索引删除再重新创建索引&#xff0c;然后判断索引是否创建成功&#xff0c;由于创建成功返回结果是json&#xff0c;因此用Json Input插件去解析json获得…

ATF BL1/BL2 ufs_read_blocks/ufs_write_blocks使用分析

ATF BL1/BL2 ufs_read_blocks/ufs_write_blocks使用分析 1 ATF的下载链接2 ATF BL1/BL2 ufs_read_blocks/ufs_write_blocks处理流程2.1 ATF BL1/BL2 ufs_read_blocks2.2 ATF BL1/BL2 ufs_write_blocks 3 UFS System Model4 ufs_read_blocks/ufs_write_blocks详细分析4.1 ufs_re…

备份服务器搭建

备份服务器搭建 1、背景2、作用3、选型4、环境5、部署5.1、服务端部署5.1.1、安装5.1.2、配置 5.2、客户端部署5.3、备份策略5.3.1、定时备份策略5.3.2、文件变动备份 6、参考 1、背景 随着项目的推进&#xff0c;备份服务器被提上了工作日程&#xff0c;等保、密评和接入测评…

selenium Chrome驱动下载地址

Chrome驱动官方最新版下载地址:https://googlechromelabs.github.io/chrome-for-testing/ 有稳定版&#xff0c;开发版等版本可以选择下载 选择 操作系统复制下载链接直接下载

CentOS7安装部署Doris

文章目录 CentOS7安装部署Doris一、前言1.简介2.环境 二、正文1.Doris基础1&#xff09;架构图2&#xff09;通讯端口 2.部署服务器3.安装基础环境1&#xff09;安装JDK 112&#xff09;安装GCC3&#xff09;设置文件句柄数4&#xff09;关闭交换分区&#xff08;swap&#xff…

微服务参数透传实现

说明&#xff1a;在微服务架构中&#xff0c;用户身份经网关验证后&#xff0c;我们可以将用户信息&#xff0c;如ID加入到请求头上。后面的微服务中&#xff0c;可以设置一个拦截器&#xff0c;拦截请求&#xff0c;获取请求头上的用户ID&#xff0c;加入到ThreadLocal中。 最…

欧拉计划44题

Pentagon numbers Pentagonal numbers are generated by the formula, . The first ten pentagonal numbers are: 1,5,12,22,35,51,70,92,117,145,… It can be seen that . However, their difference, 70−2248, is not pentagonal. Find the pair of pentagonal numbers, a…

安防视频监控平台EasyCVR视频集中存储平台接入RTSP设备出现离线情况的问题解决方案

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

Stable Diffusion入门修炼手册

简介 作为新入门的新手&#xff0c;通常安装完Stable Diffusion之后&#xff0c;一打开界面&#xff0c;在文生图输入girl或者dog&#xff0c;结果出来的画面比较糟糕&#xff0c;看起来像素很低&#xff0c;画面不清晰&#xff0c;人物也不怎么美&#xff0c;等等其他问题&am…

【100天精通python】Day38:GUI界面编程_PyQt 从入门到实战(中)_数据库操作与多线程编程

目录 专栏导读 4 数据库操作 4.1 连接数据库 4.2 执行 SQL 查询和更新&#xff1a; 4.3 使用模型和视图显示数据 5 多线程编程 5.1 多线程编程的概念和优势 5.2 在 PyQt 中使用多线程 5.3 处理多线程间的同步和通信问题 5.3.1 信号槽机制 5.3.2 线程安全的数据访问 Q…