SSMP框架业务层和表现层快速开发
本章节基于SSMP框架实现业务层和表现层的快速开发
文章目录
前言
本章节接着上一章实体类和数据层编写完毕后继续编写业务层和表现层。
下面是上章节的链接
实体类和数据层快速开发
快速了解什么是业务层和表现层
业务层
Service层主要负责业务模块的逻辑应用设计。可以细分为service接口和serviceImpl实现类。首先设计接口,再设计其实现的类;接着再Spring的配置文件中配置其实现的关联。这样我们就可以在应用中调用Service接口来进行业务处理;Service层的业务实现,具体要调用到已定义的DAO层的接口;封装Service层的业务逻辑有利于通用的业务逻辑的独立性和重复利用性,程序显得非常简洁。service层里面的方法相较于dao层中的方法进行了一层包装,例如通过id查找用户,通过用户名查找用户,是在基础的操作上又增加了一层包装的,实现的是相对高级的操作,最后将这些操作在serviceimpl类中实现。
表现层
Controller层负责具体的业务模块流程的控制。在此层里面要调用Service层的接口来控制业务流程;控制的配置也同样是在Spring的配置文件里面进行,针对具体的业务流程,会有不同的控制器。
总结各层之间的联系
DAO层,Service层这两个层次都可以单独开发,互相的耦合度很低,完全可以独立进行,这样的一种模式在开发大项目的过程中尤其有优势
Controller,View层因为耦合度比较高,因而要结合在一起开发,但是也可以看作一个整体独立于前两个层进行开发。这样,在层与层之前我们只需要知道接口的定义,调用接口即可完成所需要的逻辑单元应用,一切显得非常清晰简单。
Service逻辑层设计
Service层是建立在DAO层之上的,建立了DAO层后才可以建立Service层,而Service层又是在Controller层之下的,因而Service层应该既调用DAO层的接口,又要提供接口给Controller层的类来进行调用,它刚好处于一个中间层的位置。每个模型都有一个Service接口,每个接口分别封装各自的业务处理方法。
所以整体对象调用流程是
前端—》Controller—》Service—》Dao—》数据库
一、业务层的快速开发
IBookService接口
首先我们创建Service包,包下创建IBookService这个接口
这个接口继承IService(MyBatisPlus提供有业务层通用接口(ISerivce))
实现在通用类基础上做功能重载或功能追加,下面代码中我追加了自定义的四项功(CURD)
package com.jikebensan.book.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.jikebensan.book.domain.Book;
public interface IBookService extends IService<Book> {
//追加的操作与原始操作通过名称区分,功能类似
Boolean delete(Integer id);
Boolean insert(Book book);
Boolean modify(Book book);
Book get(Integer id);
}
那我们一起来看看这个继承的IService到底实现了什么功能
编写了很多数据操作的方法(批量插入,分页和复杂的条件查询)
看到了这中文注解,不得不称赞国产MP的强大,正是这些为技术钻研的人才简化了我们编程效率。
IBookServiceImpl实现类
编写完IBookService这个接口,我们继续编写这个接口对应的实现类。
在Service包下创建impl包,impl包中创建IBookServiceImpl类,这个类继承ServiceImpl<M,T>并且实现IBookService这个接口。
package com.jikebensan.book.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.jikebensan.book.dao.BookDao;
import com.jikebensan.book.domain.Book;
import com.jikebensan.book.service.IBookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class BookServiceImpl extends ServiceImpl<BookDao,Book> implements IBookService{
@Autowired
private BookDao bookDao;
//复写了这4种方法
@Override
public Boolean delete(Integer id) {
return bookDao.deleteById(id)>0;
}
@Override
public Boolean insert(Book book) {
return bookDao.insert(book)>0;
}
@Override
public Boolean modify(Book book) {
return bookDao.updateById(book)>0;
}
@Override
public Book get(Integer id) {
return bookDao.selectById(id);
}
}
其中ServiceImpl<M,T>我们查看源码发现他具体实现了ISerivce里面的抽象方法。
二、表现层开发
我们基于Restful进行表现层接口开发
首先我们先创建controller包,接着我们在此包下创建BookController类
package com.jikebensan.book.controller;
import com.jikebensan.book.domain.Book;
import com.jikebensan.book.service.IBookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/books")
public class BookController {
@Autowired//注入业务层bean
private IBookService iBookService;
@GetMapping//获取全部
public List<Book> getall(){
return iBookService.list();
}
@PostMapping//新增保存
public Boolean save(@RequestBody Book book){
return iBookService.save(book);
}
@PutMapping//修改信息
public Boolean update(@RequestBody Book book){
return iBookService.modify(book);
}
@DeleteMapping("{id}")//删除
public Boolean delete(@PathVariable Integer id){
return iBookService.delete(id);
}
@GetMapping("{id}")//根据id条件查询
public Book getbyid(@PathVariable Integer id){
return iBookService.get(id);
}
}
其中我们要注意的是
基于Restful进行表现层实现对数据库CRUD这些方法时,注释风格不同
新增: @PostMapping
删除: @DeleteMapping
修改: @PutMapping
查询: @GetMapping
而且在接收参数要注意写注释
实体数据:@RequestBody
路径变量:@PathVariable
测试
接下来我们编写一段测试代码测试一下我们刚刚编写的业务层和表现层是否搭建成功
我们就获取数据库中book表中的所有信息(MP自带的)
还有自己写的获取数据库book表中id为3号的所有信息(自己编写)
测试代码
package com.jikebensan.book;
import com.jikebensan.book.service.IBookService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class BookApplicationTests {
@Autowired
private IBookService iBookService;
@Test
void test1() {
iBookService.list();
}
@Test
void test2() {
iBookService.get(3);
}
}
测试结果
访问网页
控制台打印的日志:
这个book表中所有数据
id为3的数据
接下的文章我会继续更新基于SSMP框架后端与前端交互的文章和教学