当前位置: 首页 > article >正文

【案例篇】 实现简单SSM工程-后端

简介

        本篇文章将带你从0到1的实现一个SSM项目,通过此案例可以让你在项目中对SpringBoot的使用有一个更加详细的认识,希望这个简单的案例能够帮到你。文章内容若存在错误或需改进的地方,欢迎大家指正!若对操作有任何疑问欢迎留言!非常感谢!

目录

一、创建SpringBoot工程

二、项目初始化

1、初始化MySQL的库和表

2、初始化实体类

三、实现数据访问层

1、实现

2、测试

3、拓展

(1)开启MyBatis-Plus的日志

(2)实现分页查询

(3)条件查询

(4)处理异常IllegalArgumentException: argument type mismatch

四、实现业务逻辑层

1、实现

2、测试

3、拓展

(1)业务逻辑层整合MyBatis-Plus

(2)分页校验

五、实现表现层

1、实现

2、测试

3、拓展

(1)表现层消息一致性处理

六、统一异常处理类

1、场景

2、解决办法


一、创建SpringBoot工程

        首先,创建一个SpringBoot工程,然后在pom里面导入web、MyBatis-Plus、MySQL驱动、Druid的坐标依赖,若这里如果有不太清晰怎么使用的可以看【第四篇】 SpringBoot整合第三方技术文章的内容。

        然后配置文件使用.yaml文件,并且还在文件中配置了项目的启动端口号为8888,防止8080端口出现冲突,另外设置了数据库的连接信息配置。

二、项目初始化

1、初始化MySQL的库和表

create schema demo;create table demo.student
(id      int auto_increment comment '主键'primary key,name    varchar(128) null comment '名字',age     int          null comment '年龄',address varchar(128) null comment '家庭住址'
)comment '学生表';INSERT INTO demo.student (id, name, age, address) VALUES (1, '张三', 18, '北京');
INSERT INTO demo.student (id, name, age, address) VALUES (2, '李四', 19, '南京');
INSERT INTO demo.student (id, name, age, address) VALUES (3, '王五', 20, '苏州');
INSERT INTO demo.student (id, name, age, address) VALUES (4, '赵六', 21, '杭州');
INSERT INTO demo.student (id, name, age, address) VALUES (5, '马七', 22, '成都');
INSERT INTO demo.student (id, name, age, address) VALUES (6, '刘八', 23, '重庆');
INSERT INTO demo.student (id, name, age, address) VALUES (7, '蔡九', 24, '上海');
INSERT INTO demo.student (id, name, age, address) VALUES (8, '康十', 25, '深圳');
INSERT INTO demo.student (id, name, age, address) VALUES (9, '杨十一', 26, '广州');
INSERT INTO demo.student (id, name, age, address) VALUES (10, '杨十二', 27, '珠海');
INSERT INTO demo.student (id, name, age, address) VALUES (11, '杨十三', 28, '太原');
INSERT INTO demo.student (id, name, age, address) VALUES (12, '杨十四', 29, '西安');
INSERT INTO demo.student (id, name, age, address) VALUES (13, '杨十五', 30, '济南');

2、初始化实体类

        在引导类所在包下创建domain.pojo包,然后在pojo包里创建Student实体类,并给出get/set、toString、equals/hashCode方法。这里使用的Lombok的@Data实现实体类方法的简化。下面会说明Lombok的用法。

Lombok的用法

(1)导入对应的依赖坐标

(2)使用

Lombok提供的主要注解:

  • @Data:为当前实体类在编译期设置对应的get/set、toString、equals/hashCode方法。
  • @AllArgsConstructor:为当前实体类在编译期设置对应的全参构造方法
  • @NoArgsConstructor:为当前实体类在编译期设置对应的空参构造方法

三、实现数据访问层

1、实现

        在引导类所在包下创建一个mapper包,然后在mapper包中创建一个StudentMapper的接口,使用@Mapper注解标注该类,并且让该接口继承BaserMapper接口指定泛型为与数据库表映射的实体类。这样数据访问层的基础接口就已经写好了,因为BaserMapper接口中已经提供了各种用于操作数据库的接口,所以在使用的使用直接注入StudentMapper接口,然后调用即可。

