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;
        }
    
        @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进行项目开发时,通常会 混合使用两种整合方式

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

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

相关文章

尚硅谷50道Java面试题笔记 写的不全

b站链接&#xff1a;https://www.bilibili.com/video/BV1Bb411d7SL/?p4&vd_source714a8042f058b82c668750a0930ff9b0 1 mysql使用innodb引擎&#xff0c;请简述mysql索引的最左前缀如何优化orderby语句。 关键点&#xff1a; 如果排序字段不在索引列上&#xff0c;file…

Filter Listener Interceptor

文章目录 第一章 Filter1. 目标2. 内容讲解2.1 Filter的概念2.2 Filter的作用2.3 Filter的入门案例2.3.1 案例目标2.3.2 代码实现2.3.2.1 创建ServletDemo012.3.2.2 创建EncodingFilter 2.4 Filter的生命周期2.4.1 回顾Servlet生命周期2.4.1.1 Servlet的创建时机2.4.1.2 Servle…

趣学前端 | 类,我想好好继承它的知识点

背景 最近睡前习惯翻会书&#xff0c;重温了《JavaScript权威指南》。这本书&#xff0c;文字小&#xff0c;内容多。两年了&#xff0c;我才翻到第十章。因为书太厚&#xff0c;平时都充当电脑支架。 JavaScript 类 话说当年类、原型、继承&#xff0c;差点给我绕晕。 在J…

Excel、PowerQuery 和 ChatGPT 终极手册(下)

原文&#xff1a;Ultimate ChatGPT Handbook for Enterprises 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 使用 SUMIFS、SUMPRODUCT、AGGREGATE 和 MAX 函数查找数值数据 其中之一鲜为人知的事实是&#xff0c;当查找单个数值时&#xff0c;匹配和三角函数可能比查…

软考--软件设计师(软件工程总结1)

目录 1.定义 2.软件生存周期 3.软件过程&#xff08;即软件开发中遵循的一系列可预测的步骤&#xff09; ​编辑4.软件开发模型 5.需求分析&#xff08;软件需求分析&#xff0c;系统需求分析或需求分析工程&#xff09; 6. 需求工程 7.系统设计 8.系统测试 1.定义 软件…

Android Studio学习9——使用Logcat打印日志

在Android开发中&#xff0c;Logcat是一个工具&#xff0c;它允许开发者查看设备或模拟器的日志信息。开发者可以使用Log类来打印日志信息&#xff0c;这对于调试和错误排查非常有帮助。 v 或 verbose: 最低等级&#xff0c;显示所有消息。d 或 debug: 用于调试消息。i 或 info…

在集群中使用deepspeed如果端口被占用可以使用deepspeed参数更改

在集群中使用deepspeed如果端口被占用可以使用deepspeed参数更改 这一次G老师不好使了 在集群中使用deepspeed默认的端口号29500被占用&#xff0c;显示更改居然不起作用 G老师给的方法也不好使 #!/bin/bash MASTER_ADDRlocalhost MASTER_PORT29501 # 选择一个未被占用的端…

Qt | 发布程序(以 minGW 编译器为例)

1、注意:修改 pro 文件后,最好执行“构建”>“重新构建项目”,否则 pro 文件的更改将不会反应到程序上。 2、发布程序的目的:就是让编译后生成的可执行文件(如 exe 文件),能在其他计算机上运行。 一、编译后生成的各种文件简介 Qt Creator 构建项目后产生的文件及目录…

SCI一区 | Matlab实现NGO-TCN-BiGRU-Attention北方苍鹰算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测

SCI一区 | Matlab实现NGO-TCN-BiGRU-Attention北方苍鹰算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测 目录 SCI一区 | Matlab实现NGO-TCN-BiGRU-Attention北方苍鹰算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测预测效果基本介绍模型…

鸿蒙原OS开发实例:【ArkTS类库单次I/O任务开发】

