SpringBootWeb增删改查入门案例

news2024/9/21 3:28:18

前言

为了快速入门一个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 {

    @Autowired
    private EmpService empService;

    //新增
    @PostMapping
    public 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 {
    @Autowired
    private EmpMapper empMapper;

    @Override
    public 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 {
    
        @Autowired
        private 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 {
        @Autowired
        private EmpMapper empMapper;
    
        @Override
        public 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 mapper
            PUBLIC "-//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 mapper
            PUBLIC "-//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 {
        @Autowired
        private EmpMapper empMapper;
    
        @Override
        public void update(Emp emp) {
            emp.setUpdateTime(LocalDateTime.now()); //更新修改时间为当前时间
    
            empMapper.update(emp);
        }
    
        //省略...
    }
    
    • EmpController
    @Slf4j
    @RestController
    @RequestMapping("/emps")
    public class EmpController {
    
        @Autowired
        private EmpService empService;
    
        //修改员工
        @PutMapping
        public 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 {
        @Autowired
        private EmpMapper empMapper;
    
        @Override
        public Emp getById(Integer id) {
            return empMapper.findById(id);
        }
    
        //省略...
    }
    
    • EmpController
    @Slf4j
    @RestController
    @RequestMapping("/emps")
    public class EmpController {
    
        @Autowired
        private 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.coloradmin.cn/o/2145420.html

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

相关文章

论文阅读 | 基于流模型和可逆噪声层的鲁棒水印框架(AAAI 2023)

Flow-based Robust Watermarking with Invertible Noise Layer for Black-box DistortionsAAAI, 2023&#xff0c;新加坡国立大学&中国科学技术大学本论文提出一种基于流的鲁棒数字水印框架&#xff0c;该框架采用了可逆噪声层来抵御黑盒失真。 一、问题 基于深度神经网络…

spring boot admin集成,springboot2.x集成监控

服务端&#xff1a; 1. 新建monitor服务 pom依赖 <!-- 注意这些只是pom的核心东西&#xff0c;不是完整的pom.xml内容&#xff0c;不能直接使用&#xff0c;仅供参考使用 --><packaging>jar</packaging><dependencies><dependency><groupId&g…

STM32 芯片启动过程

目录 一、前言二、STM32 的启动模式三、STM32 启动文件分析1、栈 Stack2、堆 Heap3、中断向量表 Vectors3.1 中断响应流程 4、复位程序 Reset_Handler5、中断服务函数6、用户堆栈初始化 四、STM32 启动流程分析1、初始化 SP、PC 及中断向量表2、设置系统时钟3、初始化堆栈并进入…

【Linux】POSIX信号量与、基于环形队列实现的生产者消费者模型

目录 一、POSIX信号量概述 信号量的基本概念 信号量在临界区的作用 与互斥锁的比较 信号量的原理 信号量的优势 二、信号量的操作 1、初始化信号量&#xff1a;sem_init 2、信号量申请&#xff08;P操作&#xff09;&#xff1a;sem_wait 3、信号量的释放&#xff08…

树——数据结构

这次我来给大家讲解一下数据结构中的树 1. 树的概念 树是一种非线性的数据结构&#xff0c;它是由n(n>0&#xff09;个有限结点组成一个具有层次关系的集合。 叫做树的原因&#xff1a;看起来像一棵倒挂的树&#xff0c;根朝上&#xff0c;叶朝下。 特殊结点&#xff1a…

Vim编辑器常用命令

目录 一、命令模式快捷键 二、编辑/输入模式快捷键 三、编辑模式切换到命令模式 四、搜索命令 一、命令模式快捷键 二、编辑/输入模式快捷键 三、编辑模式切换到命令模式 四、搜索命令

深圳铨顺宏科技展邀您体验前沿人工智能技术

我们诚挚地邀请您参加即将举行的展会&#xff0c;探索RFID技术在资产与人员管理中的广泛应用。这些展会将为您提供一个深入了解前沿技术和创新解决方案的机会。 东莞台湾名品博览会&#xff08;东莞台博会&#xff09;展会时间&#xff1a;9月5日至8日。此次展会展示了来自台湾…

路由器全局配置DHCP实验简述

一、路由器配置 reset saved-configuration Warning: The action will delete the saved configuration in the device. The configuration will be erased to reconfigure. Continue? [Y/N]:y Warning: Now clearing the configuration in the device. Info: Succeeded in c…

如何配置 Apache 反向代理服务器 ?

将 Apache 配置为反向代理意味着将 Apache 设置为侦听和引导 web 流量到后端服务器或服务。这有助于管理和平衡服务器上的负载&#xff0c;提高安全性&#xff0c;并使您的 web 服务更高效。您还可以将其设置为监听标准 HTTP 和 HTTPS 端口上的请求&#xff0c;并将其重定向到运…

基于Leaflet和天地图的直箭头标绘实战-源码分析

目录 前言 一、Leaflet的特种标绘库 1、特种标绘对象的定义 2、Plot基类定义 3、直线箭头的设计与实现 二、在天地图中进行对象绘制 1、引入天地图资源 2、标绘对象的调用时序 3、实际调用过程 三、总结 前言 在博客中介绍过geoman标绘的具体实现&#xff0c;使用Leaf…

Linux驱动开发 ——架构体系

只读存储器&#xff08;ROM&#xff09; 1.作用 这是一种非易失性存储器&#xff0c;用于永久存储数据和程序。与随机存取存储器&#xff08;RAM&#xff09;不同&#xff0c;ROM中的数据在断电后不会丢失&#xff0c;通常用于存储固件和系统启动程序。它的内容在制造时或通过…

教师薪酬管理系统的设计与实现

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;老师信息因为其管理内容繁杂&#xff0c;管理数量繁多导致手工进行处理不能满足广…

【专题】2024中国生物医药出海现状与趋势蓝皮书报告合集PDF分享(附原数据表)

原文链接&#xff1a;https://tecdat.cn/?p37719 出海已成为中国医药产业实现提速扩容的重要途径。目前&#xff0c;中国医药产业发展态势良好&#xff0c;创新能力不断增强&#xff0c;然而也面临着医保政策改革和带量集采带来的压力。政府积极出台多项政策支持医药企业出海…

人工智能 | 基于ChatGPT开发人工智能服务平台

简介 ChatGPT 在刚问世的时候&#xff0c;其产品形态就是一个问答机器人。而基于ChatGPT的能力还可以对其做一些二次开发和拓展。比如模拟面试功能、或者智能机器人功能。 模拟面试功能包括个性化问题生成、实时反馈、多轮面试模拟、面试报告。 智能机器人功能提供24/7客服支…

字节跳动冯佳时:大语言模型在计算机视觉领域的应用、问题和我们的解法

演讲嘉宾&#xff5c;冯佳时 编辑 &#xff5c;蔡芳芳 近年来&#xff0c;大语言模型 (LLMs) 在文本理解与生成领域取得了显著进展。然而&#xff0c;LLMs 在理解和生成自然信号&#xff08;例如图像&#xff0c;视频&#xff09;等&#xff0c;还处在比较早期的探索阶段。为…

muduo - 概要简述

作者&#xff1a;陈硕 编程语言&#xff1a;C 架构模式&#xff1a;Reactor 代码链接&#xff1a;GitHub - chenshuo/muduo: Event-driven network library for multi-threaded Linux server in C11 设计自述&#xff1a;https://www.cnblogs.com/Solstice/archive/2010/08…

MybatisPlus:多条件 or()的使用

default List<ErpProductDO> selectByOE(String oe1, String oe2){return selectList(new LambdaUpdateWrapper<ErpProductDO>().eq(ErpProductDO::getOe,oe1).or().eq(ErpProductDO::getOe,oe2)); } 对应SQL为&#xff1a;

《探索云原生与相关技术》

在当今的科技领域中&#xff0c;云原生&#xff08;Cloud Native&#xff09;已经成为了一个热门的话题。它代表着一种构建和运行应用程序的全新方式。 云原生的概念 云原生是一套技术体系和方法论&#xff0c;旨在充分利用云计算的优势来构建更具弹性、可扩展性和高效性的应…

LeetCode 2332.坐上公交的最晚时间 (双指针 + 贪心)

给你一个下标从 0 开始长度为 n 的整数数组 buses &#xff0c;其中 buses[i] 表示第 i 辆公交车的出发时间。同时给你一个下标从 0 开始长度为 m 的整数数组 passengers &#xff0c;其中 passengers[j] 表示第 j 位乘客的到达时间。所有公交车出发的时间互不相同&#xff0c;…

python 识别省市、区县并组建三级信息数据库

一、网址&#xff1a; 全国行政区划信息查询平台 二、分析并搭建框架 检查网页源码&#xff1a; 检查网页源码可以发现&#xff1a; 所有省级信息全部在javaScript下的json中&#xff0c;会在页面加载时加载json数据&#xff0c;填充到页面的option中。 1、第一步&#xff1a…