项目实战第五记
1.写在前面
- 本篇博客需对mybatis-plus技术有一定了解
- 本篇博客代码改动较大,注意改动的地方
2. 后台集成mybatis-plus
MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
2.1 导入依赖
<!-- mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
2.2 引入mybatis-plus分页插件(mp配置类)
将MybatisPlusConfig放在配置文件夹下
package com.ppj.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MybatisPlusConfig {
/**
* 添加分页插件
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));//如果配置多个插件,切记分页最后添加
//interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); 如果有多数据源可以不配具体类型 否则都建议配上具体的DbType
return interceptor;
}
}
2.3 重写接口
为什么要重写接口?集成mybatis-plus之后,之前写的单表的crud以及分页,mybatis-plus已经封装好了,直接调用就行。
2.3.1 UserMaper接口和UserMaper.xml改动
package com.ppj.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ppj.entity.User;
import org.apache.ibatis.annotations.*;
import java.util.List;
/**
* @author ppj
* @date 2024/04/10
*/
@Mapper
public interface UserMapper extends BaseMapper<User> { //BaseMapper封装了对数据层的操作
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace 的值设定为被映射的包名.类名 -->
<mapper namespace="com.ppj.mapper.UserMapper">
<resultMap id="userResultMap" type="com.ppj.entity.User">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="password" column="password"/>
<result property="nickname" column="nickname"/>
<result property="email" column="email"/>
<result property="address" column="address"/>
<result property="createTime" column="create_time"/>
</resultMap>
</mapper>
注:删除了所有单表的操作
2.3.2 UserService
package com.ppj.service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ppj.entity.User;
import com.ppj.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @author ppj
* @date 2024/04/11
*/
@Service
public class UserService extends ServiceImpl<UserMapper,User> { //对于单表的操作,完全没有方法,只需继承ServiceImpl
}
2.3.3 UserController
package com.ppj.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ppj.entity.User;
import com.ppj.mapper.UserMapper;
import com.ppj.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author ppj
* @date 2024/04/10
*/
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/")
public List<User> findAll(){
return userService.list();
}
@PostMapping("/")
public boolean saveOrUpdate(@RequestBody User user){
return userService.saveOrUpdate(user);
}
@DeleteMapping("/{id}")
public boolean delUser(@PathVariable("id") Integer id){
return userService.removeById(id);
}
@GetMapping("/page")
public IPage<User> page(@RequestParam Integer pageNum,
@RequestParam Integer pageSize,
@RequestParam(required = false) String username,
@RequestParam(required = false) String address){
IPage<User> page = new Page<>(pageNum,pageSize);
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
if(!"".equals(username)){
queryWrapper.like("username",username);
}
if(!"".equals(address)){
queryWrapper.like("address",address);
}
return userService.page(page, queryWrapper);
}
}
2.3.4 要注意的地方
- 之前的数据库用户表名为sys_user,当MyBatis Plus中实体类没有添加注解 @TableName 则默认从数据库中找与实体类名称一样的表进行查询
package com.ppj.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
* @author ppj
* @date 2024/04/10
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName(value = "sys_user")
public class User {
private Integer id;
private String username;
private String password;
private String nickname;
private String email;
private String address;
private String phone;
@JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss")
@TableField(value = "create_time") //字段与属性不一致时,用@TableField
private Date createTime;
}
- 日志打印换成mp的日志打印
server:
port: 9000
# 应用服务 WEB 访问端口
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/fb?serverTimezone=GMT%2b8&useUnicode=true&characterEncoding=utf8&useSSL=false
username: root
password: 123456
# mybatis配置文件注入
mybatis:
# classpath*:mapper/*.xml
#如果项目中的Mapper XML文件分布在多个jar包或多个路径下,可以使用classpath*:mapper/*.xml来加载所有的Mapper XML文件;
#如果所有的Mapper XML文件都在同一个路径下,可以使用classpath:mapper/*.xml来加载这些文件
mapper-locations: classpath:mapper/*.xml
# 日志打印
# configuration:
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mybatis-plus: # mybatis-plus日志打印
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
2.3.5 接口测试(读者用postman自行测试,与上一篇博客测试相同)
3. 后台集成swagger
3.1 swagger认知
也是一种接口测试工具,在前后端开发中,前端可以很好的通过swagger-ui,知道要调用哪个接口,接口需要传什么参数,提高开发效率。
3.2 导入依赖
<!-- swagger -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
3.3 编写swagger配置类(SwaggerConfig)
package com.ppj.config;
import com.google.common.base.Predicates;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
/**
*
* swagger-ui访问 http://localhost:9600/swagger-ui.html
* @author ppj
**/
@Configuration
@EnableSwagger2
public class SwaggerConfig {
/**
* 创建Docket对象,交给spring管理
* Docket是swagger中全局配置对象
*
* @return springfox.documentation.spring.web.plugins.Docket
* @author ppj
**/
@Bean
public Docket docket(){
Docket docket = new Docket(DocumentationType.SWAGGER_2);
//API帮助文档的描述信息
ApiInfo apiInfo = new ApiInfoBuilder()
.title("API接口文档")
.description("用于开发restfulAPI的帮助文档")
.version("1.1")
.build();
//给docket上下文配置api描述信息
docket.apiInfo(apiInfo);
docket.select() //获取Docket中的选择器。返回是ApiSelectorBuilder。构建选择器的。如:扫描什么包的注解
//.apis(RequestHandlerSelectors.basePackage("com.ppj.controller"))//设定扫描哪个包(包含子包)中的注解
.apis(RequestHandlerSelectors.any())
//不显示错误的接口地址
.paths(Predicates.not(PathSelectors.regex("/error.*")))
.paths(PathSelectors.regex("/.*"))
.build();
return docket;
}
}
3.4 测试访问swagger页面
直接访问 http://localhost:9000/swagger-ui.html (改成自己在application.yml中设置的端口),成功页面如下图所示:
3.5 可能出现的问题
- 因为Springfox2.x使用的路径匹配是基于AntPathMatcher的,而Spring Boot 2.6.X使用的是PathPatternMatcher。本篇将原来springboot2.6.2版本降到2.4.2(只要降到2.6.x以下)就行
总结
- 读者可深入了解mybatis-plus封装的方法;
- 集成swagger,注意springboot版本,可继续学习swagger注解使用;
声明
项目源于此地址:程序员青戈
写在最后
如果此文对您有所帮助,请帅戈靓女们务必不要吝啬你们的Zan,感谢!!不懂的可以在评论区评论,有空会及时回复。
文章会一直更新