尝试用java spring boot+VUE3实现前后端分离部署(8/31)

news2025/1/11 14:59:44

前言

        这几天开学了,公司这边几个和学校对接的项目都挺忙的,然后我又开始有点闲的情况了。问大佬能不能继续看看若依的项目,大佬让我自己去学了。在看若依的项目的时候在想,python的FLASK后端实现和JAVA spring boot的实现差别大不大,两者实现的思路估计大差不差,那具体的代码逻辑和代码实现又有多大差别,java面向对象的编程思想又是怎么体现的。这些想法迫使我将原来使用FLASK实现的后端功能通过java spring boot实现。

        首先,笔者之前没有太多的java基础,唯一基础还是看到head first 的java,所以在进行项目实现的开始前又过了一遍,然后兴致勃勃的寻找教程开始当码农,然后直接痛苦面具!第一,那本书的java版本太低了,新版本的很多特性并不涉及;其次,缺少对java设计模式的讲解,(虽然head firsr有这本书,但是我没看)导致我直接大眼瞪小眼。

(ai镇楼图)

他山之石(vue+springboot开发)

        这里引用的是大佬的 这里我们把重点放在一开始spring boot的项目创建上,这里的VUE3相关内容先简单过一遍就好(和FLASK与VUE3的打通大差不差,而且这位大佬的这个系列也有讲相关的知识),重点放在他教程中的这四个文件夹

        因为笔者学艺不精,这些接口以及反射等相关知识,狠狠地我的脑子创进了下水道中。

bean文件(User类)

        首先在bean文件下,存放的数据容器的样板,这个类实现了对未来数据库进行操作时提供新建类以及相应的对象,而且在未来对数据库进行增删改的操作中,缺少了相应的构造函数,注意增加新的空构造器以及相应带参数构造器。(快捷键,你的码农好帮手)。

        这里我当时遇到了一个坑,就是方法命名的问题,当时类似的命名为getPassWord,结果发现通过annotation的java包实现json转换后,前端接收的json中出现的id是passWord而不是password,这也导致后来对数据库修改出现了相应的问题。

 对于其他文件

        其他文件的处理我都是通过寻找导入文件的逻辑处理的。我们可以发现,每一个软件包下面的java文件,都通过package命令进行了打包,而又从每一个文件import导入本地java的过程中,我们可以反推service这个文件夹下的UserService这个java文件,以及同一个service包的UserServiceImpl.java。通过这些我们就找到最为独立的java文件,UserMapper.java接口。

UserMapper.java

        在这个代码中,我们可以看到,使用了@Mapper这个注解标记该接口,使其成为一个 MyBatis 的 Mapper 接口。那么,MyBatis是什么,注解又是什么呢?

        首先,我个人的理解,注解就是一个规则,即是给人看的,也是编译程序看到。

而MyBatis是一个半自动的持久层框架,它提供了一种称为SQL映射的方式来简化数据库操作。也就是规范化的调用,加入正确的参数,实现sql语句的实现。

 

         首先,这段代码用interface关键字告诉编译器,这是一个接口,表明这个类的内容为各种方法,这里的@select也是一个注解,点开注解内容,我们可以看到

         他要求了使用该注解需要名字里面包含字符串,这些字符串其实就是对应对的sql语言和数值,这里就可以看出注解更像一种规则,给不同的方法都加上注解后,就要求该方法实现不能缺少这些内容,相当于做了限制,限制是为了以后更好的统一化调整。

         "select","from user",对应String[] value();而剩下的就是databaseId()。而我们一开始导入的@Mapper提供了使用 MyBatis 的参数替换功能,#{} 表示方法参数中对应属性的值。通过这个可以实现对数据库数据的增加。这里的注解都为了定义生成相关函数时应确保有这些内容而非其他的东西,他像一个表格,使用了select注解的函数,都应该确保内部有这些内容。(注解一般与反射一同使用,实现半动态的软件效果){(遵循控制反转(Inversion of Control,IoC)原则:Spring容器控制对象的创建和生命周期,以及它们的依赖关系,而不是由对象自己控制。)(这里使用的接口通过Spring AOP或MyBatis与实体对象相关联,创建一个实现了接口的代理对象,这个代理对象在内部委托给实际的实现类。)}(建议上网看看spring boot 和 反射和注解,我是觉得我讲得挺乱的,大概就是注解创建锚点和定义规则,反射就可以爬回去锚点修改内容)

         从这个文件看下来,这里就是方法的定义。

UserService.java和UserServiceImpl.java

        而根据顺序,我们就会来到Service软件包了,其中的UserService.java,很显然,就是方法的声明,并创建了一个接口,而另一个文件UserServiceImpl.java其实就是方法的实现,而我们也会看到