2、测试

        在test包下同样的目录下创建一个mapper包,然后在mapper包中创建一个StudentMapper的测试类,然后再类中注入StudentMapper的对象,最后编写测试方法即可。

@SpringBootTest
public class StudentMapperTest {@Autowiredprivate StudentMapper studentMapper;/*** 测试查询单个数据*//*** 测试查询单个数据*/@Testvoid testGetById() {System.out.println(studentMapper.selectById(1));}/*** 测试新增数据*/@Testvoid testSave() {Student student = new Student();student.setName("demo1");student.setAge(18);student.setAddress("青海");studentMapper.insert(student);}/*** 测试修改数据*/@Testvoid testUpdate() {Student student = new Student();student.setName("demo1");student.setAge(18);student.setAddress("青海");studentMapper.updateById(student);}/*** 测试删除数据*/@Testvoid testDelete() {studentMapper.deleteById(1);}/*** 测试查询所有数据*/@Testvoid testGetaAll() {System.out.println(studentMapper.selectList(null));}
}

3、拓展

(1)开启MyBatis-Plus的日志

        只需要在application.yaml配置文件中配置MyBatis-Plus开启日志打印的配置即可。

mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

(2)实现分页查询

        MyBatis-Plus中是提供了分页查询的功能的,但是需要手动显示的配置。只需要将MyBatis-Plus的拦截器的对象注册为IOC的Bean,并在注册之前在这个拦截器的Bean里面添加想要的配置即可,比如添加分页功能。

        步骤:在启动类所在包下创建config包,用于存放配置类,在config包下创建MyBatis-Plus的配置类,并将MyBatis-Plus的拦截器的对象注册为IOC的Bean。

/*** MyBatis-Plus的配置类*/
@Configuration
public class MPConfig {/*** 将MyBatis-Plus的拦截器对象注册为IOC的Bean* @return*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();// 将MyBatis-Plus的分页插件对象加入拦截器对象中interceptor.addInnerInterceptor(new PaginationInnerInterceptor());return interceptor;}
}

        测试分页查询,MyBatis-Plus提供的有分页查询方法selectPage,其中接收Page对象和条件构造器,条件构造器会在下面说明。创建一个IPage对象,然后传参给查询第几页和一页展示多少数据,然后调用分页查询方法,方法的返回值还是这个page对象,然后page对象提供了一些方法,具体方法什么含义在下面截图中有说明。

    @Testvoid testPage() {IPage page = new Page(1,5);studentMapper.selectPage(page,null);}

(3)条件查询

        使用MyBatis-Plus提供的QueryWrapper和LambdaQueryWrapper,两个选一个就行,区别在于QueryWrapper的条件构造中是直接使用的字符串参数,LambdaQueryWrapper是在字符串的基础上使用了方法引用,QueryWrapper是有可能因为人为原因写错的,而LambdaQueryWrapper则避免了这个问题,所以今后推荐使用LambdaQueryWrapper。另外在条件表达式中还支持添加判断表达式,若为true则拼接该条件,反之则不拼接,这样可以对接收到的参数进行一个非空判断,防止接收空参报错。

(4)处理异常IllegalArgumentException: argument type mismatch

        产生这个问题的原因是因为MyBatis-Plus自动生成id值的策略是采用雪花算法,然而雪花算法生成的值是超出了int的范围,于是就产生了这个异常,可以在配置文件中设置id的策略为数据库自增

四、实现业务逻辑层

1、实现

        首先,在启动类所在包下创建一个service包,然后在service包中创建IStudentService接口,并在接口中定义所要使用方法,这里简单列举了几个。

        然后,在service包中创建一个impl包,在里面创建实现类StudentServiceImpl并实现IStudentService接口,重写所有方法。在该类上标注@Service注解,并在类里面注入数据访问层StudentMapper的对象。

        最后,编写实现类StudentServiceImpl中方法的逻辑,并使用数据访问层对象操作数据库。

@Service
public class StudentServiceImpl implements IStudentService {@Autowiredprivate StudentMapper studentMapper;@Overridepublic Boolean save(Student student) {return studentMapper.insert(student) > 0;}@Overridepublic Boolean update(Student student) {return studentMapper.updateById(student) > 0;}@Overridepublic Boolean delete(Integer id) {return studentMapper.deleteById(id) > 0;}@Overridepublic Student getById(Integer id) {return studentMapper.selectById(id);}@Overridepublic List<Student> getAll() {return studentMapper.selectList(null);}@Overridepublic IPage<Student> getPage(int pageNum, int pageSize) {IPage<Student> page = new Page<>(pageNum, pageSize);studentMapper.selectPage(page, null);return page;}
}

2、测试

        在test包下同样的目录下创建一个servicer包,然后在servicer包中创建一个IStudentServicer的测试类,然后再类中注入IStudentServicer的对象,最后编写测试方法即可。

@SpringBootTest
public class IStudentServiceTest {@Autowiredprivate IStudentService studentService;/*** 测试查询单个数据*/@Testvoid testGetById() {System.out.println(studentService.getById(1));}/*** 测试新增数据*/@Testvoid testSave() {Student student = new Student();student.setName("demo1");student.setAge(18);student.setAddress("青海");studentService.save(student);}/*** 测试修改数据*/@Testvoid testUpdate() {Student student = new Student();student.setId(14);student.setName("demo1");student.setAge(18);student.setAddress("青海");studentService.update(student);}/*** 测试删除数据*/@Testvoid testDelete() {studentService.delete(14);}/*** 测试查询所有数据*/@Testvoid testGetaAll() {System.out.println(studentService.getAll());}/*** 测试分页查询*/@Testvoid testPage() {IPage<Student> page = studentService.getPage(1, 5);System.out.println(page.getPages());System.out.println(page.getTotal());System.out.println(page.getRecords());System.out.println(page.getCurrent());System.out.println(page.getSize());}
}

