Spring Boot | Spring Boot的“数据访问“、Spring Boot“整合MyBatis“

news2025/7/4 6:58:05

目录:

    • 一、Spring Boot”数据访问概述“
    • 二、Spring Boot”整合MyBatis”
      • 1. 基础环境搭建 (引入对应的“依赖启动器” + 配置数据库的“相关参数”)
        • ① 数据准备 (导入Sql文件)
        • ② 创建项目,引入相应的启动器,编写数据库对应的“实体类”
        • ③额外添加pom.xml文件依赖
        • ④ 编写application.properties 配置文件
        • ⑤ 编写自定义的关于“DruidDataSource“ 的 配置类”
      • 2. 使用“注解”的方式整合MyBatis ( 使用 “注解” 来“直接”操作数据库)
      • 3. 使用“配置文件”的方式整合MyBatis ( 使用 “XxxMapper.java文件 + XxxMapper.xml文件” 来 操作数据库)

在这里插入图片描述

作者简介 :一只大皮卡丘,计算机专业学生,正在努力学习、努力敲代码中! 让我们一起继续努力学习!

该文章参考学习教材为:
《Spring Boot企业级开发教程》 黑马程序员 / 编著
文章以课本知识点 + 代码为主线,结合自己看书学习过程中的理解和感悟 ,最终成就了该文章

文章用于本人学习使用 , 同时希望能帮助大家。
欢迎大家点赞👍 收藏⭐ 关注💖哦!!!

(侵权可联系我,进行删除,如果雷同,纯属巧合)


一、Spring Boot”数据访问概述“

  • Spring DataSpring 提供的一个用 于简化数据库访问支持云服务的开源框架。它是一个 伞形项目,包含了 大量关系型数据库非关系型数据库数据访问解决方案,其设计目的是使我们可以快速且简单地使用各种数据访问技术

  • Spring Boot默认采用整合 Spring Data方式统一处理数据访问层,通过添加大量自动配置,引入各种数据访问模板 xxxTemplate 以及统一Repository 接口,从而达到简化数据访问层的操作。

  • Spring Data 提供了 多种类型数据库支持,Spring Boot对 Spring Data支持的数据库进行了 整合管理 ,提供了 各种依赖启动器

  • 常见的 数据库依赖启动器如下表所示

    名称描述
    spring-boot-starter-data-jpaSpring Data JPAHibernate启动器
    spring-boot-starter-data-mongodbMongoDBSpring Data MongoDB 的启动器
    spring-boot-starter-data-neo4jNeo4j 图数据库Spring Data Neo4j启动器
    spring-boot-starter-data-redisRedis键值数据存储Spring Data RedisJedis客户端启动器

    需要说明的是,MyBatis作为操作数据库流行框架Spring Boot没有提供MyBatis 场景
    依赖
    ,但是 MyBatis开发团队自己适配了Spring Boot,提供了 mybatis-spring-boot-starter
    依赖启动器实现数据访问操作

二、Spring Boot”整合MyBatis”

  • MyBatis 是一款优秀持久层框架,它支持 定制化SQL存储过程以及高级映射避免了几乎所有JDBC代码手动设置参数以及获取结果集
  • MyBatis可以使用简单的 XML注解 配置和映射原生信息,并将 接口 和Java的 POJOs ( Plain Old Java Objects,普通Java对象) 映射成数据库中的记录Spring Boot 官方虽然没有对MyBatis进行整合,但是MyBatis 团队自行适配了对应启动器,进一步简化了MyBatis 对数据的操作

1. 基础环境搭建 (引入对应的“依赖启动器” + 配置数据库的“相关参数”)

因为SpringBoot 框架开发很便利,所以实现 Spring Boot数据访问层框架( 例如MyBatis ) 的整合非常简单,主要是 引入对应的依赖启动器,并进行 数据库相关参数设置 即可。

① 数据准备 (导入Sql文件)

先创建了一个 数据库springbootdata,然后创建了两个表 t_articlet_comment ,并向表中插入数据。
其中评论表t_commenta_id 与文章表t_article主键id 相关联 ( t_article主键作为t_comment表外键)。

springbootdata.sql

