SpringBootWeb增删改查入门案例

前言

为了快速入门一个SpringBootWeb项目,这里就将基础的增删改查的案例进行总结,作为对SpringBoot+Mybatis的基础用法的一个巩固。

准备工作

  1. 需求说明
    对员工表进行增删改查操作
  2. 环境搭建
  • 准备数据表
-- 员工管理(带约束)
create table emp (id int unsigned primary key auto_increment comment 'ID',username varchar(20) not null unique comment '用户名',password varchar(32) default '123456' comment '密码',name varchar(10) not null comment '姓名',gender tinyint unsigned not null comment '性别, 说明: 1 男, 2 女',image varchar(300) comment '图像',job tinyint unsigned comment '职位, 说明: 1 班主任,2 讲师, 3 学工主管, 4 教研主管, 5 咨询师',entrydate date comment '入职时间',dept_id int unsigned comment '部门ID',create_time datetime not null comment '创建时间',update_time datetime not null comment '修改时间'
) comment '员工表';
-- 员工表测试数据
INSERT INTO emp(id, username, password, name, gender, image, job, entrydate,dept_id, create_time, update_time) VALUES(1,'jinyong','123456','金庸',1,'1.jpg',4,'2000-01-01',2,now(),now()),(2,'zhangwuji','123456','张无忌',1,'2.jpg',2,'2015-01-01',2,now(),now()),(3,'yangxiao','123456','杨逍',1,'3.jpg',2,'2008-05-01',2,now(),now()),(4,'weiyixiao','123456','韦一笑',1,'4.jpg',2,'2007-01-01',2,now(),now()),(5,'changyuchun','123456','常遇春',1,'5.jpg',2,'2012-12-05',2,now(),now()),(6,'xiaozhao','123456','小昭',2,'6.jpg',3,'2013-09-05',1,now(),now()),(7,'jixiaofu','123456','纪晓芙',2,'7.jpg',1,'2005-08-01',1,now(),now()),(8,'zhouzhiruo','123456','周芷若',2,'8.jpg',1,'2014-11-09',1,now(),now()),(9,'dingminjun','123456','丁敏君',2,'9.jpg',1,'2011-03-11',1,now(),now()),(10,'zhaomin','123456','赵敏',2,'10.jpg',1,'2013-09-05',1,now(),now()),(11,'luzhangke','123456','鹿杖客',1,'11.jpg',5,'2007-02-01',3,now(),now()),(12,'hebiweng','123456','鹤笔翁',1,'12.jpg',5,'2008-08-18',3,now(),now()),(13,'fangdongbai','123456','方东白',1,'13.jpg',5,'2012-11-01',3,now(),now()),(14,'zhangsanfeng','123456','张三丰',1,'14.jpg',2,'2002-08-01',2,now(),now()),(15,'yulianzhou','123456','俞莲舟',1,'15.jpg',2,'2011-05-01',2,now(),now()),(16,'songyuanqiao','123456','宋远桥',1,'16.jpg',2,'2007-01-01',2,now(),now()),(17,'chenyouliang','123456','陈友谅',1,'17.jpg',NULL,'2015-03-21',NULL,now(),now());
  • 创建springboot工程,引入对应的起步依赖(web、mybatis、mysql驱动、lombok)
    在这里插入图片描述

  • 配置文件application.properties中引入mybatis的配置信息,准备对应的实体类

    • application.properties
      #数据库连接
      spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
      spring.datasource.url=jdbc:mysql://localhost:3306/tlias
      spring.datasource.username=root
      spring.datasource.password=1234#开启mybatis的日志输出
      mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl#开启数据库表字段 到 实体类属性的驼峰映射
      mybatis.configuration.map-underscore-to-camel-case=true
      
    • 实体类
      /*员工类*/
      @Data
      @NoArgsConstructor
      @AllArgsConstructor
      public class Emp {private Integer id;private String username;private String password;private String name;private Short gender;private String image;private Short job;private LocalDate entrydate;private Integer deptId;private LocalDateTime createTime;private LocalDateTime updateTime;
      }
      
  • 准备对应的Mapper、Service(接口、实现类)、Controller基础结构

    数据访问层:

    • EmpMapper
      import org.apache.ibatis.annotations.Mapper;@Mapper
      public interface EmpMapper {
      }
      

    业务层:

    • EmpService

      //员工业务规则
      public interface EmpService {
      }
      
    • EmpServiceImpl

      import com.exmaple.service.EmpService;
      import lombok.extern.slf4j.Slf4j;
      import org.springframework.stereotype.Service;//员工业务实现类
      @Slf4j
      @Service
      public class EmpServiceImpl implements EmpService {}
      

    控制层:

    • EmpController
      package com.exmple.controller;
      import org.springframework.web.bind.annotation.RestController;//员工管理控制器
      @RestController
      public class EmpController {
      }
      
  1. 开发规范
  • REST

    • 传统URL和REST风格比较
      (1)传统URL风格

      http://localhost:8080/user/getById?id=1     GET:查询id为1的用户
      http://localhost:8080/user/saveUser         POST:新增用户
      http://localhost:8080/user/updateUser       POST:修改用户
      http://localhost:8080/user/deleteUser?id=1  GET:删除id为1的用户
      

      (2)REST风格URL:

      http://localhost:8080/users/1  GET:查询id为1的用户
      http://localhost:8080/users    POST:新增用户
      http://localhost:8080/users    PUT:修改用户
      http://localhost:8080/users/1  DELETE:删除id为1的用户
      

    其中总结起来,就一句话:通过URL定位要操作的资源,通过HTTP动词(请求方式)来描述具体的操作。

    在REST风格的URL中,通过四种请求方式,来操作数据的增删改查。

    • GET : 查询
    • POST :新增
    • PUT :修改
    • DELETE :删除
  • 统一响应结果

    前后端工程在进行交互时,使用统一响应结果 Result。

    package com.example.pojo;import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;@Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class Result {private Integer code;//响应码,1 代表成功; 0 代表失败private String msg;  //响应信息 描述字符串private Object data; //返回的数据//增删改 成功响应public static Result success(){return new Result(1,"success",null);}//查询 成功响应public static Result success(Object data){return new Result(1,"success",data);}//失败响应public static Result error(String msg){return new Result(0,msg,null);}
    }
    
  1. 开发流程
  • 查看页面原型明确需求

    • 根据页面原型和需求,进行表结构设计、编写接口文档(已提供)
  • 阅读接口文档

  • 思路分析

  • 功能接口开发

    • 就是开发后台的业务功能,一个业务功能,我们称为一个接口
  • 功能接口测试

    • 功能开发完毕后,先通过Postman进行功能接口测试,测试通过后,再和前端进行联调测试
  • 前后端联调测试

    • 和前端开发人员开发好的前端工程一起测试