3、拓展

(1)业务逻辑层整合MyBatis-Plus

        MyBatis-Plus提供了业务逻辑层通用接口(IService<T>)和业务逻辑层通用实现类(ServiceImpl<M,T>),基于这二者能够直接在业务层对数据库进行操作。注意:如果通用类提供的方法不足以满足业务逻辑层中的需求,那么可以在通用类的基础上做功能重载或者功能追加,千万不能覆盖原始方法!

步骤:

  • 业务层接口继承通用接口(IService<T>),并指定实体类泛型
  • 业务实现层
    • 继承通用实现类(ServiceImpl<M,T>),第一个泛型数据访问层,第二个是实体类。
    • 实现业务层接口。
    • 使用@Service注解声明

        经过上面业务逻辑层整合MyBatis-Plus,下面是测试示例:

@SpringBootTest
public class IStudentService2Test {@Autowiredprivate IStudentService2 studentService2;/*** 测试查询单个数据*/@Testvoid testGetById() {System.out.println(studentService2.getById(1));}/*** 测试新增数据*/@Testvoid testSave() {Student student = new Student();student.setName("demo1");student.setAge(18);student.setAddress("青海");studentService2.save(student);}/*** 测试修改数据*/@Testvoid testUpdate() {Student student = new Student();student.setId(14);student.setName("demo1");student.setAge(18);student.setAddress("青海");studentService2.updateById(student);}/*** 测试删除数据*/@Testvoid testDelete() {studentService2.removeById(14);}/*** 测试查询所有数据*/@Testvoid testGetaAll() {System.out.println(studentService2.list());}/*** 测试分页查询*/@Testvoid testPage() {IPage<Student> page = new Page<>(1, 5);studentService2.page(page);System.out.println(page.getPages());System.out.println(page.getTotal());System.out.println(page.getRecords());System.out.println(page.getCurrent());System.out.println(page.getSize());}
}
(2)分页校验

        当前的分页是存在一点点问题的,因为没有对分页参数进行校验,当页码和页展示数对不上的时候就会发生异常。例如,在最后一页只有一条数据,如果删除之后,还是在当前页,但是当前页已经没有数据了。后端校验是有弊端的,有并发风险,假如正在重查,然后别人又删除了,就会有问题,所以后端校验属于补救措施。

