SpringBoot+Mybatis-Plus实现增删改查超详细步骤

news2024/11/24 15:39:05

目录

一、介绍

二、前期准备工作

(一) 创建springboot项目和创建数据库

三、项目配置

(一)pom.xl导入相关依赖 

1.导入依赖

(二)yml文件中配置连接数据库

2.配置yml文件 

四、代码的编写

数据库展示

项目提前展示!!!

(三)MySQL表绑定到spring boot(实体层)

3.1 创建实体包

 3.2编写User类

(四)springboot绑定到mybatis-plus(数据层)

4.1创建mapper包

4.2编写UserMapper接口

(五)把数据层加工处理成逻辑业务(service服务层)

5.1创建service包 

5.2编写获取内置增删改查方法接口IUserService

5.3编写自己定义的UserService

5.4编写服务层合成逻辑业务UserServiceImpl

5.5故事解读服务层接口和类

(六)调用服务层的皇帝

 6.1创建controller包

6.2 编写调取业务层的UserController类

五、前端请求测试


一、介绍

本篇文章通过springboot整合mybatis-plus去实现后端对数据库的增删改查以及响应给前端的url,让前端获得数据。mybatis-plus技术是简化了繁琐的代码操作,把增删改查的语句都内置了,直接调用就可以实现数据库的增删改查了。还可以一定程度上防止SQL注入。缺点就是不够灵活,不过这个灵活的问题也可以自己去创建代码去弥补这个。

二、前期准备工作

(一) 创建springboot项目和创建数据库

1. spring boot项目的介绍和创建方式:SpringBoot项目的快速创建方式(包含第一个程序的运行)_云边的快乐猫的博客-CSDN博​​​​​​客

2.创建MySQL数据库和新建表的详细步骤:

 创建MySQL数据库和创建表的详细步骤(navicat)_云边的快乐猫的博客-CSDN博客

三、项目配置

(一)pom.xl导入相关依赖 

这里面有几个必须的依赖

1.web依赖,这个是创建时候就已经加入进去了,所以不用导入了(检查一下)

2.lombok依赖 ,这个是创建时候就已经加入进去了,所以不用导入了(检查一下)

3.mybatis-plus的依赖(来源baomidou)

4.mysql依赖

5.druid依赖(来源阿里巴巴德鲁伊)

6.swagger2依赖(拥有这个,注解@ApiModelProperty才能用)

1.导入依赖

在pom.xml文件里面导入相关的依赖。如果依赖加入不成功,就要检查自己的maven配置问题了

maven解决方案:

springboot添加maven环境详细步骤_云边的快乐猫的博客-CSDN博客

spring-boot-maven-plugin报红的解决办法_云边的快乐猫的博客-CSDN博客 

       <!--新加入的依赖1-->
		<dependency>
			<groupId>com.baomidou</groupId>
			<artifactId>mybatis-plus-boot-starter</artifactId>
			<version>3.4.3</version>
		</dependency>
		<!--新加入的依赖2-->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>8.0.33</version>
		</dependency>
		<!--新加入的依赖3-->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid-spring-boot-starter</artifactId>
			<version>1.2.16</version>
		</dependency>
		<!--新加入的依赖4  @ApiModelProperty这个才能用-->
		<dependency>
			<groupId>io.springfox</groupId>
			<artifactId>springfox-swagger2</artifactId>
			<version>2.7.0</version>
		</dependency>

 即:

(二)yml文件中配置连接数据库

2.配置yml文件 

把application配置文件的后缀改为yml,这样看着更分明一点,然后再里面写入连接数据库的配置,建立和数据库的关联。具体的端口号默认是8080的,但是我改成了80端口了。 

这里的第2、7、8、9行都要改为自己的  

 

server:
  port: 80
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/dndata?serverTimezone=GMT%2b8
    username: root
    password: 123456

四、代码的编写

数据库展示

 

项目提前展示!!!

 

(三)MySQL表绑定到spring boot(实体层)

为什么要建立这个类?

可以这样理解,这一步骤是让数据库字段和后端代码的绑定 

3.1 创建实体

在项目下新建一个entity包,再新建一个类。类的命名就是User

命名来源:类名和数据库中的表名一样,不过首字母要大写,一个属性类对应一张数据库表。

 3.2编写User类

这个实体类里面的属性要和数据库中的字段对应  

