使用 Spring Boot + MyBatisPlus 提高效率,简化开发
最近一段时间,由于一些项目的需求,于是被迫用很快的速度学完了 Spring Framework,SpringMVC,Spring Boot。
然而实际上,我认为学习后端框架原理,前端的脚手架开发,搞一些基础建设是远远比每天写单调简单的业务逻辑要收获更多的,就是更多还是要有解决问题的能力和创新进步的想法吧,所以写业务逻辑当然是越省时间越好,机械操作和基础代码就越快搞定越好,这引出了我们为什么要使用 MyBatis-Plus
首先是它的官网快速上手部分:点我跳转
基础使用(利用提供的类进行增删改查)
首先在 maven 的依赖中添加 (最新版在 Maven Repository
XML1<dependency> 2 <groupId>com.baomidou</groupId> 3 <artifactId>mybatis-plus-spring-boot3-starter</artifactId> 4 <version>3.5.7</version> 5</dependency>
同步依赖后配置注解扫描 mapper
JAVA1package com.grtsinry43.projectpackage; 2 3import org.mybatis.spring.annotation.MapperScan; 4import org.springframework.boot.SpringApplication; 5import org.springframework.boot.autoconfigure.SpringBootApplication; 6 7@SpringBootApplication 8@MapperScan("com.grtsinry43.projectpackage.mapper") 9public class SimpleBackendApplication { 10 11 public static void main(String[] args) { 12 SpringApplication.run(SimpleBackendApplication.class, args); 13 } 14 15} 16
下面我们先创建实体类(model)
JAVA1package com.grtsinry43.projectpackage.model; 2 3import com.baomidou.mybatisplus.annotation.IdType; 4import com.baomidou.mybatisplus.annotation.TableId; 5import com.baomidou.mybatisplus.annotation.TableName; 6import lombok.Data; 7 8import java.sql.Timestamp; 9 10/** 11 * @author grtsinry43 12 * @date 2024/8/11 11:08 13 * @description user 的实体类 14 */ 15@Data 16@TableName("user") 17public class User { 18 @TableId(type = IdType.AUTO) 19 private Integer id; 20 private String name; 21 private Boolean gender; 22 private Integer age; 23 private String phone; 24 private String password; 25 private Timestamp createAt; 26} 27
这里使用了 Lombok 的
@Data
注解来自动生成Getter
、Setter
方法、toString
方法、hashCode
方法、equals
方法。
下面我们来写对应的 Mapper,在这里,MyBatis-Plus 提供了一个 BaseMapper,我们只需要继承这个接口就可以直接获得增删改查的功能
JAVA1package com.grtsinry43.projectpackage.mapper; 2 3import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4import com.grtsinry43.projectpackage.model.User; 5 6/** 7 * @author grtsinry43 8 * @date 2024/8/11 11:13 9 * @description 用户的 Mapper 接口 10 */ 11public interface UserMapper extends BaseMapper<User> { 12} 13
当然,如果需要一些自定义的 sql 语句,也可以自行配置,这里采用最简单的来举例
在 resources/mapper 新建 UserMapper.xml
XML1<?xml version="1.0" encoding="UTF-8" ?> 2<!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 6<mapper namespace="com.grtsinry43.projectpackage.mapper.UserMapper"> 7 <select id="selectUsersOlderThan" resultType="com.grtsinry43.projectpackage.model.User"> 8 SELECT * FROM user WHERE age > #{age} 9 </select> 10</mapper>
JAVA1public interface UserMapper extends BaseMapper<User> { 2 @Select("select * from user where age > #{age}") 3 List<User> selectUsersOlderThan(Integer age); 4}代码生成器
然后在 Service 中,传入 Mapper 和对应的数据模型,继承 ServiceImpl
JAVA1package com.grtsinry43.projectpackage.service; 2 3import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 4import com.grtsinry43.projectpackage.mapper.UserMapper; 5import com.grtsinry43.projectpackage.model.User; 6import org.springframework.stereotype.Service; 7 8@Service 9public class UserService extends ServiceImpl<UserMapper, User> { 10 private final UserMapper userMapper; 11 12 public UserService(UserMapper userMapper) { 13 this.userMapper = userMapper; 14 } 15}
这样,我们的 Service 对象就有了 crud 方法,我们可以在 Controller 类中直接使用~
JAVA1package com.grtsinry43.projectpackage.controller; 2 3import com.grtsinry43.projectpackage.dto.ApiResponse; 4import com.grtsinry43.projectpackage.model.User; 5import com.grtsinry43.projectpackage.service.UserService; 6import jakarta.validation.constraints.NotBlank; 7import jakarta.validation.constraints.NotNull; 8import org.springframework.web.bind.annotation.*; 9 10/** 11 * @author grtsinry43 12 * @date 2024/8/11 11:30 13 * @description 少年负壮气,奋烈自有时! 14 */ 15@RestController 16@RequestMapping("/api/user") 17public class UserController { 18 private final UserService userService; 19 20 public UserController(UserService userService) { 21 this.userService = userService; 22 } 23 24 @GetMapping("/{id}") 25 public ApiResponse<User> getUserInfo(@PathVariable Integer id) { 26 User user = userService.getById(id); 27 return ApiResponse.success(user); 28 } 29 30 @PutMapping("/{id}") 31 public ApiResponse<User> updateUserInfo(@PathVariable Integer id, @RequestBody User user) { 32 user.setId(id); 33 userService.updateById(user); 34 return ApiResponse.success(user); 35 } 36 37 @DeleteMapping("/{id}") 38 public ApiResponse<Object> deleteUser(@PathVariable Integer id) { 39 userService.removeById(id); 40 return ApiResponse.success(null); 41 } 42} 43
使用代码生成器(完全不用敲代码)
当然,手动敲代码真的是太繁琐了,我真的非常讨厌在简单业务逻辑尤其是基本的 crud 上浪费时间,MyBatis-Plus 也想到了这一点,人家的完整使用方法可不是上面的那
么复杂,借助代码生成器(Auto Generator)完全无脑搞起来吧!
注意!根据官方文档,新的代码生成器适用于 3.5.1 及以上版本
JAVA1package com.grtsinry43.mybatisplusquickstart.util; 2 3import com.baomidou.mybatisplus.annotation.FieldFill; 4import com.baomidou.mybatisplus.generator.FastAutoGenerator; 5import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine; 6import com.baomidou.mybatisplus.generator.fill.Column; 7 8import java.util.Arrays; 9import java.util.Collections; 10import java.util.List; 11 12/** 13 * Code generator for MyBatis Plus. 14 * Author: grtsinry43 15 * Date: 2024/8/11 16 */ 17public class CodeGenerator { 18 public static void main(String[] args) { 19 FastAutoGenerator.create("url", 20 "username", "password") 21 // 全局配置 22 .globalConfig((scanner, builder) -> builder 23 .author(scanner.apply("请输入作者名称?")) 24 .outputDir("src/main/java") // Specify the output directory 25 ) 26 // 包配置 27 .packageConfig((scanner, builder) -> builder.parent(scanner.apply("请输入包名?"))) 28 // 策略配置 29 .strategyConfig((scanner, builder) -> builder.addInclude(getTables(scanner.apply("请输入表名,多个英文逗号分隔?所有输入 all"))) 30 .entityBuilder() 31 .enableLombok() 32 .addTableFills( 33 new Column("create_time", FieldFill.INSERT) 34 ) 35 .build()) 36 // 使用Freemarker引擎模板,默认的是Velocity引擎模板 37 .templateEngine(new FreemarkerTemplateEngine()) 38 .execute(); 39 } 40 41 // 处理 all 情况 42 protected static List<String> getTables(String tables) { 43 return "all".equals(tables) ? Collections.emptyList() : Arrays.asList(tables.split(",")); 44 } 45}
这样,就会按照结构生成好啦:
SH1❯ tree . 2. 3└── mybatisplusquickstart 4 ├── controller 5 │ └── UserController.java 6 ├── entity 7 │ └── User.java 8 ├── mapper 9 │ ├── UserMapper.java 10 │ └── xml 11 │ └── UserMapper.xml 12 ├── MybatisplusQuickstartApplication.java 13 ├── service 14 │ ├── impl 15 │ │ └── UserServiceImpl.java 16 │ └── IUserService.java 17 └── util 18 └── CodeGenerator.java 19
以上,就可以在不用敲代码的情况下实现基本的数据操作,大大提高效率,减少机械操作了