处理办法

  • 前端在做删除的操作之后,立即返回第一页(推荐)
  • 后端做校验
    • 若页码或者页展示数是非法值,那么就给默认值;
    • 若查询页与返回页对不上,那么再重查一次;

@Overridepublic IPage<Student> getPage(int pageNum, int pageSize) {// 判断参数是否非法pageNum = pageNum <= 0 ? 1 : pageNum;pageSize = pageSize <= 0 ? 10 : pageSize;// 若查询页码与总页数不一致,则重查IPage<Student> page = new Page<>(pageNum, pageSize);studentMapper.selectPage(page, null);if (pageNum > page.getPages()){page = studentMapper.selectPage(Page.of(page.getPages(), pageSize), null);}return page;}

五、实现表现层

        表现层基于Restful开发,并且使用APIfox进行接口测试

1、实现

        首先,在启动类所在包下创建一个controller包,然后在controller包中创建StudentController接口,然后使用@RestController注解声明为表现层类、@RequestMapping("/students")声明请求路径前缀并在接口中定义所要使用方法,这里简单列举了几个。

@RestController
@RequestMapping("/students")
public class StudentCroller {@Autowiredprivate IStudentService studentService;@GetMappingpublic List<Student> getAll() {return studentService.getAll();}@GetMapping("/{id}")public Student getById(@PathVariable Integer id) {return studentService.getById(id);}@PostMappingpublic Boolean save(@RequestBody Student student) {return studentService.save(student);}@PutMappingpublic Boolean update(@RequestBody Student student) {return studentService.update(student);}@DeleteMappingpublic Boolean delete(Integer id) {return studentService.delete(id);}
}

2、测试

        这里使用的APIfox构造的请求,也可以使用Postman。

3、拓展

(1)表现层消息一致性处理

        设计表现层返回结果的模型类,用于后端与前端进行数据格式统一,也称为前后端数据协议。在启动类所在包下创建一个utilsr包,然后在utilsr包中创建R类,并给三个属性code、msg、data,code等于200时代表请求成功500代表失败,其余响应码可以看约定。msg是响应信息,data是响应数据。也可以定义一些静态方法,方便调用。

@Data
public class R {private int code;private String msg;private Object data;public static R ok(Object data) {R r = new R();r.setCode(200);r.setMsg("success");r.setData(data);return r;}public static R ok() {R r = new R();r.setCode(200);r.setMsg("success");r.setData(null);return r;}public static R fail(String msg) {R r = new R();r.setCode(500);r.setMsg(msg);r.setData(null);return r;}
}

        然后在表现层就需要统一返回值为R,那么前端就可以根据code的值来进行不同操作,也知道数据一定在daata里面,这样就形成了统一。

@RestController
@RequestMapping("/unified/students")
public class StudentCroller2 {@Autowiredprivate IStudentService studentService;@GetMappingpublic R getAll() {return R.ok(studentService.getAll());}@GetMapping("/{id}")public R getById(@PathVariable Integer id) {return R.ok(studentService.getById(id));}@GetMapping("/{pageNum}/{pageSize}")public R page(@PathVariable Integer pageNum, @PathVariable Integer pageSize) {return R.ok(studentService.getPage(pageNum, pageSize));}@PostMappingpublic R save(@RequestBody Student student) {return studentService.save(student) ? R.ok() : R.fail("添加失败");}@PutMappingpublic R update(@RequestBody Student student) {return studentService.update(student) ? R.ok() : R.fail("修改失败");}@DeleteMappingpublic R delete(Integer id) {return studentService.delete(id) ? R.ok() : R.fail("删除失败");}
}

六、统一异常处理类

1、场景

                开发中难免会遇到错误,那么当程序中出现错误的时候就会抛异常,如果按照上面的方式来写项目的话,一旦程序中发生异常,那么就会直接抛给前端,导致无法正确解析数据,下面是一个演示。

2、解决办法

        尽管代码出现了异常,那后端也应该将异常统一做处理,做成前端能够统一处理的格式。SpingBoot也提供的有统一异常类的实现,先在utils中创建一个异常处理类,并使用@RestControllerAdvice注解声明,然后可以在类中写异常处理的方法,并通过@ExceptionHandler注解声明要拦截什么样的异常,可以针对不同的异常做不同的处理,下面示例是直接将所有的异常捕获并统一处理。

@RestControllerAdvice
public class UnifiedExceptionHandle {@ExceptionHandler(Exception.class)public R handleException(Exception e){e.printStackTrace();return R.fail("服务器故障!");}
}

相关文章:

【案例篇】 实现简单SSM工程-后端

简介 本篇文章将带你从0到1的实现一个SSM项目&#xff0c;通过此案例可以让你在项目中对SpringBoot的使用有一个更加详细的认识&#xff0c;希望这个简单的案例能够帮到你。文章内容若存在错误或需改进的地方&#xff0c;欢迎大家指正&#xff01;若对操作有任何疑问欢迎留言&a…...

零基础学习计算机网络编程----网络基本知识

目录 1. 计算机网络发展 1.1 网络发展 1.2 媒介 2 认识协议 2.1 为什么要有协议 2.2 协议的本质 3 网络协议的初识 3.1 什么是协议分层 3.2 为什么会有 4. OSI七层模型 4.1 定义 5. TCP/IP五层(或四层)模型 5.1 有什么 6. 网络传输基本流程 6.1 网络传输流程图…...

Zynq和Microblaze的区别和优势

Zynq芯片包含了一颗双核ARM Cortex-A9处理器&#xff0c;这是一颗“硬”处理器---它是芯片上专用 而且优化过的硅片原件。 MicroBlaze为“软”处理器&#xff0c;它是由可编程逻辑部分的单元组合而成的&#xff0c; 也就是说&#xff0c;一个 软处理器的实现和部署在FPGA的逻…...

FastAPI 支持文件下载

FastAPI 支持文件下载 FastAPI 支持文件上传 Python 获取文件类型 mimetype 文章目录 1. 服务端处理1.1. 下载小文件1.2. 下载大文件&#xff08;yield 支持预览的&#xff09;1.3. 下载大文件&#xff08;bytes&#xff09;1.4. 提供静态文件服务 2. 客户端处理2.1. 普通下载2…...

CNN卷积神经网络到底卷了啥?

参考视频&#xff1a;卷积神经网络&#xff08;CNN&#xff09;到底卷了啥&#xff1f;8分钟带你快速了解&#xff01; 我们知道&#xff1a; 图片是由像素点构成&#xff0c;即最终的成像效果是由背后像素的颜色数值所决定 在Excel中&#xff1a;有这样一个由数值0和1组成的66…...

vue中v-clock指令

基础 v-cloak 是 Vue 中的一个非常实用的指令&#xff0c;用于防止在 Vue 实例尚未挂载完成前&#xff0c;用户看到模板中的插值语法&#xff08;如 {{ message }}&#xff09;一闪而过。 ✅ 场景举例 你在页面还没加载完前&#xff0c;可能会看到这样一瞬间的内容&#xff…...

MIT 6.S081 2020Lab5 lazy page allocation 个人全流程

文章目录 零、写在前面一、Eliminate allocation from sbrk()1.1 说明1.2 实现 二、Lazy allocation2.1 说明2.2 实现 三、Lazytests and Usertests3.1 说明3.2 实现3.2.1 lazytests3.2.2 usertests 零、写在前面 可以阅读下4.6页面错误异常 像应用程序申请内存&#xff0c;内…...

C++初阶-list的使用2

目录 1.std::list::splice的使用 2.std::list::remove和std::list::remove_if的使用 2.1remove_if函数的简单介绍 基本用法 函数原型 使用函数对象作为谓词 使用普通函数作为谓词 注意事项 复杂对象示例 2.2remove与remove_if的简单使用 3.std::list::unique的使用 …...

PHP序列化数据格式详解

PHP序列化数据格式详解 概述 PHP序列化是将PHP变量&#xff08;包括对象&#xff09;转换为可存储或传输的字符串表示形式的过程。了解这些序列化格式对于数据处理、调试和安全性分析非常重要。本文将详细介绍PHP中各种数据类型的序列化表示方式。 基本数据类型序列化格式 …...

如何优化 MySQL 存储过程的性能?

文章目录 1. 优化 SQL 语句避免全表扫描减少子查询&#xff0c;改用 JOIN避免 SELECT 2. 合理使用索引3. 优化存储过程结构减少循环和临时变量避免重复计算 4. 使用临时表和缓存5. 优化事务处理6. 分析和监控性能7. 优化数据库配置8. 避免用户自定义函数&#xff08;UDF&#…...

深度学习:损失函数与激活函数全解析

目录 深度学习中常见的损失函数和激活函数详解引言一、损失函数详解1.1 损失函数的作用与分类1.2 回归任务损失函数1.2.1 均方误差&#xff08;MSE&#xff09;1.2.2 平均绝对误差&#xff08;MAE&#xff09; 1.3 分类任务损失函数1.3.1 交叉熵损失&#xff08;Cross-Entropy&…...

【大前端】Node Js下载文件

NodeJs 获取远程文件有很多方式&#xff0c;常见的方式有以下两种&#xff1a; - fetch&#xff08;原生&#xff09; - axios&#xff08;插件&#xff09; 通过 Fetch 下载文件&#xff0c;代码如下&#xff1a; import fs from node:fsfunction main(){fetch(http://xxx.x…...

自训练NL-SQL模型

使用T5小模型在笔记本上训练 nature language to SQL/自然语言 转SQL 实测通过。 本文介绍了如何在笔记本上使用T5小模型训练自然语言转SQL的任务。主要内容包括:1) 创建Python 3.9环境并安装必要的依赖包;2) 通过Hugging Face镜像下载wikisql数据集和T5-small模型;3) 实现…...

