2.10 Service层

上一节展示了如何注册新用户,我们有这样的数据操作:
1.在user表添加一行数据,新增用户
2.在user_class表添加一行数据,记录此用户在哪个班
假如,在管理页面,有批量注册这个功能,可以注册很多个用户,那么上面的两个操作所代表的“注册”实际上用在了不止一个地方。不幸的是,在controller的函数只能处理一个http请求,不能复用。service(服务)层就是这类可以复用的操作的集合。
现在我们把上一节的注册,用service实现,简单地说,就是把“注册”这一操作变成函数,以便多处使用。
首先新建一个包com.example.service,专门用来放service的函数,然后在里面创建接口IUserService,Springboot要求service必须是接口:
package com.example.service;
public interface IUserService{
    /**
    用户注册
    @param classId 班级id
    @param username 用户名
     @param password 用户密码
    @param nickname 昵称
    @param role 角色
     */
    void register(String classId,String username,String password,String nickname,String role);
}
里面是一个register(注册)函数,它的参数是新用户注册所需的参数。
然后再创建UserService.java实现这个接口:
package com.example.service;
import com.example.demo.User;
import com.example.demo.UserClass;
import com.example.repos.UserClassRepository;
import com.example.repos.UserRepository;
import org.springframework.stereotype.Service;
import java.text.SimpleDateFormat;
import java.util.Date;
@Service 
public class UserService implements IUserService{
    private final UserRepository userRepository;
    private final UserClassRepository userClassRepository;
    //自动注入实现后的repository
    public UserService(UserRepository userRepository,UserClassRepository userClassRepository){
        this.userRepository=userRepository;
        this.userClassRepository=userClassRepository;
    }
    @Override 
    public void register(String classId,String username,String password,String nickname,String role){
        //用户不存在就新增
         if( ! userRepository.existsByUsername(username)){
            User user=new User();
            user.setUsername(username);
            user.setPassword(password);
            user.setNickname(nickname);
            user.setIsValid("1");
            user.setRole("0");
            user.setCreateDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
            this.userRepository.save(user);
        }
        //给用户分配班级
        UserClass userClass=new UserClass();
        userClass.setUsername(username);
        userClass.setClassId(Integer.parseInt(classId));
        userClass.setDatetime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
        this.userClassRepository.save(userClass);
    }
}
可以看出,这基本上是把之前在controller的register方法的代码复制了过来。
现在的controller改成了这样:
package com.example.controller;
import com.example.demo.User;
import com.example.repos.UserRepository;
import com.example.service.IUserService;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.IOException;
@RestController 
public class GreetingController{
    private final UserRepository userRepository;
    private final IUserService userService;
    //自动注入实现后的UserService
    public GreetingController(UserRepository userRepository,IUserService userService){
        this.userRepository=userRepository;
        this.userService=userService;
    }
    @CrossOrigin 
    @GetMapping("/index")
    public String index(String username)throws IOException{
        User user=this.userRepository.findByUsername(username);
        return user.getNickname();
    }
    @GetMapping("register")
    public String register(String username,String password,String nickname){
        if(username==null || username.isEmpty()|| password==null || password.isEmpty()){
            return "部分数据为空";
        }
        this.userService.register("65",username,password,nickname,"0");
        return "注册成功";
    }
}
这样注册操作就可以多处使用了,例如下面这样的用法:
这是一段批量导入用户的部分代码,当用户不存在的时候,注册该学生,如果用户已经存在,加入此班级。
尝试完成这个addUserToClass函数,功能是把某个学生加入某个班级