前言
上篇我们学习了用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