看着注释去编写,还是很简单的,在最下面的注释也解释了每个注解的作用 

User

package com.example.mybatis.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

/*
* 1.使用@Data注解
* 2.使用注解@TableName(value = "user") -----user这个是对应数据库的表名
* 3.编写和数据库字段对应的属性
* 4.加上文档注解@ApiModelProperty("用户的id")---里面的文字是相当于给自己看的备注
* 5.使用@TableId(value = "id", type = IdType.AUTO) //作用是标明当前属性主键,并且type = IdType.AUTO这个代表id自增
* */
@Data  //1
@TableName(value = "user")    //2
public class User {

    @ApiModelProperty("用户的id")  //4
    @TableId(value = "id", type = IdType.AUTO) //5
    private Integer id;  //3

    @ApiModelProperty("用户名")  //4
    private String username;  //3

    @ApiModelProperty("密码")  //4
    private String password;   //3
}

/*
* 注解的解释
* @Data:注解是这个来源于lombok,内置了set、get、ToString等属性类里面我们需要写的东西,就不用我们写了

* @TableName:注解是 MyBatis-Plus 框架中的一个注解,用于标识实体类与数据库表之间的映射关系。
* 它的作用是告诉 MyBatis-Plus 框架这个实体类对应哪个数据库表。

* @ApiModelProperty:注解是 Swagger 框架中的一个注解,
* 用于给实体类的属性(字段)添加额外的文档说明,以便在生成 API 文档时提供更详细的描述和信息。
* Swagger是一个用于生成和展示 API 文档的工具,可以帮助开发人员更好地理解和使用 API。
*
* @TableId 注解用于标识表的主键字段,帮助 MyBatis-Plus 框架了解哪个属性在数据库中扮演主键的角色,
* 以及如何生成主键值。这对于数据库操作和映射非常重要。
* */

(四)springboot绑定到mybatis-plus(数据层)

为什么要创建这个接口呢?

因为为了把springboot获得的属性类再绑定给到mybatis-plus那边,然后绑定的这个接口给其他层调用。

4.1创建mapper包

项目下创建一个mapper包

4.2编写UserMapper接口

创建一个接口UserMapper,命名来源是属性类名+mapper,驼峰命名

到这里就可以使用mybatis-plus内置最原始的增删改查,但是不够灵活,只能做最简单的增删改查。

UserMapper

package com.example.mybatis.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.mybatis.entity.User;
import org.apache.ibatis.annotations.Mapper;
/*
* 1.使用@Mapper注解 ,代表这个接口被mybatis接管
* 2.继承BaseMapper<属性类名>
* */
@Mapper
public interface UserMapper extends BaseMapper<User> {
}


/*
* @Mapper:注解是 MyBatis 框架中的一个重要标识,
* 它定义了 Mapper 接口,用于与数据库交互。使用这个注解可以简化数据库操作代码,并提供一些优势,
* 如自动生成 SQL、类型安全性等。
* */

 

(五)把数据层加工处理成逻辑业务(service服务层)

为什么要这一层?

答:这一层次叫服务层,也叫业务层。因为上面的数据完全都绑定好了,可以实现增删改查了,但是那只是最原始的,封装的方法都很少,稍微复杂一点的分页查询方法里面都没有,所以要在这一层使用别人封装好的更好的方法以及各种逻辑都可以在这里写 

5.1创建service包 

5.2编写获取内置增删改查方法接口IUserService

MP官方的

为什么要写这个接口?

继承了MP(mybatis-plus)封装好的接口,我们需要的各种增删改查方法都在这里面给我们写好了,这个接口编写是为了给后面控制层去调用这个接口里面的增删改查方法。

你说的增删改查方法怎么看不到?

因为被MP封装到了 这个IService接口里面了

在service包下建立这个IUserService接口

IUserService接口

package com.example.mybatis.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.example.mybatis.entity.User;


//1.继承IService这个接口,<实体类名>
public interface IUserService extends IService<User> {
}

/*
IService接口里面有mybatis-plus封装好我们经常会用到的增删改查的一些方法
里面本质上还调用了上数据层mapper,是对mapper的封装优化
*/
5.3编写自己定义的UserService

 在service包下建立这个UserService类

MP官方+自定义逻辑+自己调用数据层---咱自己的