② 创建项目,引入相应的启动器,编写数据库对应的“实体类”
  • 使用 Spring Initializr 的方式 创建 Spring Boot 项目。在Dependencies依赖中选择 SQL 模块中的 MySQLMyBatis依赖,并根据后续提示完成项目创建

    在这里插入图片描述

  • 编写 数据库 对应的 实体类

    Article.java :

    package com.myh.chapter_04.domain;
    
    import java.util.List;
    public class Article {
    
        private Integer id;
        private String title;
        private String content;
        private List<Comment> commentList;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getTitle() {
            return title;
        }
    
        public void setTitle(String title) {
            this.title = title;
        }
    
        public String getContent() {
            return content;
        }
    
        public void setContent(String content) {
            this.content = content;
        }
    
        public List<Comment> getCommentList() {
            return commentList;
        }
    
        public void setCommentList(List<Comment> commentList) {
            this.commentList = commentList;
        }
    
        @Override
        public String toString() {
            return "Article{" +
                    "id=" + id +
                    ", title='" + title + '\'' +
                    ", content='" + content + '\'' +
                    ", commentList=" + commentList +
                    '}';
        }
    }
    

    Comment.java :

    package com.myh.chapter_04.domain;
    
    public class Comment {
    
        private Integer id;
        private String content;
        private String atuthor;
        private Integer aId; //Article表的主键作为Comment表的"外键"
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getContent() {
            return content;
        }
    
        public void setContent(String content) {
            this.content = content;
        }
    
        public String getAtuthor() {
            return atuthor;
        }
    
        public void setAtuthor(String atuthor) {
            this.atuthor = atuthor;
        }
    
        public Integer getaId() {
            return aId;
        }
    
        public void setaId(Integer aId) {
            this.aId = aId;
        }
    
        @Override
        public String toString() {
            return "Comment{" +
                    "id=" + id +
                    ", content='" + content + '\'' +
                    ", atuthor='" + atuthor + '\'' +
                    ", aId=" + aId +
                    '}';
        }
    }
    
③额外添加pom.xml文件依赖
  • 额外添加pom.xml文件依赖 :

    <!--  druid数据库连接池的"依赖启动器"  -->
    <!--  该依赖中的version不能省略,因为其是阿里巴巴为了迎合Springboot而有,不是Springboot自己制作的  -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.1.10</version>
    </dependency>
    

    上述引入的依赖druid-spring-boot-starter,同样是 阿里巴巴为了迎合Spring Boot 项目 而适配的 Druid 数据源启动器,当在pom.xml文件中引入该启动器后,不需要再进行其他额外配置,Spring Boot项目会自动识别配置Druid 数据源。需要说明的是,上述配置的Druid 数据源启动器内部已经初始化了一些运行参数( 例如 initialSizeminIdlemaxActive 等),如果开发过程中需要修改第三方Druid的运行参数,则必须在全局配置文件中修改

④ 编写application.properties 配置文件
  • application.properties配置文件进行数据库连接配置。打开全局配置文件 application.properties,在配置文件中编写对应的 MySQL数据库连接配置,内容如下 :

application.properties :

spring.application.name=chapter_06

#配置数据库信息
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springbootdata?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT&nullCatalogMeansCurrent=true
spring.datasource.username=root
spring.datasource.password=root

#添加并配置第三方数据源Druid(数据库连接池)
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
#初始化时创建的连接数。当应用程序启动时,连接池会立即创建这么多连接。
spring.datasource.initialSize=20
#连接池中最小的空闲连接数。连接池会维护至少这么多的空闲连接,当空闲连接数低于这个数值时,连接池会创建新的连接。
spring.datasource.minIdle=10
#连接池中最大的活动连接数。这表示在任何时候,连接池中的活动(即被使用的)连接数不会超过这个数值。如果所有连接都在使用中,并且达到这个上限,那么新的数据库连接请求将被阻塞或拒绝,直到有连接可用。
spring.datasource.maxActive=100

配置文件中修改了 Druid数据源的类型初始化连接数最小空闲连接数最大连接数,如果有其他需求,还可以参考 Druid 属性设置更多参数

  • 在上面的 application.properties配置文件 中添加 上述配置 后,会发现initialSizeminIdlemaxActive 底纹为黄色 (IDEA工具中的显示色) , 这是因为在Spring Boot 提供的 数据源自动配置类 :org.springframework.boot.autoconfigure.jdbc.DataSourceProperties 中,没有 与这些 参数对应默认属性,所以 这些设置的属性值 ”无法识别“生效 ,但这几个属性有用的,为 自定义配置类 服务的。然后接下来的操作是就是 : 编写一个自定义配置类配置文件中属性 注入DruidDataSource类属性中
    ps
    为什么要 创建 一个 返回值 为 :DruidDataSource的 自定义 “配置类” 呢 ? 因为要用到 application.properties添加的“配置参数” ,通过 @ConfigurationProperties( )注解 来将application.properties中的相关参数注入到DruidDataSource类中,通过这些“配置参数”来 修改Druid中的默认配置。)
