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函数,功能是把某个学生加入某个班级