前言

上篇我们学习了用mybatis,mapper来操作数据库,但是我们的逻辑全部都是写在controller里面,这样代码不容易复用,举个例子,我们需要查询文章列表这个操作,在不同的接口里也有可能会用到,难道我们每个接口都要重新写一遍逻辑来调用mapper吗,本篇学习如何将多余的代码抽离成统一service来调用mapper

为什么要使用service

2005年以前的大多数项目都是直接在业务处理层的Service类中嵌入JDBC代码,这就使得这个Service类与数据库紧藕合,在换一种数据库的情况下,就要修改Service类中的sql。 根据软件设计的开闭原则,软件应该对修改关闭、对扩展开放。 因此,那时聪明的程序员就把这个Service类设计成一个接口,使控制层只依赖这个接口,于是就有了controller+service+serviceImpl;这样,当某天这个应用要跑在其它数据库上时,就而只需要增加一个serviceImpl类。 这就是service+serviceImpl套路产生的背景。

新建ArticleService.java

在`src/main/java/com/semyin/blog/service`创建接口 `ArticleService.java`
在`src/main/java/com/semyin/blog/service/Impl` 创建class `ArticleServiceImpl.java`

// ArticleService.java

package com.semyin.blog.service;

import com.semyin.blog.entity.Article;

import java.util.List;

public interface ArticleService {
    
    List<Article> getArticles();
}

// ArticleServiceImpl.java

package com.semyin.blog.service.Impl;

import com.semyin.blog.entity.Article;
import com.semyin.blog.mapper.ArticleMapper;
import com.semyin.blog.service.ArticleService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

@Service
public class ArticleServiceImpl implements ArticleService {

    @Resource
    private ArticleMapper articleMapper;

    @Override
    public List<Article> getArticles() {
        return articleMapper.getArticles();
    }
}

修改ArticleController调用Service


// 引入service
@Resource
private ArticleService articleService;


// 修改文章列表接口
@GetMapping("/articles")
public Object getArticles() {
    return articleService.getArticles();
}


修改mapper文件

// src/main/java/com/semyin/blog/mapper/ArticleMapper.java

+++
@Mapper
@Repository
+++
public interface ArticleMapper {
    List<Article> getArticles();
}


重新启动项目

直接用idea的open Http client 跑接口

GET http://localhost:8020/articles

HTTP/1.1 200 
Content-Type: application/json
Transfer-Encoding: chunked
Date: Mon, 28 Mar 2022 09:27:48 GMT
Keep-Alive: timeout=60
Connection: keep-alive

[
  {
    "id": 1,
    "title": "测试标题",
    "detail": "我是测试内容",
    "status": 1,
    "createTime": "2022-03-24T08:53:56.000+00:00",
    "updateTime": "2022-03-24T08:53:56.000+00:00"
  }
]

Response code: 200; Time: 1251ms; Content length: 144 bytes