@Autowired
private UserMapper userMapper;
  • @Autowired:告诉Spring容器,当创建这个类的实例时,自动提供一个 UserMapper 类型的依赖。Spring会查找容器中定义的bean,找到匹配 UserMapper 类型的bean,并将其注入到这个字段中(UserMapper类里开头import了bean)。

  • private UserMapper userMapper;:声明了一个名为 userMapper 的私有成员变量,类型为 UserMapper。这个变量将被用来访问数据库操作,通常定义了一些方法来执行对数据库的查询和更新等操作。

        简而言之,这行代码的作用是让Spring容器自动提供一个 UserMapper 的实现,并将其设置为当前类的 userMapper 成员变量,而一般情况下,接口是不能实例化,但这里运用了装载实现类,而其实通过MyBatis注解也会实现这个效果。

        我们也会在usercontroller文件里面看到类似的自动装载

UserController.java

         这里主要实现的就是,对前端传来的url请求进行处理,例如下面这个方法就是原代码user/下的/selectAll前缀对应的执行命令,

@RequestMapping(value = "/selectAll", method = RequestMethod.POST)
public List<User> selectAll() {
    return userService.selectAll();
}

        @RequestMapping 注解在Spring MVC中用来映射HTTP请求到控制器的处理方法上。它本身并不创建或发送消息体,而是作为一个映射器,告诉Spring框架当特定的HTTP请求到达时,应该由哪个方法来处理这个请求。这里则是通过调用List<User> selectAll()函数,进行功能的实现,总的来说就是首先在UserService上声明方法,在UserMapper定义方法,在UserServiceImpl中通过调用userMapper覆写,实现selectAll()方法的相关方法,最后还会在usercontrol调用user service软件包提供方法,在这个方法上增加功能或直接调用方法。

其他

 注意:

  • 接口文件仅定义了方法的签名,即方法的名字、返回类型和参数列表,但不提供实现细节。
  • 接口可以被看作是一个合同,规定了实现类必须遵守的规则和提供的方法。(9/1)

        所以我们会看到许多同一命名的方法,但是这些方法都是位于接口的,而且通过装载其他接口丰富方法内容。

        但是!我们会发现usercontroller和userservicelmpl也有同样的方法。

那么为什么两者都有selectAll()?

  • 职责分离UserControllerselectAll() 方法处理HTTP请求和响应,而 UserServiceImplselectAll() 方法处理业务逻辑。这种分离使得代码更加模块化,易于维护和测试。
  • 重用和解耦:通过在 UserService 中定义 selectAll() 方法,可以在多个控制器或业务逻辑组件中重用相同的业务逻辑,而不需要重复实现相同的逻辑。
  • 灵活性:如果未来需要更改业务逻辑,只需在 UserServiceImpl 中修改即可,而不需要修改控制器层的代码。这使得代码更加灵活,易于适应需求变化。

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

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

相关文章

通过指令微调提升语言模型性能

人工智能咨询培训老师叶梓 转载标明出处 如何让机器更好地理解和执行人类的指令一直是一个重要课题。Google的研究团队中提出了一种新的方法&#xff0c;通过指令微调&#xff08;instruction finetuning&#xff09;来提升语言模型的性能和泛化能力。 他们主要研究了如何通过…

美食|基于SpringBoot+vue的美食网站(源码+数据库+文档)

美食网站 基于SSMvue的美食网站 一、前言 二、系统设计 三、系统功能设计 系统功能实现 后台模块实现 管理员模块实现 用户模块实现 餐厅模块实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&…

JavaScript拷贝的艺术:玩转深拷贝和浅拷贝

前言 在实际的项目开发中&#xff0c;我们时刻都在使用数据拷贝功能&#xff0c;赋值、深拷贝和浅拷贝是前端开发中常见的概念&#xff0c;用于复制简单数据类型&#xff08;字符串、数值、布尔值&#xff09;和引用类型&#xff08;对象、数组&#xff09;。它们的主要区别在…

第十六篇:走入计算机网络的传输层--传输层概述

1. 传输层的功能 ① 分割与重组数据 一次数据传输有大小限制&#xff0c;传输层需要做数据分割&#xff0c;所以在数据送达后必然也需要做数据重组。 ② 按端口号寻址 IP只能定位数据哪台主机&#xff0c;无法判断数据报文应该交给哪个应用&#xff0c;传输层给每个应用都设…

中小型局域网组网规划与实施

一、绪论 1.1 背景 本课题以中小型企业网络搭建为背景&#xff0c;实现网络规划与设计和模拟。该企业网有四个部门&#xff0c;人力部、研发部、市场部和财务部&#xff0c;不同部门分别划分VLAN&#xff0c;不同VLAN之间分配不同的IP地址段。内外网之间要互通。 1.2 发展趋势…

关于前端分辨率兼容和显示器缩放兼容的处理

如下图所示&#xff0c;我们的电脑屏幕可以进行缩放&#xff0c;和分辨率的切换。 我们在项目开发中&#xff0c;时常需要适配不同的分辨率。 一般来说&#xff0c;开发人员电脑分辨率显示正常的页面&#xff0c;只会在更小的分辨率尺寸中出现问题。 所以当测试人员给我们提分…

QT项目实战之音乐播放器2.0版本

