一周Spring Boot + VUE入门(5)-- CRUD 后端代码分析

后端代码分析

详细的代码分析还是参考RuoYi的官方文档介绍 | RuoYi,非常详细。局部细节不了解,可以百度,网上有很多RuoYi的技术问题解答,我也是经常看RuiYi的技术文档,每看一次都有不同的感觉。

但是作为入门系列,我们还是想从一个入门者的角度来分析一下生成的CRUD代码,以免让你陷入众多的知识中,茫然不知所措。我们的原则还是先入门,其他的只能靠“做中学”来慢慢拓展。一口吃个大胖子不太可能。

我们先 看生成的代码的结构,打来Idea,点开我们的student

 先看看src源代码下面生成的代码。还记得我们在代码生成界面设置的包是com.ruoyi.student,所以这里的文件都生成到com/ruoyi/student/这个目录下了。

业务逻辑

按照Spring Boot的数据处理的业务逻辑,各个目录的顺序是这样的
Controller-->service接口-->serviceImpl-->mapper-->mapper.xml --> 数据库

Controller (控制器)目录

ontroler目录下的文件最大的作用就是负责同前端的数据交互,类似整个系统的收发室,前端传递过来数据后,整体接收数据,然后把数据传递给Service类进行处理,返回数值后再通过这里反馈给前端。

由于项目的controller集中在ruoyi-admin模块中,因此我们看一下我们的controller中的文件

 打开studentController文件,

前面的 @RequestMapping 来映射请求,也就是通过前端访问/student/student/目录,会根据这个目录下面的子目录处理。

@GetMapping是一个组合注解,是@RequestMapping(method = RequestMethod.GET)的缩写.该注解将HTTP Get 映射到 特定的处理方法上

例如,如果前端访问的是后端的/student/student/list/这个目录,是用get方法提交的这个访问(有关get,post等方法可以查看HTTP 方法:GET 对比 POST | 菜鸟教程),那么就由list这个方法来接收和处理,数据接收进student变量,然后调用studentService中的selectStudentList方法来处理接收到的数据,括号中的student变量已经是里面有数据的变量了。这个数据是前端传过来的查询条件,例如姓名叫什么,专业是什么等条件。这个list就是service执行后从数据库查询出来的数据了,然后用getDataTable把数据规范化成前端要求的JSON格式的数据。有关JSON,查看JSON 简介 | 菜鸟教程

这是数据查询,就是从前端查询条件页面接收输入的查询条件,然后通过service获得符合条件的数据,在规范化成JSON数据格式,反馈给前端页面。其他处理方法类似,可以自己分析。

domain目录

刚才我们接收前端来的数据的时候,用的变量是student,这个变量不是存储的一个数据,而是一组数据,这个就是定义在domain目录下的student。

domain这个目录存放实体的类,类中定义了多个类属性,并与数据库表的字段保持一致。当然还可以自己拓展。 主要用于定义与数据库的表对应的属性,提供get/set方法,tostring方法,有参无参构造函数。

这段话比较专业,通俗的解释就是,如果你负责让学生信息的统计和管理,你是说帮我填写以下你的学号,姓名,专业...,不仅麻烦,而且万一哪次通知了多说了,或者少说了几项,还造成数据错误。所以另外一种方式是你把这些信息整体做成一张表,给别人的时候就说麻烦填写一下这张学生信息统计表,这样你发出去的空表和收回来的填写好数据的表都是一个格式的,里面的栏目页都是统一的,是否更方便有效?

domain里面的文件就是起到这个作用。系统自动生成的时候会同数据库里面的表对应,你可以根据需要拓展。另外,里面的get方法是取出某一个项的数值,set是设置里面某一个项的数值。toString方法用于返回以一个字符串表示的各项的值,便于把所有项数据以字符串形式传递给前端。

打开domain下的student文件,可以看到定义了我们数据库表student对应的各个变量

 下面是对应各个变量的get和set方法,用户设置和读取各个变量的数值

 最后是toString(),用于将各个变量连接成一个字符串。

 Service目录

service目录是对业务进行处理的核心目录。controller接收到前端发送来的数据后,传递给service,由service对数据进行处理,例如查询功能,service需要将查询条件组合成查询的SQL语句,然后提交给数据库,并把结果反馈给controller。

实际上service目录中的文件并不执行具体的处理任务,只是接口定义。具体的任务是由service目录下的impl目录中的文件执行的。

为什么需要定义接口,不直接编写业务执行的类呢?这个涉及到宏观到围观的理念,举个例子就明白了。

例如放假了,你要过个暑假规划,好好享受一下你的假期。你不会一下就想我去乌镇的河边喝茶坐坐然后喝酒吃肉串这么细节性的规划。你肯定要先做宏观的旅游规划,乌镇几天,西塘几天,然后再详细实施方案,例如,乌镇这几天住在哪里,白天去哪里,晚上去哪里。如果你的计划有变,例如晚上住的酒店变化了,只修改具体的执行方案就行,不用动总体的框架。

service中的接口就是定义这个业务处理的大的框架。然后具体每个接口的实现,是在impl目录中具体实现的。

 例如,我们的接收条件数据查询符合条件的数据这个业务操作就是先在service中定义一个接口(interface)

public List<Student> selectStudentList(Student student);

输入的数据是接收的前端的数据块 ,数据类型是domain中的Student,然后由处理方法selectStudentList实现,返回的结果是以Student对象为单位的多行的数据List。

然后,具体的实现是在impl中。在impl中,定义了具体的实现类 StudentServiceImpl 实现 IStudentService定义的各个接口。

 例如,我们的接收前端的条件查询符合条件的数据的处理就是 在方法

@Override
public List<Student> selectStudentList(Student student)
{
    return studentMapper.selectStudentList(student);
}

中实现,实现的方法是调用studentMapper中的selectStudentList方法,这个方法是调用student.xml中的具体的SQL语句,到数据库执行SQL语句,然后返回结果。

mapper目录

mapper是mybatis需要的映射。通过mapper映射,service可以灵活调用mapper中的方法,将各个SQL语句作为一个整体进行调用,非常方便。

 例如,我们的接收条件查询SQL语句,就是通过mapper中的

public List<Student> selectStudentList(Student student);

实现的。这里Mapper会调用student.xml对应的名称叫selectStudentList的那个SQL语句块

resources目录下的mapper目录

这里存储mapper对应的mybatis需要的所有SQL语句

代码免不了需要执行SQL语句同数据库交互完成增删查改,如果程序的代码同SQL混在一起,程序就会非常不方便修改和维护。mybatis将SQL语句统一放置到resource目录下的mapper目录下,SQL配置文件用xml格式描述,可以配合mybatis的语法,完成功能丰富的SQL的拼凑,变量注入等操作。

 还是延续上面的,我们从前端接收条件数据,组成符合条件的SQL语句,然后去数据库执行查询。

我们看一下student.xml文件中,有一个select,其id对应mapper中的方法,参数类型表示接收的数据是student类型的,结果是上面定义的studentResult类型。

然后下面这个include是包含了上面的通用的查询语句的select 部分,下面的where部分是分别判断接收的前端的数据,如果姓名,或者出生年月,或者专业有数据,则添加到where中,否则就不添加。t通过mybatis语法,构建了对应查询selectStudentList的SQL语句。

当service执行到这里时,会根据接收到的条件语句构建动态的SQL语句,并连接数据库执行,再把结果返回service,进一步返回controller,然后通过controller返回前端,由前端页面显示。

看到这里,你再返回去本文的 头部,看看业务逻辑部分那张图,是否更清楚一些后端处理业务的逻辑顺序了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值