⑤ 编写自定义的关于“DruidDataSource“ 的 配置类”
  • 编写 自定义的“配置类 : (该 配置的作用创建一个 DruidDataSource对象,然后将 application.properties 中关于Druid中的参数注入到 DruidDataSource对象

    package com.myh.chapter_04.config;
    
    import com.alibaba.druid.pool.DruidDataSource;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import javax.sql.DataSource;
    
    @Configuration //标记该类为“配置类”
    public class DataSourceConfig { //关于DruidDataSource的“配置类”
    
        @ConfigurationProperties("spring.datasource") //将配置文件中的spring.datasource开头的“属性值”注入到DruidDataSource对象中的“属性”中
        @Bean //将该方法的返回值“对象”交给IOC容器管理
        public DataSource getDruid() {
            return new DruidDataSource(); //返回值为一个DruidDataSource对象
        }
    }
    

    在上面的代码中,通过 @Configuration注解标识了一个自定义配置类DataSourceConfig,在该配置类中通过 @Bean注解注入了一个DataSource实例对象@ConfigurationProperties(prefix =“spring.datasource”) 注解的作用是将全局配置文件中以spring.datasource开头属性值注入到 getDruid( )方法返回的DataSource类对象属性中,这样就可以完成第三方数据源参数值的注入

2. 使用“注解”的方式整合MyBatis ( 使用 “注解” 来“直接”操作数据库)

  • 相比 SpringMybatis整合Spring Boot与MyBatis的整合会使项目开发更加简便,同时还支持 XML注解 两种配置方式

  • 通过 注解 的方式 整合Mybatis 的例子如 :

  • CommentMapper.java (接口) :

    package com.myh.chapter_05.mapper;
    
    import com.myh.chapter_05.domain.Comment;
    import org.apache.ibatis.annotations.*;
    
    @Mapper //将该接口加入到IOC容器中
    public interface CommentMapper {
    
        @Select("select * from t_comment where id = #{id}")
        public Comment findById(Integer id);
    
        @Insert("insert into t_comment(content,author,a_id) " +
                "values(#{content},#{author},#{aId})")
        public int insertComment(Comment comment);
    
        @Update("update t_comment et content = #{content} where id = #{id}")
        public int updateComment(Comment comment);
    
        @Delete("delete from t_comment where id = #{id}")
        public int deleteComment(Integer id);
    }
    

    上面的代码中,@Mapper( )注解表示该类是一个MyBatis接口文件,并保证能够被Spring Boot自动扫描Spring 容器中;在该接口内部,分别通过 @Select( )@lnsert( )@Update( )@Delete( )
    注解配合 SQL 语句完成了对数据库表t_comment表数据增删改查 操作。

    ”增删改查“注解描述
    @Select( )@Insert( )@Update( )@Delete( )四个注解用于 映射“sql语句接口方法这样调用接口方法能操作数据库

    注意点

    上面的CommentMapper.java 的代码中了添加 @Mapper 注解如果编写的Mapper接口过多时,需要重复为每一个接口文件添加 @Mapper 注解。为了==避免这种麻烦,可以直接在Spring Boot项目启动类添加@MapperScan(“xxx”)注解不需要再逐个添加 @Mapper 注解@MapperScan(“xxx”)注解的作用和 @Mapper注解类似,但是它必须指定需要扫描具体包==名,例如 @MapperScan(“com.itheima.mapper”)

    注解描述
    @Mapper注解@Mapper注解通常只用在接口上,用于将接口加入到IOC容器
    @MapperScan(“需要扫描的包名”)注解用于将指定包下的接口 全都加入到IOC容器。在 SpringBoot 中该注解用在 “项目的启动类”上。

    @MapperScan(" ")注解 例子如:

    @SpringBootApplication
    @MapperScan("com.myh.chapter_05.mapper") //将该包下的所有接口都加入到IOC容器中
    public class Chapter05Application {
    
        public static void main(String[] args) {
            SpringApplication.run(Chapter05Application.class, args);
        }
    }
    
  • application.properties :

    spring.application.name=chapter_06
    
    #配置数据库信息
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    spring.datasource.url=jdbc:mysql://localhost:3306/springbootdata?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT&nullCatalogMeansCurrent=true
    spring.datasource.username=root
    spring.datasource.password=root
    
    #添加并配置第三方数据源Druid(数据库连接池)
    spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
    #初始化时创建的连接数。当应用程序启动时,连接池会立即创建这么多连接。
    spring.datasource.initialSize=20
    #连接池中最小的空闲连接数。连接池会维护至少这么多的空闲连接,当空闲连接数低于这个数值时,连接池会创建新的连接。
    spring.datasource.minIdle=10
    #连接池中最大的活动连接数。这表示在任何时候,连接池中的活动(即被使用的)连接数不会超过这个数值。如果所有连接都在使用中,并且达到这个上限,那么新的数据库连接请求将被阻塞或拒绝,直到有连接可用。
    spring.datasource.maxActive=100
    

    pom.xml :

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.3.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
     <groupId>com.myh</groupId>
        <artifactId>chapter_06</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>chapter_06</name>
        <description>Demo project for Spring Boot</description>
        <properties>
            <java.version>1.8</java.version>
        </properties>
        <dependencies>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid-spring-boot-starter</artifactId>
                <version>1.1.10</version>
            </dependency>
    
            <dependency>
                <groupId>org.junit.jupiter</groupId>
                <artifactId>junit-jupiter</artifactId>
                <version>RELEASE</version>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-jdbc</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>2.0.1</version>
            </dependency>
    
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.28</version>
            </dependency>
    
    
        </dependencies>
    
        <!--    <build>-->
    <!--        <plugins>-->
    <!--            <plugin>-->
    <!--                <groupId>org.springframework.boot</groupId>-->
    <!--                <artifactId>spring-boot-maven-plugin</artifactId>-->
    <!--            </plugin>-->
    <!--        </plugins>-->
    <!--    </build>-->
    
    </project>
    
    

    Chapter06ApplicationTests.java : (单元测试类)

    package com.myh.chapter_06;
    
    import com.myh.chapter_06.domain.Comment;
    import com.myh.chapter_06.mapper.CommentMapper;
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    
    @SpringBootTest
    class Chapter06ApplicationTests {
    
        @Autowired
        private CommentMapper commentMapper;
    
        @Test
        void contextLoads() {
            Comment comment = commentMapper.findById(1);
            System.out.println(comment);
        }
    }
    
    

3. 使用“配置文件”的方式整合MyBatis ( 使用 “XxxMapper.java文件 + XxxMapper.xml文件” 来 操作数据库)

  • Spring BootMyBatis整合使用时,不仅支持注解方式,还支持XML配置文件的方式 (通过 XxxMapper.java+ XxxMapper.xml的方式来操作数据库 )。

  • 例子如下

    Article.java :

    package com.myh.chapter_06.domain;
    
    import java.util.List;
    
    public class Article {
    
        private Integer id;
        private String title; //标题
        private String content; //文章内容
        private List<Comment> commentList; //评论 --要用到“关联映射”的知识点 (为一对多的关系)
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getTitle() {
            return title;
        }
    
        public void setTitle(String title) {
            this.title = title;
        }
    
        public String getContent() {
            return content;
        }
    
        public void setContent(String content) {
            this.content = content;
        }
    
        public List<Comment> getCommentList() {
            return commentList;
        }
    
        public void setCommentList(List<Comment> commentList) {
            this.commentList = commentList;
        }
    
        @Override
        public String toString() {
            return "Article{" +
                    "id=" + id +
                    ", title='" + title + '\'' +
                    ", content='" + content + '\'' +
                    ", commentList=" + commentList +
                    '}';
        }
    }
    
    

    Comment.java :

    package com.myh.chapter_06.domain;
    
    
    public class Comment {
    
        private Integer id;
        private String content;
        private String author;
        private Integer aId;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getContent() {
            return content;
        }
    
        public void setContent(String content) {
            this.content = content;
        }
    
        public String getAuthor() {
            return author;
        }
    
        public void setAuthor(String author) {
            this.author = author;
        }
    
        public Integer getaId() {
            return aId;
        }
    
        public void setaId(Integer aId) {
            this.aId = aId;
        }
    
        @Override
        public String toString() {
            return "Comment{" +
                    "id=" + id +
                    ", content='" + content + '\'' +
                    ", author='" + author + '\'' +
                    ", aId=" + aId +
                    '}';
        }
    }
    
    

    ArticleMapper.java :

    package com.myh.chapter_06.mapper;
    
    import com.myh.chapter_06.domain.Article;
    import org.apache.ibatis.annotations.Mapper;
    
    @Mapper //将该接口加入到IOC容器中
    public interface ArticleMapper { //通过XxxMapper.java 和 XxxMapper.xml配置文件的方式来操作数据库
    
        public Article selectArticle(Integer id);
    
        public int updateArticle(Article article);
    
    }
    
    

    ArticleMapper.xml :

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
    <!--  namespace的命名空间 -->
    <!-- 我们在项目中编写了配置文件,springboot并不知晓,要在全局配置文件中添加Mybatis映射文件的位置-->
    <mapper namespace="com.myh.chapter_06.mapper.ArticleMapper">
    
        <!--  查询文章详细信息(包括评论信息)  -->
        <select id="selectArticle" resultMap="articleWithComment">
            select a.*,c.id c_id,c.content c_content,c.author
            from t_article a ,t_comment c
            where a.id = c.a_id and a.id = #{id}
        </select>
    
        <!--  resultMap进行“关联映射”,进行数据的注入和同时避免字段名和属性名不一致的问题 -->
        <!-- 因为在全局配置文件中用了该配置 : mybatis.type-aliases-package=com.myh.chapter_06.domain ,则下面写“小写字母开头的类名”即可,不用写全限定类名   -->
        <resultMap id="articleWithComment" type="article">
            <id property="id" column="id"/>
            <result property="title" column="title"/>
            <result property="content" column="content"/>
            <!--  collection : 嵌套结果的方式  -->
            <collection property="commentList"  ofType="comment">
                <id property="id" column="c_id"/>
                <result property="content" column="c_content"/>
                <result property="author" column="author"/>
                <result property="aId" column="a_id"/>
            </collection>
        </resultMap>
    
    
        <!--   根据文章id更新文章信息  -->
        <!--  用了动态sql的知识点,有值才设置,没则不用设  -->
        <update id="updateArticle" parameterType="article">
            update t_article
            <set>
                <if test="title!=null and title !=''">
                    title = #{title},
                </if>
                <if test="content!=null and content !=''">
                    content = #{content},
                </if>
            </set>
                where id = #{id}
        </update>
    
    </mapper>
    
    

    上面的配置文件中,<mapper>标签的namespace属性值对应的是ArticleMapper.java接口文件全路径名称,在映射文件中根据ArticleMapper接口文件中的方法,编写两个对应的SQL语句; 同时配置数据类型映射时,没有使用类的全路径名称,而是使用了类的别名(例如,没有使用com.itheima.domain.Article (而是使用了article ) ––因为在 application.properties 中配置了 mybatis.type-aliases-package=com.myh.chapter_06.domain

    注意点

    我们在项目中编写的XML 映射文件Spring Boot并无从知晓,所以无法扫描到自定义编写的XML配置文件,还必须在全局配置文件application.properties
    中添加 MyBatis 映射文件路径的配置 ,同时需要添加实体类别名映射路径。(具体代码application.properties中 )


Chapter06ApplicationTests.java ( 测试类 ) :

	package com.myh.chapter_06;

	import com.myh.chapter_06.domain.Article;
	import com.myh.chapter_06.domain.Comment;
	import com.myh.chapter_06.mapper.ArticleMapper;
	import com.myh.chapter_06.mapper.CommentMapper;
	import org.junit.jupiter.api.Test;
	import org.springframework.beans.factory.annotation.Autowired;
	import org.springframework.boot.test.context.SpringBootTest;
	
	@SpringBootTest
	class Chapter06ApplicationTests {
	
	 
	    @Autowired
	    private ArticleMapper articleMapper;
	
	
	    @Test
	    public void selectArticle() {
	        Article article = articleMapper.selectArticle(1);
	        System.out.println(article);
	    }
	}


测试方法运行结果
在这里插入图片描述

上图可以看出,selectArticle( )方法执行成功,查询出了文章id 为1的文章详情,并关联查询出了对应的评论信息,这说明使用 配置文件的方式整合MyBatis 成功。对于Spring Boot 支持与MyBatis整合的两种方式而言,使用 注解的方式 比较 适合简单的增删改查操作;而使用 配置文件的方式 稍微麻烦,但对于 复杂的数据操作却显得比较实用。实际开发中,使用Spring Boot整合MyBatis进行项目开发时,通常会 混合使用两种整合方式

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

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

相关文章

Nacos下载安装与配置(linux)

一、Nacos下载 官网地址&#xff1a;home (nacos.io) 点击☆&#xff0c;跳转至Github页面。 点击Tags&#xff0c;跳转至版本选择页面&#xff0c;此处选择2.2.0版本。 点击nacos-server-2.2.0.tar.gz&#xff0c;进行下载。 二、将安装包上传至服务器 1.将安装包上传至/usr…

面试官:为什么忘记密码要重置,而不是告诉我原密码?

前端训练营&#xff1a;1v1私教&#xff0c;终身辅导计划&#xff0c;帮你拿到满意的 offer。 已帮助数百位同学拿到了中大厂 offer。欢迎来撩~~~~~~~~ Hello&#xff0c;大家好&#xff0c;我是 Sunday。 最近有个同学在面试中遇到了一个很有意思的问题&#xff0c;我相信大多…

SON序列化解决方案

JSON&#xff08;JavaScript Object Notation&#xff09;是一种用于数据交换的轻量级数据格式。在我们日常Python编程中&#xff0c;通常可以使用内置的json模块来进行JSON序列化和反序列化。那么关于使用json模块进行JSON序列化和反序列化的问题解决方案&#xff0c;可以参考…

0基础如何进入IT行业

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Kubernetes航线图&#xff1a;从船长到K8s掌舵者》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 对于没有任何相关背景知识的人来说&#xff0c;如何才能成…

【放假第1天】采购季倒计时 2G 50/年,4G 618/3年 云服务器选购攻略 阿里云 腾讯云 京东云对比 搭建网站、数据分析

更新日期&#xff1a;4月4日&#xff08;阿里云价格回调&#xff0c;京东云采购季持续进行&#xff09; 本文纯原创&#xff0c;侵权必究 【云服务器推荐】价格对比&#xff01;阿里云 京东云 腾讯云 选购指南视频截图 《最新对比表》已更新在文章头部—腾讯云文档&#xff…

腾讯云4核8g服务器性能如何?知道说说

腾讯云4核8G服务器价格&#xff1a;轻量4核8G12M优惠价格646元15个月、CVM S5服务器4核8G配置1437元买1年送3个月。腾讯云4核8G服务器支持多少人同时在线&#xff1f;支持30个并发数&#xff0c;可容纳日均1万IP人数访问。腾讯云百科txybk.com整理4核8G服务器支持多少人同时在线…

SWM341系列应用(上位机应用)

SWM341系列之上位机应用 1、分级图像和PNG、JPG的应用 现象&#xff1a;客户使用SWM34SVET6HMI_0.4.1版本上位机进行UI界面布局&#xff0c;反馈在模拟运行时&#xff08;PC端&#xff09;流畅&#xff0c;在Demo平台&#xff08;设备端&#xff09;运行卡顿。 分析及解决&…

Object类与内部类

废话不多说&#xff0c;直接进入正题。 目录 一、Object类 1.介绍Object类 2.toString方法 3.equals方法 4.hashCode方法 二、内部类 1.静态内部类 2.实例内部类 3.匿名内部类 4.局部内部类 一、Object类 1.介绍Object类 &#xff08;1&#xff09;Object类就是所有…

算法学习——LeetCode力扣补充篇6(132. 分割回文串 II、673. 最长递增子序列的个数、841. 钥匙和房间、463. 岛屿的周长)

算法学习——LeetCode力扣补充篇6 132. 分割回文串 II 132. 分割回文串 II - 力扣&#xff08;LeetCode&#xff09; 描述 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。 返回符合要求的 最少分割次数 。 示例 示例 1&#…

一文了解低功耗蓝牙BLE

低功耗蓝牙技术可以构建两种类型的设备:双模设备和单模设备。双模设备既支持经典蓝牙又支持低功耗蓝牙。单模设备只支持低功耗蓝牙。还有仅支持经典蓝牙的设备。 在链路层,设备被分为广播者、扫描者、从设备和主设备。广播者是传输数据包的设备,扫描者是接收广播者的数据包…

ids工业相机与电控位移台同步控制及数据采集

通过VS2017和OpenCV,实现ids工业相机与电控位移台同步控制及数据采集 目录项目环境配置代码流程及思路项目架构项目开发运行效果开发关键ids相机配置位移台环境配置相机头文件相机参数设置保存图像函数设置电控位移台头文件电控位移台设置参数最后就是通过main函数进行调用和控…

美易官方:华尔街分析师最青睐的股票过去五年表现怎么样

华尔街分析师一直被视为金融市场的风向标&#xff0c;他们的推荐和预测往往能影响投资者的决策。然而&#xff0c;分析师的预测并不总是准确无误的&#xff0c;特别是在变幻莫测的股市中。那么&#xff0c;我们不禁要问&#xff0c;华尔街分析师最青睐的股票在过去五年中的表现…

OpenHarmony实战:小型系统移植概述

驱动主要包含两部分&#xff0c;平台驱动和器件驱动。平台驱动主要包括通常在SOC内的GPIO、I2C、SPI等&#xff1b;器件驱动则主要包含通常在SOC外的器件&#xff0c;如 LCD、TP、WLAN等 图1 OpenHarmony 驱动分类 HDF驱动被设计为可以跨OS使用的驱动程序&#xff0c;HDF驱动框…

单总线及DS18B20

目录 单总线 单总线介绍 单总线的电路规范 单总线时序结构 初始化 代码理解 发送一位 代码理解 接收一位 代码理解 发送一个字节 代码理解 接收一个字节 代码理解 DS18B20 DS18B20介绍 引脚及应用电路 内部结构 存储器结构 DS18B20操作流程 ROM指令 功能…

大厂面试之【Redis持久化机制】 - RDB和AOF概述及应用配置

文章目录 Redis持久化1. RDB(Redis DataBase)1.1 概述1.2 配置应用 2. AOF(Append Only File)2.1 概述2.2 配置应用 Redis持久化 先上结论&#xff1a;Redis持久化操作分为rdb以及aof&#xff0c;但是前者已经够用 1. RDB(Redis DataBase) 1.1 概述 rdb保存的是dump.rdb文件在指…

基于springboot实现校园资料分享平台系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现校园资料分享平台演示 摘要 随着信息互联网购物的飞速发展&#xff0c;国内放开了自媒体的政策&#xff0c;一般企业都开始开发属于自己内容分发平台的网站。本文介绍了校园资料分享平台的开发全过程。通过分析企业对于校园资料分享平台的需求&#xff0c;创…

C++ 11是如何封装Thread库的?

引言 C11 标准引入了一个重要的特性&#xff0c;即原生线程支持&#xff0c;这标志着C语言在并发编程领域迈出了坚实的步伐。在此之前&#xff0c;开发人员在进行跨平台的多线程编程时&#xff0c;不得不依赖于操作系统提供的特定API&#xff0c;如Windows API或POSIX Threads…

开发环境->生产环境

1、数据迁移 不涉及docker # 以数据库用户导出数据 mysqldump -h 192.168.1.168 -P 3307 -u abragent -pabragebb17 abragent > abragent.sql# 以root用户导出数据 mysqldump -h 192.168.1.168 -P 3307 -u root -p8d3Ba1b abragent > abragent.sql 涉及docker …

Android12 简单的共享内存驱动实现 参考Ashmem

Android12 共享内存驱动实现 SOC&#xff1a;RK3568 system&#xff1a;Android12 概述&#xff1a; 1. 概述 Ashmem&#xff08;Anonymous Shared Memory&#xff0c;Android 匿名共享内存&#xff09;&#xff0c;它基于 mmap 系统调用&#xff0c;可以让不同进程将同一段…

数据恢复工具哪个成功率高?十大数据恢复软件榜单

数据恢复软件可以恢复损坏或删除的数据。使用数据恢复软件恢复存储在安全位置的剩余信息。您可能会因意外删除文件、文件系统逻辑损坏甚至存储故障等各种原因而丢失数据。执行查看、复制、扫描、识别或提取存储设备中已删除扇区的数据等操作。恢复虚拟存储在任何设备&#xff0…