5.2不是已经有可以调用增删改查的方法了吗,为什么还要写这个?

答:5.2那个接口是直接用MP内置的增删改查方法,可以正常用,但是我想对内置的这些增删改查再优化呢,比如数据的加密、数据的校验等逻辑处理。

而且我想根据我自己的需求来去给这些内置的增删改查嵌套或者升级自定义呢?

总而言之,这个是类底层是就是5.2接口的实现类,也就是说这个类包含了5.2的接口。还能自定义方法和对mapper数据层的调用,就比5.2接口的方法更加丰富,用于加上自定义处理繁琐的逻辑数据层

package com.example.mybatis.service;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.mybatis.entity.User;
import com.example.mybatis.mapper.UserMapper;
import org.springframework.stereotype.Service;

/*
* 1.使用@Service注解,要不然咱自己定义的类,谁知道他是服务层
* 2.继承ServiceImpl,这个是MP内置增删改查接口的一个实现,牛逼的是还能自定义直接调取数据层的数据
* 3.定义需要的方法,根据自己的需要定义,定义MP内置里面没有的
* */
@Service
public class UserService extends ServiceImpl<UserMapper, User> {
    //下面这个方法是对数据库操作时候多加了一层封装,用不到去掉也没有影响。
    // 、作用可以定义密码加密、数据校验、关联数据处理、日志记录、通知或触发事件等
    public boolean saveUser(User user){
           return saveOrUpdate(user);
    }
}
5.4编写服务层合成逻辑业务UserServiceImpl

 在service包下建立这个UserServiceImpl类 

1.为什么要写这个实现类?

因为把5.2和5.3的方法都拿来这里组成逻辑业务,比如登录、校验、权限等

2.为什么不直接用5.3,那个里面不是也可以定义逻辑方法吗? 

5.3那个自定义类主要用来处理一些对数据比较底层的方法,密码加密,校验这些底层。而这个类里面定义的是靠5.3那些小方法组起来的业务,比如登录、权限验证这些

总而言之,这里是业务的成型,调用5.3(主要)+5.2(次要)+一些逻辑组成业务

package com.example.mybatis.service.Impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.mybatis.entity.User;
import com.example.mybatis.mapper.UserMapper;
import com.example.mybatis.service.IUserService;
import org.springframework.stereotype.Service;
/*
* 1.@Service--------使用@Service注解,让人知道这个是服务层
* 2.extends ServiceImpl<UserMapper, User> ---继承和UserService类里面继承的方法一样,
* 但是这里面还偷偷藏了UserService自定义的方法
* 3.implements IUserService---实现接口
* */

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
    //登录业务
    //登录校验业务
    //创建用户检查业务等等
}

 

5.5故事解读服务层接口和类

这么多服务层到底什么关系啊,这就来解读 

 

这三个都是服务层的,看需要选择调用哪个

5.2(地主家傻儿子)是一个服务接口,去嵌套了MP内置的常用CRUD

     地主家MP的傻儿子一样,什么都没有,只会调用他老爹写好的方法,不过有个好老爹,大部分常用的CRUD他都有了,控制层可以直接调用他

5.3(佣人的儿子)是一个服务类,嵌套内置CRUD+自研调用方法

     这个类虽然和地主家傻儿子拥有一样的内置方法,但是却更上进,想要变得更强,所以可以自定义修炼很多方法:底层密码加密、数据校验、关联数据处理、日志记录、通知或触发事件,还能直接和数据层进行交互。

这个类厉害吧?是不是很完美?控制层不会调用他的,因为他这些方法都会被他爹实现类去组成各种逻辑业务

5.4(佣人)是一个实现服务类,继承有5.2地主家傻儿子,也实现了5.3亲儿子。大一统

      在这里面实现各种业务。能在这里编写的都是业务了,比如拿5.3方法组成的登录业务、权限校验业务等等。

这个是老爹服务类。够厉害了吧。但是这个也不能被控制层直接调用,因为这个不是接口,根据设计的依赖倒置原则,调用接口可以达到解耦的效果。但是这些写的方法又不能浪费,只能继承了5.2地主家的傻儿子接口,让他帮我把这些逻辑都带出去。通过控制层构造器注入

(六)调用服务层的皇帝

为什么要这一层?

因为叫控制层,是皇帝。你想要什么,告诉我,我让服务层去弄逻辑业务。

