• spring boot入门与理解MVC三层架构


    一、SpringMVC分层框架

    分层是为了实现“高内聚,低耦合”,把问题划分开来,各个解决,易于控制,延展和分配资源,最重要有利于后期维护项目;

    MVC指的是model,view,controller;

    在SpringMVC编程中一般分为四层:

    1.表示层:(jsp、html 主要就是界面的展示),负责前后端交互,接收前端发送的请求,然后调用service层,service层再返回数据给它,它再返回给前端。

    2.控制层:(Contoller、Action)控制界面跳转,负责前后端交互,接收前端发送的请求,然后调用service层,service层再返回数据给它,它再返回给前端。

    3.业务层:(Service)写主要的业务逻辑,调用DAO层,操作数据库,再对返回的数据进行各种业务上的处理,再返回给控制层。实现解耦合目的,虽然不要它也可以运行项目,但是会使项目后期的延展和维护变得困难

    4.持久层:(DAO)也叫数据访问层,实现对数据库的访问。完成增删改查功能,把数据返回给service层。

    5.实体层:(Model)数据库实体层,存放实体类,实现get、set方法。属性要和数据库的一样。

    二、注解的使用

    在SpringMVC中经常用到注解,使用注解可以极大的节省开发者的时间,下面是几个最重要的注解介绍:

    @Repository:标注数据访问层,可以告诉SpringMVC这是一个数据访问层,并将其申明为一个bean,例如UserDao接口的实现类UserDaoImpl,在类上加注解@Repository("userDao"),bean的名称为userDao

    @Service:标注业务层,例如UserService接口的实现类,在类上加@Service("userService"),bean的名称为userService

    @Controller:控制层,在控制层类上加@Controller即可,确认其是一个控制层类

    @Component:当不确定是属于哪层是用这个注解

    三、实践代码演示

    项目结构:

    (1) Model 层

    存放实体类,实现get、set方法,属性要和数据库的一样。

    1. //一个model对应一张表中的字段
    2. public class Student {
    3. private UUID id;
    4. private String name;
    5. public UUID getId() {
    6. return id;
    7. }
    8. public void setId(UUID id) {
    9. this.id = id;
    10. }
    11. public String getName() {
    12. return name;
    13. }
    14. public void setName(String name) {
    15. this.name = name;
    16. }
    17. public Student(UUID id, String name){
    18. this.id = id;
    19. this.name = name;
    20. }
    21. public Student(){}
    22. }

    (2)Dao层

    数据访问层,和Model层交互。实现接口,对数据库的访问。完成增删改查功能

    1. //定义操作数据库的方法
    2. public interface StudentDao {
    3. Optional selectStudentById(UUID id);
    4. List selectAllStudents();
    5. int insertStudent(Student student);
    6. int upgradeStudent(Student student);
    7. int deleteStudent(UUID id);
    8. }
     
    

    定义接口的实现,因为没有实现和数据库直接相连,就使用假数据。

    1. @Repository
    2. @Resource
    3. public class FakeStudentDao implements StudentDao {
    4. private static List database = new ArrayList<>();
    5. @Override
    6. public Optional selectStudentById(UUID id) {
    7. for(Student s : database){
    8. if(s.getId().equals(id)){
    9. return Optional.of(s);
    10. }
    11. }
    12. return Optional.empty();
    13. }
    14. @Override
    15. public List selectAllStudents() {
    16. return database;
    17. }
    18. @Override
    19. public int insertStudent(Student student) {
    20. UUID id = UUID.randomUUID();
    21. database.add(new Student(id,student.getName()));
    22. return 1;
    23. }
    24. @Override
    25. public int upgradeStudent(Student student) {
    26. // 先找到这个要更新的student的信息
    27. int indexToUpdate = -1;
    28. for(int i = 0;i
    29. if(student.getId().equals(database.get(i).getId())){
    30. indexToUpdate = i;
    31. break;
    32. }
    33. }
    34. if(indexToUpdate<0) return -1;
    35. database.set(indexToUpdate,student);
    36. return 1;
    37. }
    38. @Override
    39. public int deleteStudent(UUID id) {
    40. Optional optionalStudent = selectStudentById(id);
    41. if(!optionalStudent.isPresent()){
    42. return -1;
    43. }
    44. database.remove(optionalStudent.get());
    45. return 1;
    46. }
    47. }
     
    

    (3)Service层

    主要的业务逻辑,调用DAO层,操作数据库,再对返回的数据进行各种业务上的处理,再返回给控制层。实现解耦合目的.

    1. @Service
    2. public class StudentService {
    3. private StudentDao studentDao;
    4. @Autowired
    5. public StudentService(StudentDao studentDao) {
    6. this.studentDao = studentDao;
    7. }
    8. public List getAllStudents(){
    9. return studentDao.selectAllStudents();
    10. }
    11. public int addStudent(Student student ){
    12. return studentDao.insertStudent(student);
    13. }
    14. public int upgradeStudent(Student student ){
    15. return studentDao.upgradeStudent(student);
    16. }
    17. public int deleteStudent(UUID id){
    18. return studentDao.deleteStudent(id);
    19. }
    20. }
     
    

    (4) Controller层

    控制界面跳转,负责前后端交互,接收前端发送的请求,然后调用service层,service层再返回数据给它,它再返回给前端。

    1. @RestController
    2. @RequestMapping("/springboot")
    3. public class StudentController {
    4. private StudentService studentService;
    5. @Autowired
    6. public StudentController(StudentService studentService) {
    7. this.studentService = studentService;
    8. }
    9. @GetMapping
    10. public List getAllStudents() {
    11. return studentService.getAllStudents();
    12. }
    13. @PostMapping
    14. public String addStudent(@RequestBody Student student){
    15. studentService.addStudent(student);
    16. return "Added student";
    17. }
    18. @PutMapping
    19. public String upgradeStudent(@RequestBody Student student){
    20. studentService.upgradeStudent(student);
    21. return "Upgrade student";
    22. }
    23. @DeleteMapping(path = "{id}")
    24. // localhost:8080/springboot/123
    25. public String deleteStudent(@PathVariable("id") UUID id){
    26. studentService.deleteStudent(id);
    27. return "Deleted student";
    28. }
    29. }
     
    

     

  • 相关阅读:
    8. Spring Boot 2.5 实战 API 帮助文档 Swagger
    Dubbo+zookeeper的引入及使用
    2021年游戏项目的十大编程语言:C++、Java、C#均上榜
    MySQL MHA 高可用
    学JAVA可从事的工作岗位
    Day 44 Ansible自动化运维
    无代码开发批量打印入门教程
    Shell脚本中2>&1、>、>>等符号到底是什么含义
    git实战-多分支开发-2022新项目
    c++(五)
  • 原文地址:https://blog.csdn.net/qq_42514371/article/details/126133499