新增员工

  1. 需求
    在新增用户时,我们需要保存用户的基本信息,并且还需要上传的员工的图片,目前我们先完成第一步操作,保存用户的基本信息。

  2. 接口文档

我们参照接口文档来开发新增员工功能

  • 基本信息
请求路径:/emps请求方式:POST接口描述:该接口用于添加员工的信息
  • 请求参数
    参数格式:application/json

    参数说明:

    名称类型是否必须备注
    usernamestring必须用户名
    namestring必须姓名
    gendernumber必须性别, 说明: 1 男, 2 女
    imagestring非必须图像
    deptIdnumber非必须部门id
    entrydatestring非必须入职日期
    jobnumber非必须职位, 说明: 1 班主任,2 讲师, 3 学工主管, 4 教研主管, 5 咨询师

    请求数据样例:

    {"image": "https://web-framework.oss-cn-hangzhou.aliyuncs.com/2022-09-03-07-37-38222.jpg","username": "linpingzhi","name": "林平之","gender": 1,"job": 1,"entrydate": "2022-09-18","deptId": 1
    }
    
  • 响应数据

    参数格式:application/json

    参数说明:

    参数名类型是否必须备注
    codenumber必须响应码,1 代表成功,0 代表失败
    msgstring非必须提示信息
    dataobject非必须返回的数据
  1. 思路分析
    接口文档规定:

    • 请求路径:/emps
    • 请求方式:POST
    • 请求参数:Json格式数据
    • 响应数据:Json格式数据

    问题1:如何限定请求方式是POST?

    @PostMapping
    

    问题2:怎么在controller中接收json格式的请求参数?

    @RequestBody  //把前端传递的json数据填充到实体类中
    
  2. 功能开发
    EmpController

@Slf4j
@RestController
@RequestMapping("/emps")
public class EmpController {@Autowiredprivate EmpService empService;//新增@PostMappingpublic Result save(@RequestBody Emp emp){//记录日志log.info("新增员工, emp:{}",emp);//调用业务层新增功能empService.save(emp);//响应return Result.success();}//省略...
}