要什么数据或者逻辑业务都要通过我控制层,直接找我拿就好了。

既然服务层都有了,那我为什么要你?

服务层的业务只有逻辑业务,涉及到导入导出这种正常的业务,还得是我来

那该去调用服务层的哪个?

找这个接口-----IUserService

这里面不但继承了地主MP的CRUD,还继承了实现类里面所有的业务逻辑

 6.1创建controller包

6.2 编写调取业务层的UserController类

 第一种理解方式

增删改查方法通用公式:

    1

public  2  自定义类名(    4的数据类型      )

   return   当前的全局服务类.服务类中的方法(4

服务中的方法:查全部:list根据ID查询:getById新增和修改saveOrUpdate删除:removeById

1.数据查询一般用@GetMapping、对数据进行修改操作用@PostMapping、删除用@PostMapping。

前端:我要删除或者根据id查询,

后端:那你get给我id就好了,其他的交给我,就是在注解的后面加("/{id}")。如果是直接查询全部的,你连id都不用给我,我懂

前端:我要修改和增加东西,有很多字段的数据都要

后端:那你不能放请求头里面,不安全,用post请求,放到请求体里面吧

2.这个是希望后端给我的数据,增删改什么的只要告诉我是否成功就好,所以用布尔值。查询你就要告诉我查询到什么了,就用属性类名

3.这个是和1相关,post请求用@RequestBody,其他的都用@PathVariable去解析请求头的id变成json传给后端

4.这个也看1,前端传什么数据过来,这里就用什么数据。什么都没有写就是全部---就是属性类名

第二种理解方式

@注解 ---这个就是前端要给后端的传输定义

public  希望后端给前端的   自定义类名  ( post注解使用@RequestBody-反之   数据类型    对应前端传过来的  )

         return  当前的全局服务类.服务类中的方法(数据类型对应前端传过来的)

package com.example.mybatis.controller;

import com.example.mybatis.entity.User;
import com.example.mybatis.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
/*
* 1.@RestController---添加控制层注解,让springboot知道这是控制层
* 2.@RequestMapping("/user")--- user代表默认访问路径在/user下可以访问
* */

@RestController
@RequestMapping("/user")
public class UserController {


    @Autowired  //4.自动注解
    private IUserService userService;  //3.定义调用服务层的接口


    /*
    *5.查询全部的数据
       5.1使用 @GetMapping注解,没有括号不定义就代表使用get方式,url访问上面默认路径/user
       5.2查询全部肯定使用的方法是集合<实体类>方式去自定义一个findAll方法名
       5.3再用服务层返回一个集合就好了
     */
    @GetMapping
    public List<User> findAll(){
        return userService.list();
    }


    /*6.根据id查询一条
      6.1查询使用@GetMapping注解,既然是根据id查询,那么就要把id传给后端。但是get是不能传递请求体的,
       只能传递请求头,那么只能把这个值放在请求头上面,就是这样("/{id}")放
      6.2自定义一个方法名(@PathVariable 类型 id),为什么要用id呢?这不是你前端这个"/{id}"说要吗
      @PathVariable这个注解的方式就是把请求头中的数字以Json传递给后端去识别,后端不能直接识别url上面的数字
      6.3 再用服务层返回获取id的方法就好了
    */
    @GetMapping("/{id}")
    public User findById(@PathVariable Integer id){
        return userService.getById(id);
    }

    /*7.新增和修改
         需要传递body传递全部参数,
        7.1对数据的操作使用@PostMapping,括号里面不定义就代表使用post方式,url访问上面默认路径/user
        7.2自定义一个方法,括号里面使用(@RequestBody 属性类 自定义属性昵称)
        为什么这里用Boolean而不是User,因为对数据的修改希望返回的结果就两种,要么成功,要么失败,所以用布尔值
        @RequestBody这个注解用于映射传递来的json参数映射为到java对象里面,特别是适用与请求体的参数
        7.3然后再用服务层返回获取的saveOrUpdate方法就好了
    */
    @PostMapping
    public Boolean add(@RequestBody User user){
        return userService.saveOrUpdate(user);
    }
    /*
    8.删除的方法
     8.1使用@DeleteMapping注解,因为删除只需要传递一个特定的id给后端就可以了,
     所以括号里面使用("/{id}")
     8.2创建一个自定义的方法,删除也是要么成功要么失败,所以使用Boolean作为返回值
     @PathVariable在上面已经解释过了
     8.3再用服务层次返回对应的方法,括号里面的值就是上面括号里面需要的值
    * */
    @DeleteMapping("/{id}")
    public Boolean delete(@PathVariable Integer id){
        return userService.removeById(id);
    }

}








/*    //修改数据的另一种写法
    @PostMapping("/update")
    public Boolean update(@RequestBody User user){
        return userService.updateById(user);
    }*/

到这里代码就全部编写完成了,不懂的去看上面的代码提前展示图和注释解释

MySQL--->属性类--->数据层mapper接口--->业务服务层service接口--->控制层(前后端交互) 

按照规范,不能跨级调用接口,属性类除外

五、前端请求测试

测试的工具可以使用idea自带的,也可以使用postman等请求测试工具。

postman官网下载安装登录详细教程_云边的快乐猫的博客-CSDN博客 

具体的测试方法

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

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

相关文章

阿里云FRP内网穿透挂载多台服务器

1. FRP介绍 FRP (Fast Reverse Proxy) 是比较流行的一款。FRP 是一个免费开源的用于内网穿透的反向代理应用&#xff0c;它支持 TCP、UDP 协议&#xff0c; 也为 http 和 https 协议提供了额外的支持。你可以粗略理解它是一个中转站&#xff0c; 帮你实现 公网 ←→ FRP(服务器…

vue复习。从安装到使用

vue官网&#xff1a;cn.vuejs.org vue安装 cnpm install -g vue/cli 查看是否安装成功 vue --version 创建一个项目 vue create vue-demo(项目名称) 这个取消掉。空格可选中或者取消。 运行项目&#xff1a; cd 进入到项目下 npm run serve 运行成功后&#xff0c;访问这…

Leetcode 21. 合并两个有序链表

题目描述 题目链接&#xff1a;https://leetcode.cn/problems/merge-two-sorted-lists/description/ 思路 两个链表都是升序链表&#xff0c;新建一个链表&#xff0c;引入伪头节点作为辅助节点&#xff0c;将各节点添加到伪节点之后&#xff0c;再用一个cur节点指向新链表的…

【C语言练习】——找出单身狗、详解atoi函数

目录 一.找出单身狗版本1版本2 二.atoi函数介绍atoi函数atoi函数的模拟实现 一.找出单身狗 版本1 题目&#xff1a; 一个数组中只有一个数字是出现一次&#xff0c;其他所有数字都出现了两次 找出这一个只出现一次的数字 一个数组比如是1、2、3、4、5、1、2、3、4 只有5出现一…

【力扣每日一题】2023.8.13 合并两个有序数组

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目给我们两个升序数组&#xff0c;让我们合并它们&#xff0c;要求合并之后仍然是升序&#xff0c;并且这个合并操作是在数组1原地修改…

前沿分享-中距离射频取电

目前来看&#xff0c;微能源有四种技术路线&#xff0c;一是环境光采集、温差转换采集、无线射频采集和振动能量采集。 无线射频微能源是在通信设备通信过程中自然产生的&#xff0c;可以通过射频能量芯片实现无线射频取电&#xff0c;能瞬间大功率储电和安全驱动负载。 通过射…

基于微信小程序的应届大学生招聘平台的设计与实现

伴随着社会以及科学技术的发展&#xff0c;互联网已经渗透在人们的身边&#xff0c;网络慢慢的变成了人们的生活必不可少的一部分&#xff0c;紧接着众多智能手机飞速的发展&#xff0c;小程序这一名词已不陌生&#xff0c;越来越多的企业、公司、高校、医院等机构都会使用小程…

Linux上的五种IO模型

文章目录 五种模型阻塞非阻塞IO复用信号驱动异步 五种模型 阻塞非阻塞复用IO异步 阻塞 &#x1f446;read同步IO 非阻塞 EAGAIN&#xff1a;没有事件到达&#xff0c;返回值为-1&#xff0c; errno为EAGAIN IO复用 信号驱动 异步 &#x1f446;&#xff1a;异步IO&#xff…

Leetcode数组篇 Day1

移除元素&#xff08;暴力版&#xff09; 1.注意越界问题&#xff1a;ji1 起点&#xff0c;j < size 移除元素&#xff08;双指针版&#xff09; 1.快慢指针&#xff0c;新数组就是不含有目标元素的数组 快&#xff1a;获取新数组中的元素 慢&#xff1a;获取新数组需更新位…

【佳佳怪文献分享】通过跨模态监督学习视觉运动

标题&#xff1a;Learning Visual Locomotion with Cross-Modal Supervision 作者&#xff1a;Antonio Loquercio, Ashish Kumar, Jitendra Malik 来源&#xff1a;2023 IEEE International Conference on Robotics and Automation (ICRA 2023) 这是佳佳怪分享的第4篇文章 …

电视企业继续乱收费,消费者则再用脚投票,销量加速下滑

分析机构给出的7月份数据显示中国的电视销量同比下滑了14.1%&#xff0c;环比则下滑了23.4%&#xff0c;消费者继续用脚投票&#xff0c;而电视企业也在压榨最后一滴利润&#xff0c;继续乱收费&#xff0c;引发消费者的不满。 近几年来国内电视市场价格战异常激烈&#xff0c;…

手把手教你使用USB的CDC+MSC复合设备(基于stm32f407)

学习 1 实验环境与说明2 USB CDC2.1 CDC代码生成2.2 通信设备&#xff08;CDC&#xff09;描述符2.2.1 设备描述符2.2.2 配置描述符 2.3 调试 3 USB MSC3.1 MSC代码生成3.2 大容量存储设备&#xff08;MSC&#xff09;描述符3.2.1 设备描述符2.2.2 配置描述符 3.3 调试 4 USB复…

Redis_亿级访问量数据处理

11. 亿级访问量数据处理 11.1 场景表述 手机APP用户登录信息&#xff0c;一天用户登录ID或设备ID电商或者美团平台&#xff0c;一个商品对应的评论文章对应的评论APP上有打卡信息网站上访问量统计统计新增用户第二天还留存商品评论的排序月活统计统计独立访客(Unique Vistito…

LeetCode150道面试经典题--单词规律(简单)

1.题目 给定一种规律 pattern 和一个字符串 s &#xff0c;判断 s 是否遵循相同的规律。 这里的 遵循 指完全匹配&#xff0c;例如&#xff0c; pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。 2.示例 pattern"abba" s "c…

【java】基础——多态

多态基本知识思维导图 多态的代码实现&#xff0c;注意父类对象引用指向子类对象引用&#xff08;向上转型&#xff09;的方法&#xff0c;父类就可以调用子类重写的方法和派生的方法&#xff0c;但不能调用子类特有的方法&#xff1a; class Animal {public void makeSound()…

基于模型的术语定义

文章仅供个人学习使用&#xff0c;请勿传播&#xff01; 原文来源&#xff1a; 袁亦方 大易方圆 OPM对象过程方法 2023-08-13 07:01 https://mp.weixin.qq.com/s/dUtuNLrMwFF_foCrQQyWmA INCOSE系统工程手册第5版使用说明部分&#xff08;内容对应第4版1.5节&#xff09;提出&…

MySQL高阶知识点(一)一条SQL【更新】语句是如何执行的

一条SQL【更新】语句是如何执行的 首先&#xff0c;可以确定的说&#xff0c;【查询】语句的那一套流程&#xff0c;【更新】语句也是同样会走一遍&#xff0c;与查询流程不一样的是&#xff0c; 更新语句涉及到【事务】&#xff0c;就必须保证事务的四大特性&#xff1a;ACID&…

vite打包报错

先把报错信息附上 解决&#xff1a; 在报错的文件里加上ts就可以了

Python python文件打包exe文件

首先安装PyInstaller&#xff0c;在PyCharm终端窗口输入命令&#xff1a; pip install PyInstaller安装完成后&#xff0c;在输入命令&#xff1a; pyinstaller -F /Users/sunshiyu/Desktop/PYTHON/demo1.pydemo1.py是我创建的一个简单的Python文件&#xff0c;代码如下&#x…

数据结构:堆的应用(堆排序和topk问题)

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》 文章目录 堆排序建堆堆的删除思想排序代码实现 top k 问题思路代码实现 总结 堆排序 堆排序即是 先将数据建堆&#xff0c;再利用堆删除的思想来排序。 将待排序数组建堆将堆顶数据与数组尾部数…