创新点!贝叶斯优化、CNN与LSTM结合,实现更准预测、更快效率、更高性能!

能源与环境领域的时空数据预测面临特征解析与参数调优双重挑战。CNN-LSTM成为突破口&#xff1a;CNN提取空间特征&#xff0c;LSTM捕捉时序依赖&#xff0c;实现时空数据的深度建模。但混合模型超参数&#xff08;如卷积核数、LSTM层数&#xff09;调优复杂&#xff0c;传统方法…...

【Flutter】创建BMI计算器应用并添加依赖和打包

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍创建BMI计算器应用并添加依赖和打包。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下…...

【Linux 学习计划】-- 倒计时、进度条小程序

目录 \r 、\n、fflush 倒计时 进度条 进度条进阶版 结语 \r 、\n、fflush 首先我们先来认识这三个东西&#xff0c;这将会是我们接下来两个小程序的重点之一 首先是我们的老演员\n&#xff0c;也就是回车加换行 这里面其实包含了两个操作&#xff0c;一个叫做回车&…...

微服务的应用案例

从“菜市场”到“智慧超市”&#xff1a;一场微服务的变革之旅 曾经&#xff0c;我们的系统像一个熙熙攘攘的传统菜市场。所有功能模块&#xff08;摊贩&#xff09;都挤在一个巨大的单体应用中。用户请求&#xff08;买菜的顾客&#xff09;一多&#xff0c;整个市场就拥堵不堪…...

