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 Data 是 Spring 提供的一个用 于简化数据库访问、支持云服务的开源框架。它是一个 伞形项目,包含了 大量关系型数据库 及 非关系型数据库 的 数据访问解决方案,其设计目的是使我们可以快速且简单地使用各种数据访问技术。
Spring Boot默认采用整合 Spring Data 的方式统一处理数据访问层,通过添加大量自动配置,引入各种数据访问模板 xxxTemplate 以及统一的 Repository 接口,从而达到简化数据访问层的操作。
Spring Data 提供了 多种类型数据库支持,Spring Boot对 Spring Data支持的数据库进行了 整合管理 ,提供了 各种依赖启动器。
常见的 数据库依赖启动器,如下表所示 :
名称 描述 spring-boot-starter-data-jpa Spring Data JPA 与 Hibernate 的启动器 spring-boot-starter-data-mongodb MongoDB 和 Spring Data MongoDB 的启动器 spring-boot-starter-data-neo4j Neo4j 图数据库 和 Spring Data Neo4j 的启动器 spring-boot-starter-data-redis Redis键值数据存储 与 Spring Data Redis 和 Jedis客户端 的启动器 需要说明的是,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_article和t_comment ,并向表中插入数据。
其中评论表t_comment 的a_id 与文章表t_article 的主键id 相关联 ( t_article的主键作为t_comment表的 “外键”)。springbootdata.sql
② 创建项目,引入相应的启动器,编写数据库对应的“实体类”
使用 Spring Initializr 的方式 创建 Spring Boot 项目。在Dependencies依赖中选择 SQL 模块中的 MySQL 和 MyBatis依赖,并根据后续提示完成项目创建。
编写 数据库 对应的 “实体类” :
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 数据源启动器内部已经初始化了一些运行参数( 例如 initialSize、minIdle、maxActive 等),如果开发过程中需要修改第三方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配置文件 中添加 上述配置 后,会发现initialSize、minIdle 和 maxActive 底纹为黄色 (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 ( 使用 “注解” 来“直接”操作数据库)
相比 Spring 与 Mybatis的整合,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 Boot 与MyBatis整合使用时,不仅支持注解方式,还支持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文件)② 创建项目,引入相应的启动器,编写数据库对应的“实体类”③额外添加pom.xml文…...
ActiViz中的数据集vtkPolyData
文章目录 前言一、数据结构二、数据内容三、几何操作四、数据导入与导出五、数据可视化六、函数详解1、SetPoints(vtkPoints points):2、SetPolys(vtkCellArray polys):3、GetNumberOfPoints():4、GetNumberOfCells():5、GetPointData():6、GetCellData():7、Ge...
【测试篇】测试用例
文章目录 前言具体设计测试用例等价类边界值场景设计法判定表(因果图)正交排列(用的非常少)错误猜测法 前言 什么是测试用例?? 测试用例是针对软件系统或应用程序的特定功能或场景编写的一组步骤…...
Shell学习 - 2.24 Shell let命令:对整数进行数学运算
let 命令和双小括号 (( )) 的用法是类似的,它们都是用来对整数进行运算,读者已经学习了《Shell (())》,再学习 let 命令就相当简单了。 注意:和双小括号 (( )) 一样,let 命令也只能进行整数运算,不能对小数…...
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 中的字符串类型:&str 和 String 文章目录 Rust 中的字符串类型:&str 和 String1. &str:不可变的字符串引用2. String:可变的字符串3、字符串使用综合案例代码执行结果 在 Rust 编程语言中,有两种主要…...
Visual Studio(VS) 搭建 QT 开发环境
Visual Studio(VS) 搭建 QT 开发环境 在当今的软件开发领域,Visual Studio(VS)是一款备受欢迎的集成开发环境(IDE),而 QT 则是一个强大的跨平台应用程序框架。将两者结合使用,可以为开发人员提供高效、便捷的开发体验。本文将详细介绍如何在 VS2022 中搭建 QT 开发环…...
Qt模拟面试(超硬核)
1. 请简要介绍一下你的 Qt 开发经验。 建议:诚实地描述你的 Qt 经验,包括你使用过的 Qt 版本、开发过的项目类型、遇到的挑战以及如何解决它们。 假如你没有开发经验,可以提供一些关于 Qt 开发的一般信息和常见的经验分享。 Qt 是一个跨平…...
某眼实时票房接口获取
某眼实时票房接口获取 前言解决方案1.找到veri.js2.找到signKey所在位置3.分析它所处的这个函数的内容4.index参数的获取5.signKey参数的获取运行结果关键代码另一种思路票房接口:https://piaofang.maoyan.com/dashboard-ajax https://piaofang.maoyan.com/dashboard 实时票房…...
cesium键盘控制相机位置和姿态
该类主要用于监听键盘事件并在用户按下不同按键时执行相应的相机操作,如改变相机的位置、偏航角、俯仰角和翻滚角,从而实现在三维场景中的漫游。 以下是代码的主要逻辑: 导入Cesium库,并定义一个flags对象,其中包含了…...
基于ArrayList实现简单洗牌
前言 在之前的那篇文章中,我们已经认识了顺序表—>http://t.csdnimg.cn/2I3fE 基于此,便好理解ArrayList和后面的洗牌游戏了。 什么是ArrayList? ArrayList底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表&…...
Paddle实现人脸对比
人脸对比 人脸对比,顾名思义,就是对比两个人脸的相似度。本文将用Paddle实现这一功能。 PS:作者肝了整整3天才稍微搞明白实现方法 数据集准备 这里使用百度AI Studio的开源数据集: 人脸数据_数据集-飞桨AI Studio星河社区 (b…...
挖一挖:PostgreSQL Java里的double类型存储到varchar精度丢失问题
前言 大概故事是这样的,PostgreSQL数据库,表结构: create table t1(a varchar);然后使用标准的Java jdbc去插入数据,其基本代码如下: import java.sql.*; public class PgDoubleTest {public static void main(Stri…...
函数对象基本使用
一、函数对象概念 1.重载函数调用操作符的类,其对象常称为函数对象 2.函数对象使用重载的()时,行为类似函数调用,也叫仿函数 本质: 函数对象(仿函数)是一个类,不是一个函数 二、函数对象使用 特点: 函…...
浅谈HTTP
浅谈HTTP 要通过netty实现HTTP服务器(或者客户端),首先你要了解HTTP协议。 HTTP在客户端 - 服务器计算模型中用作请求 - 响应协议。 例如,web浏览器可以是客户端,并且在托管网站的计算机上运行的应用程序可以是服务器。 客户端向服务器提交…...
HarmonyOS NEXT应用开发之@Provide装饰器和\@Consume装饰器:与后代组件双向同步
Provide和Consume,应用于与后代组件的双向数据同步,应用于状态数据在多个层级之间传递的场景。不同于上文提到的父子组件之间通过命名参数机制传递,Provide和Consume摆脱参数传递机制的束缚,实现跨层级传递。 其中Provide装饰的变…...
Docker 安装 | 部署MySQL 8.x 初始设置
1、准备工作 如果不想看前面的废话请直接右边目录跳到 运行容器 处 默认你已经有 docker 环境。 Windows 推荐 Docker Desktop (下载地址)并基于 WSL2 运行 Docker 环境 mac 推荐 Orbstack (下载地址)(这个很节省资源&…...
linux三剑客之流编辑器sed
sed(stream editor)是Linux和Unix系统中一个非常强大的文本处理工具。它主要用于对文本数据进行过滤和转换。sed 可以在不打开文件的情况下,直接对输入流进行操作,并且可以将结果输出到标准输出或文件。 基本语法: s…...
【Android Studio】上位机-安卓系统手机-蓝牙调试助手
【Android Studio】上位机-安卓系统手机-蓝牙调试助手 文章目录 前言AS官网一、手机配置二、移植工程三、配置四、BUG五、Java语言总结 前言 提示:以下是本篇文章正文内容,下面案例可供参考 AS官网 AS官网 一、手机配置 Android Studio 下真机调试 …...
怎样把学浪购买的课程下载下来
如何把学浪已购买的课程下载下来?这里就教大家一个方法,利用一个工具轻轻松松把视频下载下来 这个工具我打包成压缩包了,有需要的自己取一下 链接:https://pan.baidu.com/s/1y7vcqILToULrYApxfEzj_Q?pwdkqvj 提取码:kqvj --来自百度网盘超级会员V1…...
SD-WAN如何解决更有性价比地跨境网络问题
云桥通SD-WAN利用智能路由和负载均衡技术,优化数据传输路径,提高网络性能和可靠性。这意味着数据在跨国传输时可以更快到达目的地,减少延迟和丢包率。跨境SD-WAN提高了网络连接速度和质量,使用户能够更快地访问跨国业务所需的资源…...
第15章 File类与IO流
一 java.io.File类的使用 1.1 概述 File类及本章下的各种流,都定义在java.io包下。一个File对象代表硬盘或网络中可能存在的一个文件或者文件目录(俗称文件夹),与平台无关。(体会万事万物皆对象)File 能新…...
C语言基础语法-教案16(从小白到劝退之结构体初阶)
最近给大家争取到一个 深夜福利 保证你在深夜手机刷到 嘎嘎香~ 那就是 大流量卡 缺点:月租太便宜 185GB~ 100分钟通话时长~ 长期套餐~ 畅想自由的气息 流量自由的同时还拥有超长通话,而且免费领取。 名额有限,咱们废话不多说直接上…...
Linux:ip和ip协议的初步认识
文章目录 ip协议基本认识ip协议的报头网段划分ip的类型划分 ip协议基本认识 前面对于TCP的内容已经基本结束了,那么这也就意味着在传输层也已经结束了,那么下一步要进入的是的是网络层,网络层中也有很多种协议,这里主要进行解析的…...
Android12 简单的共享内存驱动实现 参考Ashmem
Android12 共享内存驱动实现 SOC:RK3568 system:Android12 概述: 1. 概述 Ashmem(Anonymous Shared Memory,Android 匿名共享内存),它基于 mmap 系统调用,可以让不同进程将同一段…...
物理安全和逻辑安全在信息安全中的重要作用
在信息时代,信息安全已经成为企业和个人不可或缺的重要组成部分。物理安全和逻辑安全作为信息安全的两大支柱,发挥着至关重要的作用。 什么是物理安全和逻辑安全? 物理安全是指通过技术手段,对计算机设备、网络设备、数据中心等…...
每日一题 --- 滑动窗口最大值[力扣][Go]
滑动窗口最大值 题目:239. 滑动窗口最大值 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1࿱…...
TensorBoard可视化+Confustion Matrix Drawing
for later~ 代码阅读 1. 加载trainset import argparse import logging import os import numpy as npimport torch from torch import distributed from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriterfrom backbones import get_…...
012——LED模块驱动开发(基于I.MX6uLL)
目录 一、 硬件原理图 二、 驱动程序 三、 应用程序 四、 Makefile 五、操作 一、 硬件原理图 又是非常经典的点灯环节 ,每次学新语言第一步都是hello world,拿到新板子或者学习新的操作系统,第一步就是点灯。 LED 的驱动方式࿰…...
基于springboot实现房屋租赁管理系统项目【项目源码+论文说明】计算机毕业设计
基于springboot实现房屋租赁系统演示 摘要 房屋是人类生活栖息的重要场所,随着城市中的流动人口的增多,人们对房屋租赁需求越来越高,为满足用户查询房屋、预约看房、房屋租赁的需求,特开发了本基于Spring Boot的房屋租赁系统。 …...
东莞桥头网站建设/怎么创建网站教程
摘抄自:《Vivado 从此开始》高亚军著 时序分析是建立在时序约束的基础之上的,因此,合理的时序约束对时序分析起着关键性作用。时序约束的对象是时序路径,典型的时序路径有4类,如图6.1所示。这4类路径可分为片间路径&am…...
做竹鼠网站/seoul是哪个城市
存储的时候报Field id doesnt have a default value错误 错误分析如下: 1.首先检查数据库设计的主键是否为Int 类型 2.如果是Int 类型检查数据库中设置是否为自增 各种数据库中的自增的方法不同,具体参考各个数据库的API...
wordpress悬浮客服代码/济南谷歌推广
文/钟微 王古锋编辑/子夜人们已经习惯了人脸识别的存在。 酒店接待旅客,刷脸登记入住,马路上车辆川流不息,司机们习惯于通过人脸识别解锁手机,而他们头顶的摄像头,正在利用同样的技术自动抓拍。 作为近年来AI浪潮中的标…...
网站建设全过程及如何赚钱/搜索引擎seo如何赚钱
引用国外友人搭建RUBiS的一句心得,RUBiS is a PAIN!! 很多搞阔研的人在做实验的时候都会用到RUBiS,但是RUBiS的搭建确实很让人头大。一来,使用到RUBiS的人少之又少。二来,RUBiS项目已经停止维护了,最经的一次更新也是在…...
做网站文字怎么围绕图片/百度竞价排名是什么意思
data class 相当于把JAVA中的toString方法复写了一遍 它更加易表现:这是它最重要的优点之一。你可以编写少得多的代码。 它更加安全:Kotlin是空安全的,也就是说在我们编译时期就处理了各种null的 情况,避免了执行时异常。如果一…...
微信端网站开发模板/网站快速收录
这章开始学习SSH中最后的一个框架spring。Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。 首先就来学习一下IOC,它的好处就是降低了耦合,主要是通过bean之…...