EmpService

public interface EmpService {/*** 保存员工信息* @param emp*/void save(Emp emp);//省略...
}

EmpServiceImpl

@Slf4j
@Service
public class EmpServiceImpl implements EmpService {@Autowiredprivate EmpMapper empMapper;@Overridepublic void save(Emp emp) {//补全数据emp.setCreateTime(LocalDateTime.now());emp.setUpdateTime(LocalDateTime.now());//调用添加方法empMapper.insert(emp);}//省略...
}

EmpMapper

@Mapper
public interface EmpMapper {//新增员工@Insert("insert into emp (username, name, gender, image, job, entrydate, dept_id, create_time, update_time) " +"values (#{username}, #{name}, #{gender}, #{image}, #{job}, #{entrydate}, #{deptId}, #{createTime}, #{updateTime});")void insert(Emp emp);//省略...
}

删除员工

  1. 需求
    前端页面可以一次性删除一个或多个员工。
    问题:我们需要开发两个功能接口吗?一个删除单个员工,一个删除多个员工
    答案:不需要。 只需要开发一个功能接口即可(删除多个员工包含只删除一个员工)

  2. 接口文档

  • 基本信息

    请求路径:/emps/{ids}请求方式:DELETE接口描述:该接口用于批量删除员工的数据信息
    
  • 请求参数
    参数格式:路径参数

    参数说明:

    参数名类型示例是否必须备注
    ids数组 array1,2,3必须员工的id数组

    请求参数样例:

    /emps/1,2,3
    
  • 响应数据

    参数格式:application/json

    参数说明:

    参数名类型是否必须备注
    codenumber必须响应码,1 代表成功,0 代表失败
    msgstring非必须提示信息
    dataobject非必须返回的数据

    响应数据样例:

    {"code":1,"msg":"success","data":null
    }
    
  1. 思路分析
    接口文档规定:
  • 前端请求路径:/emps/{ids}

  • 前端请求方式:DELETE

    问题1:怎么在controller中接收请求路径中的路径参数?

    @PathVariable
    

    问题2:如何限定请求方式是delete?

    @DeleteMapping
    

    问题3:在Mapper接口中,执行delete操作的SQL语句时,条件中的id值是不确定的是动态的,怎么实现呢?

    Mybatis中的动态SQL:foreach
    
  1. 功能开发
    EmpController

    @Slf4j
    @RestController
    @RequestMapping("/emps")
    public class EmpController {@Autowiredprivate EmpService empService;//批量删除@DeleteMapping("/{ids}")public Result delete(@PathVariable List<Integer> ids){empService.delete(ids);return Result.success();}}
    

    EmpService

    public interface EmpService {/*** 批量删除操作* @param ids id集合*/void delete(List<Integer> ids);//省略...
    }
    

    EmpServiceImpl

    @Slf4j
    @Service
    public class EmpServiceImpl implements EmpService {@Autowiredprivate EmpMapper empMapper;@Overridepublic void delete(List<Integer> ids) {empMapper.delete(ids);}//省略...
    }
    

    EmpMapper

    @Mapper
    public interface EmpMapper {//批量删除void delete(List<Integer> ids);//省略...
    }
    

    EmpMapper.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">
    <mapper namespace="com.example.mapper.EmpMapper"><!--批量删除员工--><select id="delete">delete from emp where id in<foreach collection="ids" item="id" open="(" close=")" separator=",">#{id}</foreach></select><!-- 省略... --></mapper>
    

    元素用于迭代传入的集合。在这个例子中,它用于构建IN子句中的值列表。
    collection属性:指定要迭代的集合名称。在这个例子中,collection="ids"意味着传入的参数应该是一个名为ids的集合。
    item属性:指定每次迭代时使用的变量名。在这里,item=“id"表示每次迭代时,当前元素会被赋值给变量id。
    open属性:指定循环产生的SQL片段的开头字符。在这里,open=”(“表示循环开始时添加一个左括号。
    close属性:指定循环产生的SQL片段的结尾字符。在这里,close=”)“表示循环结束时添加一个右括号。
    separator属性:指定每次迭代之间使用的分隔符。在这里,separator=”,"表示每次迭代之间添加一个逗号。

修改员工

  1. 需求
    修改员工信息