后端开发概念

1. 后端开发概念解析 1.1. 什么是服务器&#xff0c;后端服务 1.1.1. 服务器 服务器是一种提供服务的计算机系统&#xff0c;它可以接收、处理和响应来自其他计算机系统&#xff08;客户端&#xff09;的请求。服务器主要用于存储、处理和传输数据&#xff0c;以便客户端可以…...

2025网络安全趋势报告 内容摘要

2025 年网络安全在技术、法规、行业等多个维度呈现新趋势。技术上&#xff0c;人工智能、隐私保护技术、区块链、量子安全技术等取得进展&#xff1b;法规方面&#xff0c;数据安全法规进一步细化&#xff1b;行业应用中&#xff0c;物联网、工业控制系统安全升级&#xff0c;供…...

云原生安全基石:深度解析HTTPS协议(从原理到实战)

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念&#xff1a;HTTPS是什么&#xff1f; HTTPS&#xff08;HyperText Transfer Protocol Secure&#xff09;是HTTP协议的安全版本&#xff0c…...

Autodl训练Faster-RCNN网络--自己的数据集(一)

参考文章&#xff1a; Autodl服务器中Faster-rcnn(jwyang)复现(一)_autodl faster rcnn-CSDN博客 Autodl服务器中Faster-rcnn(jwyang)训练自己数据集(二)_faster rcnn autodl-CSDN博客 食用指南&#xff1a;先跟着参考文章一进行操作&#xff0c;遇到问题再来看我这里有没有解…...

