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

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

目录:

    • 一、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;}@Overridepublic 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;}@Overridepublic 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 {@Autowiredprivate CommentMapper commentMapper;@Testvoid 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;}@Overridepublic 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;}@Overridepublic 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 mapperPUBLIC "-//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.authorfrom t_article a ,t_comment cwhere 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;@SpringBootTestclass Chapter06ApplicationTests {@Autowiredprivate ArticleMapper articleMapper;@Testpublic void selectArticle() {Article article = articleMapper.selectArticle(1);System.out.println(article);}}

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

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

相关文章:

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

目录: 一、Spring Boot”数据访问概述“二、Spring Boot”整合MyBatis”1. 基础环境搭建 (引入对应的“依赖启动器” 配置数据库的“相关参数”)① 数据准备 (导入Sql文件)② 创建项目&#xff0c;引入相应的启动器&#xff0c;编写数据库对应的“实体类”③额外添加pom.xml文…...

ActiViz中的数据集vtkPolyData

文章目录 前言一、数据结构二、数据内容三、几何操作四、数据导入与导出五、数据可视化六、函数详解1、SetPoints(vtkPoints points):2、SetPolys(vtkCellArray polys):3、GetNumberOfPoints():4、GetNumberOfCells():5、GetPointData():6、GetCellData():7、Ge...

【测试篇】测试用例

文章目录 前言具体设计测试用例等价类边界值场景设计法判定表&#xff08;因果图&#xff09;正交排列&#xff08;用的非常少&#xff09;错误猜测法 前言 什么是测试用例&#xff1f;&#xff1f; 测试用例是针对软件系统或应用程序的特定功能或场景编写的一组步骤&#xf…...

Shell学习 - 2.24 Shell let命令:对整数进行数学运算

let 命令和双小括号 (( )) 的用法是类似的&#xff0c;它们都是用来对整数进行运算&#xff0c;读者已经学习了《Shell (())》&#xff0c;再学习 let 命令就相当简单了。 注意&#xff1a;和双小括号 (( )) 一样&#xff0c;let 命令也只能进行整数运算&#xff0c;不能对小数…...

langchain Chroma 构建本地向量数据库

langchain Chroma 构建本地向量数据库 # import from langchain_community.document_loaders import TextLoader from langchain_community.embeddings.sentence_transformer import (SentenceTransformerEmbeddings, ) from langchain_community.embeddings import HuggingFa…...

Rust 中的字符串类型:`str` 和 `String`

Rust 中的字符串类型&#xff1a;&str 和 String 文章目录 Rust 中的字符串类型&#xff1a;&str 和 String1. &str&#xff1a;不可变的字符串引用2. String&#xff1a;可变的字符串3、字符串使用综合案例代码执行结果 在 Rust 编程语言中&#xff0c;有两种主要…...

Visual Studio(VS) 搭建 QT 开发环境

Visual Studio(VS) 搭建 QT 开发环境 在当今的软件开发领域,Visual Studio(VS)是一款备受欢迎的集成开发环境(IDE),而 QT 则是一个强大的跨平台应用程序框架。将两者结合使用,可以为开发人员提供高效、便捷的开发体验。本文将详细介绍如何在 VS2022 中搭建 QT 开发环…...

Qt模拟面试(超硬核)

1. 请简要介绍一下你的 Qt 开发经验。 建议&#xff1a;诚实地描述你的 Qt 经验&#xff0c;包括你使用过的 Qt 版本、开发过的项目类型、遇到的挑战以及如何解决它们。 假如你没有开发经验&#xff0c;可以提供一些关于 Qt 开发的一般信息和常见的经验分享。 Qt 是一个跨平…...

某眼实时票房接口获取

某眼实时票房接口获取 前言解决方案1.找到veri.js2.找到signKey所在位置3.分析它所处的这个函数的内容4.index参数的获取5.signKey参数的获取运行结果关键代码另一种思路票房接口:https://piaofang.maoyan.com/dashboard-ajax https://piaofang.maoyan.com/dashboard 实时票房…...

cesium键盘控制相机位置和姿态