  2. 接口文档

    • 基本信息

      请求路径:/emps请求方式:PUT接口描述:该接口用于修改员工的数据信息
      
    • 请求参数

      参数格式:application/json

      参数说明:

      名称类型是否必须备注
      idnumber必须id
      usernamestring必须用户名
      namestring必须姓名
      gendernumber必须性别, 说明: 1 男, 2 女
      imagestring非必须图像
      deptIdnumber非必须部门id
      entrydatestring非必须入职日期
      jobnumber非必须职位, 说明: 1 班主任,2 讲师, 3 学工主管, 4 教研主管, 5 咨询师

      请求数据样例:

      {"id": 1,"image": "https://web-framework.oss-cn-hangzhou.aliyuncs.com/2022-09-03-07-37-38222.jpg","username": "linpingzhi","name": "林平之","gender": 1,"job": 1,"entrydate": "2022-09-18","deptId": 1
      }
      
    • 响应数据

      参数格式:application/json

      参数说明:

      参数名类型是否必须备注
      codenumber必须响应码,1 代表成功,0 代表失败
      msgstring非必须提示信息
      dataobject非必须返回的数据

      响应数据样例:

      {"code":1,"msg":"success","data":null
      }
      
  3. 代码实现

  • EmpMapper

    @Mapper
    public interface EmpMapper {//修改员工信息public void update(Emp emp);//省略...
    }
    
    • EmpMapper.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">
    <mapper namespace="com.itheima.mapper.EmpMapper"><!--更新员工信息--><update id="update">update emp<set><if test="username != null and username != ''">username = #{username},</if><if test="password != null and password != ''">password = #{password},</if><if test="name != null and name != ''">name = #{name},</if><if test="gender != null">gender = #{gender},</if><if test="image != null and image != ''">image = #{image},</if><if test="job != null">job = #{job},</if><if test="entrydate != null">entrydate = #{entrydate},</if><if test="deptId != null">dept_id = #{deptId},</if><if test="updateTime != null">update_time = #{updateTime}</if></set>where id = #{id}</update><!-- 省略... --></mapper>
    
    • EmpService
    public interface EmpService {/*** 更新员工* @param emp*/public void update(Emp emp);//省略...
    }
    
    • EmpServiceImpl
    @Slf4j
    @Service
    public class EmpServiceImpl implements EmpService {@Autowiredprivate EmpMapper empMapper;@Overridepublic void update(Emp emp) {emp.setUpdateTime(LocalDateTime.now()); //更新修改时间为当前时间empMapper.update(emp);}//省略...
    }
    
    • EmpController
    @Slf4j
    @RestController
    @RequestMapping("/emps")
    public class EmpController {@Autowiredprivate EmpService empService;//修改员工@PutMappingpublic Result update(@RequestBody Emp emp){empService.update(emp);return Result.success();}//省略...
    }
    

查询员工

  1. 需求
  • 根据ID查询员工信息
  1. 接口文档
    根据ID查询员工数据

    • 基本信息

      请求路径:/emps/{id}请求方式:GET接口描述:该接口用于根据主键ID查询员工的信息
      
    • 请求参数

      参数格式:路径参数

      参数说明:

      参数名类型是否必须备注
      idnumber必须员工ID

      请求参数样例:

      /emps/1
      
    • 响应数据

      参数格式:application/json

      参数说明:

      名称类型是否必须默认值备注
      codenumber必须响应码, 1 成功 , 0 失败
      msgstring非必须提示信息
      dataobject必须返回的数据
      idnumber非必须id
      usernamestring非必须用户名
      namestring非必须姓名
      passwordstring非必须密码
      entrydatestring非必须入职日期
      gendernumber非必须性别 , 1 男 ; 2 女
      imagestring非必须图像
      jobnumber非必须职位, 说明: 1 班主任,2 讲师, 3 学工主管, 4 教研主管, 5 咨询师
      deptIdnumber非必须部门id
      createTimestring非必须创建时间
      updateTimestring非必须更新时间

      响应数据样例:

      {"code": 1,"msg": "success","data": {"id": 2,"username": "zhangwuji","password": "123456","name": "张无忌","gender": 1,"image": "https://web-framework.oss-cn-hangzhou.aliyuncs.com/2022-09-02-00-27-53B.jpg","job": 2,"entrydate": "2015-01-01","deptId": 2,"createTime": "2022-09-01T23:06:30","updateTime": "2022-09-02T00:29:04"}
      }
      