该版本相较于1.0版本最主要的不同在于连接数据库实现类似于歌曲收藏和取消收藏的功能。 详细情况看我的这篇文章http://t.csdnimg.cn/WS5s8。 效果展示 VSMyMusicShow2.0 define.h UseMySQL.h musicInfo.h VSMyMusicPlayer.h

出现 /www/server/mysql/bin/mysqld: Shutdown complete 的解决方法

目录 1. 基本知识1.1 查找my.cnf目录1.2 配置错误日志2. 问题所示3. 原理分析4. 解决方法1. 基本知识 主要补充一些基本知识的拓展 1.1 查找my.cnf目录 查看mysql默认读取my.cnf的目录: mysql --help|grep my.cnf 截图如下:(为了方便查看具体使用的配置文件在哪个路径)…

2024/9/6黑马头条跟学笔记(三)

D3 内容介绍 jdk8新特性&#xff0c;stream流&#xff0c;lambda表达式 ​ 自媒体前后端搭建 步骤 sql—— 实体—— 微服务拷贝&#xff0c;配置nacos—— spring:datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://192.168.233.136:3306/leadnews_…

拥有一个能倾听你心声的「微信AI小助理」,是一种什么体验?

前两天&#xff0c;搞了个微信 AI 小助理-小爱(AI)&#xff0c;爸妈玩的不亦乐乎。 零风险&#xff01;零费用&#xff01;我把AI接入微信群&#xff0c;爸妈玩嗨了&#xff0c;附教程&#xff08;上&#xff09;零风险&#xff01;零费用&#xff01;我把AI接入微信群&#x…

解决Django会话中的竞态条件

Django 会话中的竞态条件&#xff08;race condition&#xff09;问题通常发生在多个请求几乎同时修改同一个会话数据时&#xff0c;导致数据丢失或数据不一致。这种情况在需要频繁更新会话数据的场景&#xff08;如实时聊天应用、并发请求处理等&#xff09;中尤为常见。 1、问…

一次性解决 | 网站被提示“不安全 ”

当网站被提示“不安全”时&#xff0c;这通常意味着用户的个人信息、登录凭证和其他数据可能面临风险。为了一次性解决这个问题&#xff0c;可以从一下方面入手。 一、检查并启用HTTPS协议 检查URL&#xff1a;确保网站地址以“https”开头&#xff0c;而非“http”。HTTPS协议…

Java项目: 基于SpringBoot+mybatis+maven学科竞赛管理系统(含源码+数据库+毕业论文)

一、项目简介 本项目是一套基于SpringBootmybatismaven学科竞赛管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简…

[Redis] 分布式系统与Redis介绍

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

研1日记6

1. 一般输入参数为batch_sizenum_featuresheightwidth 当高度和宽度不一样时&#xff0c;分别计算即可。 2.ReLU函数的表达式为&#xff1a;f(x) max(0, x)。 3.Pytorch中最大池化层Maxpool的作用说明及实例使用&#xff08;附代码&#xff09;-CSDN博客 4.假设x的形状是(A…

设计模式 第一次复学

创建者模式 单例模式&#xff08;Singleton Pattern&#xff09; 单例模式&#xff08;Singleton&#xff09;确保某一个类只有一个实例&#xff0c;而且自行实例化并向整个系统提供这个实例。 单例模式实现分为两种饿汉式和懒汉式&#xff0c;即创建时机&#xff0c;一个是类…

衡石分析平台使用手册-系统指引

首页​ 首页是用户进入衡石系统后的第一个页面&#xff0c;这里汇聚了平台最新动态信息、行业模板案例、用户的操作记录等&#xff0c;引导用户快速方便地使用平台功能。 首页包括以下版块&#xff0c;可以帮助用户继续之前的工作&#xff0c;开启新的工作&#xff0c;使用内置…

Spire.PDF for .NET【文档操作】演示:创建 PDF 文档

通过代码创建 PDF 文档具有多种优势。例如&#xff0c;您可以轻松合并动态内容&#xff0c;如用户输入、数据库记录或实时数据。基于代码的 PDF 生成允许更大的自定义和自动化&#xff0c;最大限度地减少创建高度定制文档时的手动干预。在本文中&#xff0c;您将学习如何使用Sp…

A*(A star)搜索算法

A*搜索算法是一种启发式算法&#xff0c;利用现有的信息进行搜索的一种方法。 首先&#xff0c;定义横纵相邻方格之间的距离为10&#xff0c;对角相邻方格的距离为14&#xff08;本文设定可以向8个方向前进&#xff0c;也可以根据需求设置为4个&#xff0c;比如只能横纵相邻方格…

简单的spring batch学习

前言 公司批量任务是数据库执行的&#xff0c;想修改成java执行批量任务&#xff0c;所以简单了解了下springbatch批量任务框架&#xff0c;此处是其学习笔记&#xff0c;具体学习视频地址为bilibili springbatch&#xff0c;以下为其学习笔记内容以及源码信息 一、课程目标 …