该类主要用于监听键盘事件并在用户按下不同按键时执行相应的相机操作&#xff0c;如改变相机的位置、偏航角、俯仰角和翻滚角&#xff0c;从而实现在三维场景中的漫游。 以下是代码的主要逻辑&#xff1a; 导入Cesium库&#xff0c;并定义一个flags对象&#xff0c;其中包含了…...

基于ArrayList实现简单洗牌

前言 在之前的那篇文章中&#xff0c;我们已经认识了顺序表—>http://t.csdnimg.cn/2I3fE 基于此&#xff0c;便好理解ArrayList和后面的洗牌游戏了。 什么是ArrayList? ArrayList底层是一段连续的空间&#xff0c;并且可以动态扩容&#xff0c;是一个动态类型的顺序表&…...

Paddle实现人脸对比

人脸对比 人脸对比&#xff0c;顾名思义&#xff0c;就是对比两个人脸的相似度。本文将用Paddle实现这一功能。 PS&#xff1a;作者肝了整整3天才稍微搞明白实现方法 数据集准备 这里使用百度AI Studio的开源数据集&#xff1a; 人脸数据_数据集-飞桨AI Studio星河社区 (b…...

挖一挖:PostgreSQL Java里的double类型存储到varchar精度丢失问题

前言 大概故事是这样的&#xff0c;PostgreSQL数据库&#xff0c;表结构&#xff1a; create table t1(a varchar);然后使用标准的Java jdbc去插入数据&#xff0c;其基本代码如下&#xff1a; import java.sql.*; public class PgDoubleTest {public static void main(Stri…...

函数对象基本使用

一、函数对象概念 1.重载函数调用操作符的类&#xff0c;其对象常称为函数对象 2.函数对象使用重载的()时&#xff0c;行为类似函数调用&#xff0c;也叫仿函数 本质&#xff1a; 函数对象(仿函数)是一个类&#xff0c;不是一个函数 二、函数对象使用 特点&#xff1a; 函…...

浅谈HTTP

浅谈HTTP 要通过netty实现HTTP服务器(或者客户端)&#xff0c;首先你要了解HTTP协议。 HTTP在客户端 - 服务器计算模型中用作请求 - 响应协议。 例如&#xff0c;web浏览器可以是客户端&#xff0c;并且在托管网站的计算机上运行的应用程序可以是服务器。 客户端向服务器提交…...

HarmonyOS NEXT应用开发之@Provide装饰器和\@Consume装饰器:与后代组件双向同步

Provide和Consume&#xff0c;应用于与后代组件的双向数据同步&#xff0c;应用于状态数据在多个层级之间传递的场景。不同于上文提到的父子组件之间通过命名参数机制传递&#xff0c;Provide和Consume摆脱参数传递机制的束缚&#xff0c;实现跨层级传递。 其中Provide装饰的变…...

Docker 安装 | 部署MySQL 8.x 初始设置

1、准备工作 如果不想看前面的废话请直接右边目录跳到 运行容器 处 默认你已经有 docker 环境。 Windows 推荐 Docker Desktop &#xff08;下载地址&#xff09;并基于 WSL2 运行 Docker 环境 mac 推荐 Orbstack &#xff08;下载地址&#xff09;&#xff08;这个很节省资源&…...

linux三剑客之流编辑器sed

sed&#xff08;stream editor&#xff09;是Linux和Unix系统中一个非常强大的文本处理工具。它主要用于对文本数据进行过滤和转换。sed 可以在不打开文件的情况下&#xff0c;直接对输入流进行操作&#xff0c;并且可以将结果输出到标准输出或文件。 基本语法&#xff1a; s…...

【Android Studio】上位机-安卓系统手机-蓝牙调试助手

【Android Studio】上位机-安卓系统手机-蓝牙调试助手 文章目录 前言AS官网一、手机配置二、移植工程三、配置四、BUG五、Java语言总结 前言 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 AS官网 AS官网 一、手机配置 Android Studio 下真机调试 …...

怎样把学浪购买的课程下载下来

如何把学浪已购买的课程下载下来?这里就教大家一个方法,利用一个工具轻轻松松把视频下载下来 这个工具我打包成压缩包了,有需要的自己取一下 链接&#xff1a;https://pan.baidu.com/s/1y7vcqILToULrYApxfEzj_Q?pwdkqvj 提取码&#xff1a;kqvj --来自百度网盘超级会员V1…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...