python打卡day36

复习日 仔细回顾一下神经网络到目前的内容&#xff0c;没跟上进度的补一下进度 作业&#xff1a;对之前的信贷项目&#xff0c;利用神经网络训练下&#xff0c;尝试用到目前的知识点让代码更加规范和美观。探索性作业&#xff08;随意完成&#xff09;&#xff1a;尝试进入nn.M…...

8.Java 8 日期时间处理:从 Date 的崩溃到 LocalDate 的优雅自救​

一、被 Date 逼疯的程序员&#xff1a;那些年踩过的坑​ 还记得刚学 Java 时被Date支配的恐惧吗&#xff1f;​ 想获取 "2023 年 10 月 1 日"&#xff1f;new Date(2023, 9, 1)—— 等等&#xff0c;为什么月份是 9&#xff1f;哦对&#xff0c;Java 的月份从 0 开…...

基于Python的全卷积网络(FCN)实现路径损耗预测

以下是一份详细的基于Python的全卷积网络(FCN)实现路径损耗预测的技术文档。本方案包含理论基础、数据生成、模型构建、训练优化及可视化分析,代码实现约6000字。 基于全卷积网络的无线信道路径损耗预测系统 目录 问题背景与需求分析系统架构设计合成数据生成方法全卷积网络…...

【ubuntu】安装NVIDIA Container Toolkit

目录 安装NVIDIA Container Toolkit 安装依赖 添加密钥和仓库 配置中国科技大学&#xff08;USTC&#xff09; 镜像 APT 源 更新 APT 包列表 安装 NVIDIA Container Toolkit 验证安装 重启docker 起容器示例命令 【问题】如何在docker中正确使用GPU&#xff1f; 安装…...

Paimon和Hive相集成

Flink版本1.17 Hive版本3.1.3 1、Paimon集成Hive 将paimon-hive-connector.jar复制到auxlib中&#xff0c;下载链接Index of /groups/snapshots/org/apache/https://repository.apache.org/snapshots/org/apache/paimon/ 通过flink进入查看paimon /opt/softwares/flink-1.…...

精益数据分析(74/126):从愿景到落地的精益开发路径——Rally的全流程管理实践

精益数据分析&#xff08;74/126&#xff09;&#xff1a;从愿景到落地的精益开发路径——Rally的全流程管理实践 在创业的黏性阶段&#xff0c;如何将抽象的愿景转化为可落地的产品功能&#xff1f;如何在快速迭代中保持战略聚焦&#xff1f;今天&#xff0c;我们通过Rally软…...

HarmonyOS 鸿蒙应用开发进阶:深入理解鸿蒙跨设备互通机制

鸿蒙跨设备互通&#xff08;HarmonyOS Cross-Device Collaboration&#xff09;是鸿蒙系统分布式能力的重要体现&#xff0c;通过创新的分布式软总线技术&#xff0c;实现了设备间的高效互联与能力共享。本文将系统性地解析鸿蒙跨设备互通的技术架构、实现原理及开发实践。 跨设…...

Vue.js教学第十五章:深入解析Webpack与Vue项目实战

Webpack 与 Vue 项目详解 在现代前端开发中,Webpack 作为最流行的模块打包工具之一,对于 Vue 项目的构建和优化起着至关重要的作用。本文将深入剖析 Webpack 的基本概念、在 Vue 项目中的应用场景,并详细讲解常用的 Webpack loaders 和 plugins 的配置与作用,同时通过实例…...

深入浅出 Python Testcontainers:用容器优雅地编写集成测试

在现代软件开发中&#xff0c;自动化测试已成为敏捷开发与持续集成中的关键环节。单元测试可以快速验证函数或类的行为是否符合预期&#xff0c;而集成测试则确保多个模块协同工作时依然正确。问题是&#xff1a;如何让集成测试可靠、可重复且易于维护&#xff1f; 这时&#…...