项目
父工程为pom类型,管理依赖的版本和存放公共的依赖。(只要一个模块下面有子模块,则当前模块为pom类型)
子模块中引入具体的依赖,在子模块的子模块中编写具体代码模块。
配置文件
mybatis_plus提供了代码生成器模板
mybatis_plus提供的代码生成器需要引入相关依赖,即velocity依赖
//controller:通过service接口来控制业务流程,同时也接收前端的请求,controller中引入service借口
//controller:控制器,将注解的部分交给spring管理,responseBody作用是将返回的数据结构转换为json格式
@RestController//当前注解=@controller+@responseBody:是这两个注解的和,这里采用前后端分离方式,
// 不用模板渲染,直接使用restcontroller将数据以json格式传给前端
(1)controller中注入service接口
(2)service中注入mapper接口
(3)mapper接口,操作数据库,
(4)entity:实体类:和数据库的属性保持一直
注意:在mybatis_plus中对mapper和service都做了封装
例如serviceImpl也是mybatis_plus中的方法
在service调用mapper过程也做了封装,在serviceImpl中注入了baseMapepr,通过@Autowired注解
mybatis_plus对mapper和service都做了封装,同时在serviceImpl类中通过注解注入了mapper
这里serviceImpl类中通过@Autowired注解注入了BasedMapper,
因此在controller中注入service就行,而service注入mapper已经做了
流程:
代码生成器:生成代码和相应的包等——在controller中注入service,因此service、mapper在mybatis_plus中都封装了,所以直接调用——通过service调用方法,查看结果——编写配置文件:数据库,开发环境,端口号,mybatis日志——创建启动类——由于mapper是个接口,没有实现类,需要通过注解扫描引入mapper——创建配置类,在配置类中引入注解,同时加上mapper的包名,即他的位置——项目启动起来,使用端口号8001;
@recontroller注解将json格式的数据传送给前端,由于json格式的数据中的时间时带有时区的世界标准时间,格林尼治时间,而我们是东八区,相差八个小时,因此在配置文件中做处理
这里是基于注解式的配置,相当于基于xml的配置
逻辑删除讲师
1、在配置类中添加逻辑删除插件
2、在相应的实体类的属性上添加逻辑删除注解
3、在controller中编写逻辑删除讲师的方法
![在这里插入图片描述](https://img-blog.csdnimg.cn/5d058cb92e8943fb8f287d15124a7596.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dkZzA4MDk=,size_16,color_FFFFFF,t_70)
swagger
REST风格:Representational State Transfe表现层状态转移
swagger生成一个在线接口文档,方便测试
1、swagger具体使用:放在父工程中,以供所有模块使用
2、在service_base中创建配置类
3、在service中的pom文件中添加依赖
由于swagger配置类和教师管理模块service_edu不在一个模块下,怎么实现调用?
在service模块中引入service_base依赖,即在service_edu的父模块中的pom文件中添加service_base依赖
4、在service_edu启动类中添加注解,进行组件扫描
如果不添加扫描规则,默认只扫描当前模块的配置类
当添加之后,在指定包中进行扫描
5、访问swagger
通过指定网址进行访问swagger:http://localhost:8001//swagger-ui.html
为了方便看swagger,加一些注解
统一返回数据格式:
使得接口返回数据格式一样,将所有接口返回的数据格式统一
json数据格式有两种:
数组 对象,一般是两者或者使用
对象+数组
同时这个数据是所有模块都要使用的,因此放在公共模块中
定义接口:存放状态码
定义统一结果返回类
在创建完统一结果返回类之后,在之后的结果统一使用这种返回数据格式:
第一个步:在service中pom中引入common_utils相关依赖
第二步:将接口中的方法的返回结果都是R类型,即统一数据结果返回类
讲师分页功能
第一步:在配置类中加入分页插件
第二步:编写讲师分页查询接口中的方法
多条件组合查询带分页
第一步:将前端传入的条件值传递到接口中:
具体:吧条件值封装到对象里面,吧对象传递到接口里面
即创一个vo类,专门封装条件值
在实体包中创建一个vo包,创建一个类封装这个条件值
第二步:构造条件:
1、这里需要注意加了@RequsetBody(required= false)注解,表示使用json格式传递数据,吧json格式的数据封装到对应的对象中,false表示这个对象可以没有、
2、当使用requestBody是,此时的提交方式不在get提交,而是post提交
测试的时候,输入的数据为json格式
讲师添加
第一步:自动填充
在实体类中,使用@TableField(fiill = FieldFill.INSERT)注解对自动填充的属性进行注解,
第二步:因位自动填充可以看成公共的,其他方法也用,所以在common模块下的service—base模块中创建一个自动填充类,实现MetaObjectHandler接口,在实现类中重写插入填充和修改填充两个方法
3、在controller接口中编写讲师添加接口方法
讲师修改
第一步:查询修改讲师的ID,这里通过路径传递,id通过路径获取
@PathVariable 获取路径中id值
第二步:修改讲师
这里用对象传,使用@RequestBody 使用json格式传递数据,将数据封装给后面的对象,此时的提交方式是post
注意这部分在测试的时候,id要确定,创建时间和修改时间去到,因为是自动填充
统一异常处理
一全局异常处理
因为所有模块都用到,所以放到公共模块中
这里是针对所有异常进行的处理
二、特殊异常处理
//对于既有全局异常处理又有特定异常处理,首先执行特定异常处理,如果特定异常没有,在执行全局异常处理
三、自定义异常处理
第一步:创建一个自定义异常类,让其继承RUNtimeException异常,由于所有模块都会用到,所以放到common模块中的service_base模块中
第二步:在自定义异常类中写相关属性,例如状态码,提示信息。
这里用到三个注解
@Data:通过lombok插件自动生成set 、get方法
@AllArgsConstrutor生成有参数构造器
@NoArgsConstrutor 生成无参数构造器
第三步:在同一异常处理类中添加自定义异常处理方法
第四步://由于自定义的异常不是系统自带的,系统不会自动抛出自定义的异常,需要我们手动抛出自定义的异常,在controller中的对应可能出行异常的地方抛出异常,捕获异常,这里需要手动抛出异常
日志
一、日志的级别
日志的级别有:OFF、FATAL、ERROR 、 WARN、 DEBUG 、 INFO、ALL,
日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出
基本的四个:ERROR、 WARN 、DEBUG 、INFO
日志工具logback
这里不仅吧日志输出到控制台,也要输出到文件,则需要使用logback日志工具
步骤:
第一步:将配置文件application.properties中的所有日志文件去掉,例如日志级别,包含mybatis_plus日志
第二步:在resource下创建logback-spring.xml文件
这个文件是固定的模板,看懂就行
如果程序出现异常,将异常添加到文件中去
第一步:在全局异常处理类中加注解@Slf4j
第二步:在具体的异常中将异常信息放入日志中