做SSM项目的步骤和优化

news2024/11/20 4:42:30

SSM框架整合

这里说的SSM整合,主要说的是Spring和mybatis之间的整合。因为spring和springMVC都是spring生态系统中的框架,所以spring和springMVC之间的整合是无缝的整合,即,我们在不知不觉中,其实spring和springMVC已经整合好了,不用你做什么额外的事情了。但是mybatis是第三方的框架,所以我们要手动把spring和mybatis进行整合。

原始整合,即,我们每一层之前怎么学的(mybatis管理dao层,springMVC管理view层),这里就怎么直接用。但是原始整合,你会发现这种整合中,spring和mybatis的整合度不是很高。所以我们之后会解决这些问题,这些问题解决了,SSM框架的整合就已经OK了。这里,我们先学原始的整合方式,然后我们解决原始整合方式存在的问题,解决完了,我们本节“SSM框架整合”的学习就结束了。

原始整合方式

原始整合方式,就是我们直接用SSM框架来做web项目,所以整合的步骤:无。即,你想怎么写这个项目,就怎么写,该用框架的时候就直接用框架来写代码就行了。

没有整合的步骤,那我们来看看我们平常写项目的步骤就行了,平常写项目的步骤做完了,原始整合就结束了。

下面用一个例子来做演示:

步骤:

  1. 编写数据库和表

    建库如下:

    在这里插入图片描述

    建表如下:

    在这里插入图片描述

  2. 创建maven项目,并且创建maven工程可能需要的包。反正就是把项目的结构搭好。

    在这里插入图片描述

  3. 导入项目可能需要用到的架包

    <?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
    
      <groupId>org.itcast</groupId>
      <artifactId>ssm</artifactId>
      <version>1.0-SNAPSHOT</version>
      <packaging>war</packaging>
    
      <dependencies>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context</artifactId>
          <version>5.0.5.RELEASE</version>
        </dependency>
        <dependency>
          <groupId>org.aspectj</groupId>
          <artifactId>aspectjweaver</artifactId>
          <version>1.8.7</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-jdbc</artifactId>
          <version>5.0.5.RELEASE</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-tx</artifactId>
          <version>5.0.5.RELEASE</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-test</artifactId>
          <version>5.0.5.RELEASE</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-webmvc</artifactId>
          <version>5.0.5.RELEASE</version>
        </dependency>
    
        <!--servlet和jsp-->
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>servlet-api</artifactId>
          <version>2.5</version>
        </dependency>
        <dependency>
          <groupId>javax.servlet.jsp</groupId>
          <artifactId>jsp-api</artifactId>
          <version>2.0</version>
        </dependency>
    
        <!--mybatis相关的架包-->
        <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis</artifactId>
          <version>3.4.5</version>
        </dependency>
        <!--这个mybatis-spring是我们之后优化整合的时候会用,原始整合不用。-->
    <!--    <dependency>-->
    <!--      <groupId>org.mybatis</groupId>-->
    <!--      <artifactId>mybatis-spring</artifactId>-->
    <!--      <version>1.3.1</version>-->
    <!--    </dependency>-->
        <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>5.1.6</version>
        </dependency>
        <dependency>
          <groupId>c3p0</groupId>
          <artifactId>c3p0</artifactId>
          <version>0.9.1.2</version>
        </dependency>
    
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.12</version>
          <scope>test</scope>
        </dependency>
        <dependency>
          <groupId>jstl</groupId>
          <artifactId>jstl</artifactId>
          <version>1.2</version>
        </dependency>
      </dependencies>
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
              <!--source 和 target根据个人需要自己修改-->
              <source>11</source>
              <target>11</target>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </project>
    
  4. 编写实体类

    实体类如下:

    package com.itcast.domain;
    
    public class Account {
        //建议写Integer,而不是写int
        private Integer id;
        private String name;
        private Double money;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Double getMoney() {
            return money;
        }
    
        public void setMoney(Double money) {
            this.money = money;
        }
    }
    

    注意点:

    实体类用定义属性的时候,建议包装类型来定义。理由如下:

    在这里插入图片描述

  5. 编写Mapper接口和可能会用到的方法

    package com.itcast.mapper;
    
    import com.itcast.domain.Account;
    import java.util.List;
    
    public interface AccountMapper {
        public void save(Account account);
        public List<Account> findAll();
    }
    
    
  6. 编写Service层的接口和可能会用到的方法

    package com.itcast.service;
    
    import com.itcast.domain.Account;
    import java.util.List;
    
    public interface AccountService {
        public void save(Account account);
        public List<Account> findAll();
    }
    
  7. 编写Service层的接口实现类和实现方法

    package com.itcast.service.impl;
    
    import com.itcast.domain.Account;
    import com.itcast.service.AccountService;
    import java.util.List;
    
    public class AccountServiceImpl implements AccountService {
        @Override
        public void save(Account account) {
    
        }
    
        @Override
        public List<Account> findAll() {
            return null;
        }
    }
    

    service实现类的具体实现,我们先空着,之后写。

    在这里插入图片描述

  8. 编写Controller

    这里我们具体实现也先空着。先把框架搭好。

    在这里插入图片描述

  9. 编写前端的页面

    在这里插入图片描述

    在这里插入图片描述

    注意:

    因为WEB-INF下的资源是受保护的,所以我们不能直接访问到。我们放在WEB-INF文件夹外的资源,我们可以浏览器输入地址直接访问。但是在WEB-INF文件夹内的资源,我们只能通过controller的转发机制访问。

  10. 编写配置文件(这些配置文件的结构先搭好,里面具体写什么得用得时候才知道,所以我们先空着)

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

  11. 补齐配置文件中的配置:

    AccountMapper.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">
    <mapper namespace="com.itcast.mapper.AccountMapper">
        <insert id="save" parameterType="account">
            insert into account value(#{id},#{name},#{money})
        </insert>
        <select id="findAll" resultType="Account">
            select * from account
        </select>
    </mapper>
    

    applicationContext.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xmlns:tx="http://www.springframework.org/schema/tx"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="
           http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
    ">
        <!--组件扫描 -->
        <context:component-scan base-package="com.itcast">
            <!--我们扫这个com.itcast包,那么com.itcast包下的@Controller注解也会被扫描到,但是这个@Controller注解的类一般是表示层的类,所以我们到时候应该让他被springmvc来管理的,所以我们这里spring就不去控制它了,我们就需要这个@Controller注解给排除掉去,到时候让springmvc的配置文件来扫描-->
            <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        </context:component-scan>
    </beans>
    

    jdbc.properties

    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/ssm
    jdbc.username=root
    jdbc.password=815924
    

    log4j.properties

    ### direct log messages to stdout ###
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.Target=System.out
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
    
    ### direct messages to file mylog.log ###
    #log4j.appender.file=org.apache.log4j.FileAppender
    #log4j.appender.file.File=hibernate.log
    #log4j.appender.file.layout=org.apache.log4j.PatternLayout
    #log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
    
    ### set log levels - for more verbose logging change 'info' to 'debug' ###
    
    log4j.rootLogger=all, stdout
    

    spring-mvc.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                                http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
                                http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    
        <!--组件扫描,主要扫描@Controller注解-->
        <context:component-scan base-package="com.itcast.controller" use-default-filters="false">
            <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        </context:component-scan>
    
        <!--配置mvc注解驱动-->
        <mvc:annotation-driven/>
    
        <!--配置内部资源视图解析器-->
        <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/pages/"></property>
            <property name="suffix" value=".jsp"></property>
        </bean>
    
        <!--开放静态资源访问-->
        <mvc:default-servlet-handler/>
    </beans>
    

    sqlMapConfig.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
        <!--加载properties文件-->
        <properties resource="jdbc.properties"></properties>
    
        <!--定义别名-->
        <typeAliases>
            <!--<typeAlias type="com.itcast.domain.Account" alias="account"></typeAlias>-->
            <!--上面这种定义别名的方式是,把这个com.itcast.domain.Account定义一个别名,别名叫account-->
            <!--下面我们介绍另一种定义别名的方式,扫描包的方式。比如下面这样写的话,我们这个com.itcast.domain包下所有的类都将会被设置别名。设置什么别名,看例子:比如,我们这个com.itcast.domain包下有一个Account类和User类,那么,你用了下面这个扫描包的这个方式,就相当于给这个com.itcast.domain包下的Account类设置了account和Account两个别名。给com.itcast.domain包下的User类设置了User和user两个别名-->
            <package name="com.itcast.domain"></package>
        </typeAliases>
    
        <!--数据源环境-->
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC"></transactionManager>
                <dataSource type="POOLED">
                    <property name="driver" value="${jdbc.driver}"/>
                    <property name="url" value="${jdbc.url}"/>
                    <property name="username" value="${jdbc.username}"/>
                    <property name="password" value="${jdbc.password}"/>
                </dataSource>
            </environment>
        </environments>
    
        <!--加载映射文件-->
        <mappers>
            <!--<mapper resource="com\itcast\mapper\AccountMapper.xml"/>-->
            <!--上面这个加载映射文件的方式是一个个加载的,所以,要想加载多个映射文件,你得写多个mapper标签。下面,我们来介绍另一种写法,包引入方式,我们在“mybatis-day1.md”中的mappers标签里面讲过,但是使用这种方式有一些注意点,你看之前“mybatis-day1.md”中的mappers标签的笔记就行. -->
            <package name="com.itcast.mapper"/>
        </mappers>
    </configuration>
    
  12. 完成逻辑代码的编写

    package com.itcast.controller;
    
    import com.itcast.domain.Account;
    import com.itcast.service.AccountService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.servlet.ModelAndView;
    
    import java.util.List;
    
    @Controller
    @RequestMapping("/account")
    public class AccountController {
        @Autowired
        private AccountService accountService;
        //保存(实际中,我们保存成功应该会跳转到一个列表页面的,这里我们简单点,就直接在页面打印一个字符串意思一下。)
        @RequestMapping("/save")
        @ResponseBody
        public String save(Account account){
            accountService.save(account);
            return "保存成功!";
        }
    
        //查询。查询结束我们返回一个数据,并且返回一个视图。
        public ModelAndView findAll(){
            List<Account> accountList=accountService.findAll();
            ModelAndView modelAndView=new ModelAndView();
            modelAndView.addObject("accountList",accountList);
            modelAndView.setViewName("accountList");
            return modelAndView;
        }
    }
    
    
    package com.itcast.service.impl;
    
    
    import com.itcast.domain.Account;
    import com.itcast.mapper.AccountMapper;
    import com.itcast.service.AccountService;
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    import org.springframework.stereotype.Service;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.List;
    
    @Service("accountService")
    public class AccountServiceImpl implements AccountService {
        @Override
        public void save(Account account) {
            try {
                InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
                SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
                SqlSession sqlSession = sqlSessionFactory.openSession();
                AccountMapper mapper = sqlSession.getMapper(AccountMapper.class);
                mapper.save(account);
                sqlSession.commit();
                sqlSession.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        @Override
        public List<Account> findAll() {
            try {
                InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
                SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
                SqlSession sqlSession = sqlSessionFactory.openSession();
                AccountMapper mapper = sqlSession.getMapper(AccountMapper.class);
                List<Account> accountList = mapper.findAll();
                sqlSession.close();
                return accountList;
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
    }
    
  13. 测试

    在这里插入图片描述

    结果:

    在这里插入图片描述

    数据库:

    在这里插入图片描述

    发现,页面显示的时候出现了乱码,但是数据库里面存数据的时候是正确的。

    分析:

    数据库能正确存数据的原因是:我们在web.xml中设置了乱码过滤器,所以服务器获取前端代码的数据的乱码问题解决了,即,我们前端输入了中文的数据,后端正确获取到了中文数据,没有出现乱码,然后存到数据库里面,所以数据库里面存的是正确的。

    那么前端出现乱码的原因是什么呢?你看我们之前没用ssm的时候,我们都直接在servlet的代码块的后半段设置response.setContentType(“text/html;charset=utf-8”)。这样前端页面就不会出现乱码了,这里我们ssm要达到这个效果,我们也得设置一下响应的编码。

    解决方法如下:

    在这里插入图片描述

    测试:

    在这里插入图片描述

    点击"保存"后:

    在这里插入图片描述

    数据库数据如下:

    在这里插入图片描述

  14. 下面我们来完成保存的方法。之前1~13步中,没有把save()方法和他跳转的页面完成,下面我们来把他们完成。

    在这里插入图片描述

    在这里插入图片描述

  15. 测试:

    在这里插入图片描述

原始整合方式的弊端

弊端:

你看上面这里service层中,每次执行某个方法的时候都会执行下面这些语句,即,都会加载配置文件、创建工厂对象、创建Session对象、事务提交、关闭sql会话等。

在这里插入图片描述

解决:

把创建Session工厂的工作、创建AccountMapper对象的工作都交给spring容器来做。并且把事务控制也交给spring来做。

在这里插入图片描述

即,我们要做到让spring创建这个AccountMapper,并且注入到这个AccountServiceImpl的某个AccountMapper类型的成员变量里面,然后这个AccountServiceImpl类里面的所有方法都可以用那个成员变量了,这个类里面也不用创建对象,因为创建对象和绑定到AccountServiceImpl的成员变量的工作都交给spring容器了。

然后我们在spring核心配置文件里面给这个AccountServiceImpl类里面的方法配置上事务控制,这样,那些被设置了事务控制的方法会在执行成功的时候自动提交,执行失败的时候自动回滚了,就取代了我们上面的sqlSessioni.commit()和sqlSessioni.close()了。其实上面这个例子里面,出现异常回滚的代码都没有写,我们通过spring核心配置文件给AccountServiceImpl类里面的方法配置上事务控制,那些方法执行出现异常,就会自动回滚了,也相当于补齐了上面例子中没有写的回滚的功能。

具体怎么整合看下面。

优化后的整合

我们先在spring核心配置文件中加一些配置做到让spring来创建工厂和AccountMapper对象。

在这里插入图片描述

注意:上面这个工厂类是mybatis-spring包下的,所以我们要把之前注释掉的mybatis和spring整合需要用到的架包给解开。

在这里插入图片描述

然后我们就可以把mybatis核心配置文件中那些被移到spring核心配置文件中来配置的东西给删了

删除前:

在这里插入图片描述

删除后:

在这里插入图片描述

修改AccountServiceImpl。

在这里插入图片描述

上面是完成了让spring帮我们创建AccountMapper对象。下面我们来把声明式事务控制做了,这样优化后的SSM整合就ok了。

添加事务控制如下:

在这里插入图片描述

测试:

数据库之前数据:

在这里插入图片描述

输入:

在这里插入图片描述

点击保存后:

在这里插入图片描述

数据库数据:

在这里插入图片描述

输入http://localhost:8080/ssm_war_exploded/account/findAll,显示的结果如下

在这里插入图片描述

OK,整合完成,并且测试通过。

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

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

相关文章

【C++】list的使用

文章目录 1. list的使用1. 构造函数2.迭代器的使用和数据访问3. 容量相关4. 数据修改1.数据插入2. 数据删除 5.其他接口 1. list的使用 首先&#xff0c;在使用list之前&#xff0c;我们得先了解list到底是个什么东西&#xff0c;查看文档可以了解到&#xff0c;list的底层是一…

使用EasyExcel导出模板并设置级联下拉及其原理分析

一、概述 项目中有时会遇到需要导出一个Excel模板&#xff0c;然后在导出的Excel中填充数据&#xff0c;最终再调用接口批量把Excel中的数据导入到数据库当中的需求。 其中级联下拉选择&#xff0c;手机号校验&#xff0c;性别校验等都是比较常见的校验。 这里就已上面三种情…

县级医院手术麻醉管理系统源码 医院手麻系统源码 C/S架构 系统成熟稳定完整二次开发

医院手麻系统详细功能介绍和说明&#xff1a; ▶手术管理功能包括&#xff1a;手术申请、手术安排、查看手术申请单、手术通知单、填写病人术前会诊记录、谈话记录、麻醉记录、手术记录、附加手术、术后信息及手术回顾等功能。 ▶手术麻醉管理系统包括&#xff1a;手术申请、…

openEuler 欧拉 安装Oracle19c数据库RPM包安装

一、准备工作 将安装部署包上传到服务器上&#xff0c;我安装包放到/home目录下 二、安装依赖包 yum -y install binutils compat-libcap1 compat-libstdc-33 compat-libstdc-33*.i686 elfutils-libelf-devel gcc gcc-c glibc*.i686 glibc glibc-devel glibc-devel*.i686 ksh…

“烧钱”的大模型:初探成本拆解与推理优化方法

编者按&#xff1a;大模型的成本问题一直以来是大家重点关注的问题&#xff0c;本文重点讨论了训练大型语言模型&#xff08;LLMs&#xff09;需要的成本&#xff0c;并简要介绍什么是LLM以及一些用于优化大模型推理表现的技术。 虽然很难准确预测LLMs未来会怎么发展&#xff0…

热血

周五的晚上&#xff0c;决定去看「灌篮高手」电影了。 那还是很多年以前&#xff0c;樱木双手插进裤腰歪头扭嘴吹着口哨&#xff0c;那不羁的样子像极了一只从上往下看的沙雕。 而全国赛的樱木&#xff0c;多少是成熟了很多&#xff0c;是会说一些犯二的话&#xff0c;会和流川…

Spring Boot中上传文件不写临时文件

Spring Boot中上传文件不写临时文件 前言 在SpringBoot文件上传中&#xff0c;用MultipartFile类型接收文件时&#xff0c;SpringBoot会生成一份临时文件&#xff0c;文件格式为upload_*.tmp&#xff0c;如果业务场景有大量小文件需要上传的话&#xff0c;可以将文件直接丢到…

面试官:说说对称加密、非对称加密、混合加密?

对称加密 两边用同一个密钥来加解密。 A把明文通过某一算法加密之后得到密文&#xff0c;然后把密文发送给B&#xff0c;B接收到密文之后用相同的密钥执行相同的算法去解密。X没有密钥&#xff0c;即使窃取到密文也无法窃听。 对称加密的有优缺点 对称加密的优点&#xff1a…

TryHackMe-Misguided Ghosts(boot2root)

Misguided Ghosts 端口扫描 循例nmap FTP枚举 直接登anonymous&#xff0c;有几个文件&#xff0c;下下来 info.txt 我已经包含了您要求的所有网络信息&#xff0c;以及一些我最喜欢的笑话。- 帕拉摩尔该信息可能指的是pcapng文件 jokes.txt Taylor: Knock, knock. Josh: …

【pytest】

pytest 1、环境安装 1、pip install pytest -i https://pypi.tuna.tsinghua.edu.cn/simple --targetC:\Dpan-app\ceshirenenv\Lib\site-packages 2、pycharm安装 2、assert >>> assert True >>> >>> assert False Traceback (most recent call …

一篇文章让你彻底学会--节流(并且自己可以手写)

Hi,有的小伙伴们在面试的时候会被要求手写节流函数&#xff0c;很多都被难着了吧&#xff0c;宝贝&#xff0c;那你你没有理解节流函数。 今天&#xff0c;就让我带你攻克它&#xff01; 1.节流 单位时间内&#xff0c;事件触发&#xff0c;最多只执行一次事件回调。 人话:说…

【STL十三】适配器——迭代器适配器

【STL十二】适配器——迭代器适配器 一、迭代器1、迭代器分类2、迭代器定义3、迭代器和迭代器适配器 二、迭代器适配器、流迭代器1、简介2、迭代器适配器3、流迭代器 三、反向迭代器1、简介2、模板类3、demo 四、插入迭代器1、简介2、模板类3、demo 五、移动迭代器1、简介2、模…

Mysql列的类型定义(日期和时间类型)

文章目录 前言一、类型表二、类型简介总结 前言 日期与时间类型是为了方便在数据库中存储日期和时间而设计的&#xff0c;数据库有多种表示日期和时间的数据类型。其中&#xff0c;YEAR类型表示年&#xff0c;DATE类型表示日期&#xff0c;TIME类型表示时间&#xff0c;DATETIM…

大模型如何赋能?个人AI助理开始靠谱!

想象一下&#xff0c;生活在这样一个世界里&#xff0c;你有一个个人人工智能助手&#xff0c;它不仅能理解你的需求&#xff0c;还能与你一起学习和成长。一个人工智能无缝融入我们日常生活的世界&#xff0c;使我们能够比以往任何时候都更有效地实现我们的目标。那个世界不再…

Linux磁盘分区扩容

磁盘分区主要包含MBR&#xff08;Master Boot Record&#xff09;和GPT&#xff08;GUID Partition Table&#xff09;两种不同方式&#xff1a; MBR&#xff08;主引导记录&#xff09;&#xff0c;驱动器上的一个特殊的启动扇区&#xff0c;最大支持2TB&#xff0c;最多支持4…

【Redis7】Redis7 主从复制(重点:主从复制原理)

【大家好&#xff0c;我是爱干饭的猿&#xff0c;本文重点介绍Redis7 复制。 后续会继续分享Redis7和其他重要知识点总结&#xff0c;如果喜欢这篇文章&#xff0c;点个赞&#x1f44d;&#xff0c;关注一下吧】 上一篇文章&#xff1a;《【Redis7】Redis7 事务&管道&…

navicat 远程连接oracle数据库ORA-12170及ORA-28547问题

目录 1.ORA-12170问题 2.ORA-28547 问题 1.ORA-12170问题 这是防火墙端口连接问题&#xff0c;需要在防火墙中设置oracle数据库端口为例外 解决方案 控制面板—windows防火墙—高级设置—入站规则—新建规则 2.ORA-28547 问题 OCI版本不兼容问题&#xff0c;安装的oracle客…

Python每日一练(20230423)

目录 1. 删除链表的倒数第 N 个结点 &#x1f31f;&#x1f31f; 2. 最小覆盖子串 &#x1f31f;&#x1f31f;&#x1f31f; 3. 二叉树的层序遍历 &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏…

OpenAI最新官方ChatGPT聊天插件接口《插件安全审查流程》全网最详细中英文实用指南和教程,助你零基础快速轻松掌握全新技术(六)(附源码)

Plugin review process 插件审查流程 前言Plugin review process 插件审查流程What we are looking for in a plugin 我们正在寻找一个插件Plugin states 插件状态Types of users 用户类型Submit a plugin for review 提交一个插件进行审核其它资料下载 前言 在 ChatGPT 中&am…

【原创】【理论+题型】二次型化标准型 +合同

&#xff08;A&#xff09;二次型化标准型2方法对比 1任何二次型都能化为标准&#xff0c;有正交变换法和配方法 2任何二次型都能通过配方法变为标准型&#xff0c;但不一定能通过正交变化法变 3二次型的规范型唯一&#xff0c;标准型不唯一 4实对称阵的(合同)对角化问题&#…