  2. 代码实现

  • EmpMapper

    @Mapper
    public interface EmpMapper {//根据ID查询员工信息@Select("select id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time " +"from emp " +"where id = #{id}")public Emp findById(Integer id);//省略...
    }
    
    • EmpService
    public interface EmpService {/*** 根据ID查询员工* @param id* @return*/public Emp getById(Integer id);//省略...
    }
    
    • EmpServiceImpl
    @Slf4j
    @Service
    public class EmpServiceImpl implements EmpService {@Autowiredprivate EmpMapper empMapper;@Overridepublic Emp getById(Integer id) {return empMapper.findById(id);}//省略...
    }
    
    • EmpController
    @Slf4j
    @RestController
    @RequestMapping("/emps")
    public class EmpController {@Autowiredprivate EmpService empService;//根据id查询@GetMapping("/{id}")public Result getById(@PathVariable Integer id){Emp emp = empService.getById(id);return Result.success(emp);}//省略...
    }
    

后记

springboot + mybatis做数据的增删改查其实相对比较简单,我们根据上面的案例就可以进行学习,主要关注的是常用的注解以及mybatis复杂查询时xml文件的配置。

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

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

相关文章

计算机毕业设计公交站点线路查询网站登录注册搜索站点线路车次/springboot/javaWEB/J2EE/MYSQL数据库/vue前后分离小程序

选题背景‌&#xff1a; 随着城市化进程的加快&#xff0c;公共交通成为城市居民出行的重要方式。然而&#xff0c;传统的公交站点线路查询方式往往依赖于纸质地图或简单的电子显示屏&#xff0c;查询效率低下且信息更新不及时。因此&#xff0c;开发一个功能全面、易于使用的…

OpenMV学习第一步安装IDE_2024.09.20

用360浏览器访问星瞳科技官网&#xff0c;一直提示访问不了。后面换了IE浏览器就可以访问。第一个坑。

基于springboot的智慧社区微信小程序

文未可获取一份本项目的java源码和数据库参考。 本课题研究目标 本文主要对小区生活服务平台的功能和非功能需求进行了分析&#xff0c;系统除了提供物业保修、小区资讯、投诉留言、常用电话等基础功能外&#xff0c;为了满足用户的多样化需求&#xff0c;还提供邻里圈子和有…

238 除自身以外数组的乘积

解题思路&#xff1a; \qquad 这道题要求在 O ( n ) O(n) O(n) 时间内解决&#xff0c;但是不能使用除法。仅使用乘法的话&#xff0c;看上去很难在一次遍历中得出想要的结果&#xff0c;但是没关系&#xff0c;一次遍历不行的话那就试试两次、三次&#xff0c;重要的是分析在…

Python--TCP/UDP通信

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.客户端与服务端通信原理 1. 服务器端 服务器端的主要任务是监听来自客户端的连接请求&#xff0c;并与之建立连接&#xff0c;然后接收和发送数据。 创建套接字&#xff1a;首先&#xff0…

【数据库】常用数据库简介

目录 &#x1f354; 常用的关系型数据库 &#x1f354; Mysql简介 &#x1f354; SQL 简介 SQL语句的分类 SQL 写法 SQL 常用的数据类型 &#x1f354; DDL语句 对数据库的操作 对数据表的操作 &#x1f354; DML语句 插入数据 insert into 修改数据 update 删除数…

css基础知识笔记

一言&#xff1a; “放任误解就是撒谎。” 文章目录 前言文章有误敬请斧正 不胜感恩&#xff01;CSS基础教程0.文本样式基础1. CSS选择器2. CSS布局技巧3. 响应式设计4. Emmet语法 总结 前言 写在开始&#xff1a; 今天来看一眼CSS基础知识。 好几天没更新了 先更一篇 文章有…

DataGrip在Windows和MacOS平台上的快捷键

0. 背景信息 No.说明1测试DataGrip版本号 : 2024.2.2 1. Windows下快捷键 2. MacOS下快捷键

Java流程控制语句——跳转语句详解:break 与 continue 有什么区别?

&#x1f310;在Java编程中&#xff0c;break和continue是两个重要的控制流语句&#xff0c;它们允许开发者根据特定条件改变程序的执行流程。虽然两者都用于中断当前的行为&#xff0c;但它们的作用方式不同。本文将通过生动的例子来详细解释这两个语句&#xff0c;并使用流程…

C++/Qt 集成 AutoHotkey

C/Qt 集成 AutoHotkey 前言AutoHotkey 介绍 方案一&#xff1a;子进程启动编写AutoHotkey脚本准备 AutoHotkey 运行环境编写 C/Qt 代码 方案二&#xff1a;显式动态链接方案探索编译动态链接库集成到C工程关于AutoHotkeyDll.dll中的函数原型 总结 前言 上一篇介绍了AutoHotkey…

系统架构设计师 需求分析篇一

&#x1f4d8; 结构化分析SA 思想 自顶向下&#xff1a;像剥洋葱一样&#xff0c;层层深入&#xff0c;大问题拆成小问题&#xff0c;再拆成更小的问题。 核心模型 数据字典 &#x1f4d4;&#xff1a;记录数据元素的点点滴滴&#xff0c;从属性到使用方式&#xff0c;无所…

Spring自定义参数解析器

在这篇文章中&#xff0c;我们认识了参数解析器和消息转换器&#xff0c;今天我们来自定义一个参数解析器。 自定义参数解析器 实现HandlerMethodArgumentResolver的类&#xff0c;并注册到Spring容器。 Component&#xff0f;&#xff0f;注册到Spring public class UserAr…

C#解决方案的各种操作

C#开发编程软件下载安装 C#开发编程软件下载安装_c#下载安装-CSDN博客文章浏览阅读208次。。。。_c#下载安装https://rxxw-control.blog.csdn.net/article/details/140879228 C#和S7-1200PLC S7.NET通信 C#和S7-1200PLC S7.NET通信_c# s1200 s7协议设置-CSDN博客文章浏览阅读…

【Python】探索 TensorFlow:构建强大的机器学习模型

TensorFlow 是一个开源的深度学习框架&#xff0c;由 Google 开发&#xff0c;广泛应用于机器学习和人工智能领域。自从 2015 年推出以来&#xff0c;它已成为研究人员、开发者和数据科学家们不可或缺的工具。TensorFlow 提供了灵活、高效的工具集&#xff0c;可以帮助我们构建…

消息中间件---Kafka

一、什么是Kafka&#xff1f; Kafka是一个分布式流处理平台,类似于消息队列或企业消息传递系统&#xff1b; 流处理事什么呢&#xff1f; 流处理就是数据处理工作流&#xff0c;本质上是一种计算机编程范例。流处理是对接收到的新数据事件的连续处理。‌它涉及对从生产者到消…

【C++】—— string模拟实现

前言&#xff1a; 学习了string的使用&#xff0c;总感觉了解不是很深厚&#xff1b;自己模拟实现string类来帮助自己理解。 这里只是实现了一部分内容&#xff08;并没有实现完整的string类&#xff09;。 先来实现string类里面的成员变量&#xff1a; #include<iostream…

PyCharm的使用

PyCharm的入门使用教程 下载和安装PyCharm&#xff1a; 首先&#xff0c;访问JetBrains官方网站&#xff08;https://www.jetbrains.com/pycharm/&#xff09;下载PyCharm的最新版本。根据您的操作系统选择合适的版本进行下载。 安装完成后&#xff0c;打开PyCharm。 创建新…

记录一次显卡驱动安装

1. 驱动安装 1.1. 查看适合的版本 apt-get update ubuntu-drivers devices输出结果&#xff1a; 1.2. 安装合适的驱动版本 根据上面输出的内容 apt-get install nvidia-driver-545完成后重启 reboot查看新的驱动 nvidia-smi2. 安装/升级cuda 在nvidia-smi中显示的CUDA…

hive分区详细教程

为什么要分区&#xff1f; 为了提高sql的查询效率 比如&#xff1a; select * from orders where create_date20230826; 假如数据量比较大&#xff0c;这个sql就是全表扫描&#xff0c;速度肯定慢。 可以将数据按照天进行分区&#xff0c;一个分区就是一个文件夹&#xff0c;当…

中序遍历二叉树全过程图解

文章目录 中序遍历图解总结 中序遍历图解 首先看下中序遍历的代码&#xff0c;其接受一个根结点root作为参数&#xff0c;判断根节点是否为nil&#xff0c;不为nil则先递归遍历左子树。 func traversal(root *TreeNode,res *[]int) {if root nil {return}traversal(root.Lef…