在上一篇中,我们已经创建了实体类以及映射接口,接下来要做的就是实现处理业务逻辑的 Service 层、控制流程的 Controller 层。
在项目中创建 service 目录,新建 UserService.java 文件:
package com.foxescap.wxbox.service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.foxescap.wxbox.mapper.UserMapper; import com.foxescap.wxbox.model.User; import org.springframework.stereotype.Service; /** * @author imxfly */ @Service public class UserService extends ServiceImpl<UserMapper, User> { /** * 根据用户名获取单个用户 * @param username 用户名 * @return 用户 */ public User findByUsername(String username) { return lambdaQuery().eq(User::getUsername, username).one(); } }
以上是根据用户名获取单个用户的一个逻辑,有几点说明一下:
• 通过添加 Spring 官方的 @Service 注解自动将该类注入到 Spring 容器中
• 通过继承 MyBatis-Plus 依赖提供的 ServiceImpl<UserMapper, User> 类,就可以很方便的使用它的 query、lambdaQuery 等方法进行链式操作,而不许进行 MyBatis 的 XML 繁琐配置,这就是提高开发效率最大的地方
在项目中创建 controller 目录,新建 UserController.java 文件:
package com.foxescap.wxbox.controller; import com.foxescap.wxbox.model.User; import com.foxescap.wxbox.service.UserService; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; /** * @author imxfly */ @RestController public class UserController { //@Autowired //private UserService userService; private final UserService userService; public UserController(UserService userService) { this.userService = userService; } /** * 根据用户名获取用户 * @param username 用户名 * @return 用户 */ @GetMapping("/user") public User findUserByUsername(@RequestParam(name = "username") String username) { return userService.findByUsername(username); } }
• 通过 Spring 官方提供的 @RestController 注解自动注入到 Spring 容器中,并且会将返回值放在 Response 体内,而不是返回一个页面。
• 很多人都习惯用 @Autowired 注解来自动注入当前类的实例,但是我个人习惯用构造函数的方式来实现。保持业务逻辑免受 Spring Boot 代码侵入的一种方法是使用构造函数注入。不仅是因为 @Autowired 注解在构造函数上是可选的,而且还可以在没有 Spring 的情况下轻松实例化 Bean,其他优缺点可以去阅读一下下面的参考链接里的第一条。
• 通过 Spring 官方提供的 @GetMapping 注解实现路由的创建。
• 通过 Spring 官方提供的 @RequestParam 注解实现请求参数的绑定。
运行起来后,如果没有配置端口,默认是起的 8080,为了能看到有数据,我们在数据库插一条:
INSERT INTO `wxbox`.`user`(`id`, `username`, `secret_key`, `expired_at`, `created_at`) VALUES (1, 'steve', 'xxx', '2020-08-28 00:05:40', '2020-07-07 00:05:47');
然后通过 curl 命令看下:
$ curl http://localhost:8080/user/?username/=steve {"id":1,"username":"steve","secretKey":"xxx","expiredAt":"2020-08-28T00:05:40","createdAt":"2020-07-07T00:05:47"}
• Field injection is not recommended – Spring IOC