Promise和async/await提供异步并发能力&#xff0c;适用于单次I/O任务的场景开发&#xff0c;本文以使用异步进行单次文件写入为例来提供指导。 实现单次I/O任务逻辑。 import fs from ohos.file.fs; import common from ohos.app.ability.common;async function write(data:…

文心一言指令词宝典之生活篇

作者&#xff1a;哈哥撩编程&#xff08;视频号、抖音、公众号同名&#xff09; 新星计划全栈领域优秀创作者博客专家全国博客之星第四名超级个体COC上海社区主理人特约讲师谷歌亚马逊演讲嘉宾科技博主极星会首批签约作者 &#x1f3c6; 推荐专栏&#xff1a; &#x1f3c5;…

前端三剑客 —— CSS (第一节)

目录 CSS 什么是CSS CSS的几种写法&#xff1a; 行内样式 内嵌样式 外链样式 import 加载顺序 CSS选择器*** 基本选择器 ID选择器 标签选择器 类选择器 通用选择器 包含选择器 上节内容中提到了 前端三剑客 —— HTML 超文本标记语言&#xff0c;这节内容 跟大家…

基于注意力整合的超声图像分割信息在乳腺肿瘤分类中的应用

基于注意力整合的超声图像分割信息在乳腺肿瘤分类中的应用 摘要引言方法 Segmentation information with attention integration for classification of breast tumor in ultrasound image 摘要 乳腺癌是世界范围内女性最常见的癌症之一。基于超声成像的计算机辅助诊断&#x…

Day80:服务攻防-中间件安全HW2023-WPS分析WeblogicJettyJenkinsCVE

目录 中间件-Jetty-CVE&信息泄漏 CVE-2021-34429(信息泄露) CVE-2021-28169(信息泄露) 中间件-Jenkins-CVE&RCE执行 cve_2017_1000353 CVE-2018-1000861 cve_2019_1003000 中间件-Weblogic-CVE&反序列化&RCE 应用金山WPS-HW2023-RCE&复现&上线…

每日一题(leetcode75):颜色分类-双指针

采用双指针法&#xff0c;p0维护数字0&#xff0c;p1维护数字1。遇到1时&#xff0c;交换并且p1加1&#xff0c;遇到0时&#xff0c;交换并观察0的指针是不是小于1的指针&#xff0c;如果小于&#xff0c;那么之前0指针指向的数据1会被交换出去&#xff0c;所以要进一步进行交换…

全栈的自我修养 ———— react中router入门+路由懒加载

router 下载router配置view创建目录配置index.js 下载router npm install react-router-dom配置view 如下将组件倒出 const Login () > {return <div>这是登陆</div> } export default Login创建目录 配置index.js React.lazy有路由懒加载的功能&#xff0…

MySQL 表的增删改查

文章目录 一、什么是CRUD&#xff1f;二、新增&#xff08;Create&#xff09;1、单行数据 全列插入2、多行数据 指定列插入3、插入特殊类型 三、查询&#xff08;Retrieve&#xff09;1、全列查询2、指定列查询3、表达式查询4、指定别名5、去重6、排序7、条件查询基本查询&a…

vue快速入门(六)v-else和v-else-if

注释很详细&#xff0c;直接上代码 上一篇 新增内容 v-else-if用法v-else用法 源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-s…

开放威胁情报社区

AlienVault - Open Threat ExchangeLearn about the latest cyber threats. Research, collaborate, and share threat intelligence in real time. Protect yourself and the community against todays emerging threats.https://otx.alienvault.com/

Redis 全景图(3)--- Redis 应用于缓存

前言 这是关于 Redis 全景图的最后一篇文章。因为一次写太多会限流&#xff0c;我也是没办法&#xff0c;才分成三篇文章来写。这篇文章是关于 Redis 应用于缓存的。 其实为什么要讲这个话题呢&#xff1f; Redis 应用在很多地方呀&#xff0c;为什么一定要挑着这个话题来讲呢…