在Spring Boot应用中集成Swagger3比Swagger2相对简单,但现在大部分用的还是Swagger2,最近在进行入门学习,写这篇文章记录一下用spring boot+jpa+swagger3实现简单的增删改查。同时用了一下redis对查询方法保存了缓存,只用了简单注释@Cacheable实现,这里不过多介绍。想看代码可以直接跳到下面项目结构具体代码。
项目结构如下:
配置Swagger3:
我们首先进行swagger3.0的配置。
1.导入依赖:
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
2.配置application.yml:
我比较习惯用yml文件,看起来比较简洁。
spring:
mvc:
pathmatch:
matching-strategy: ant_path_matcher
3.编写swagger配置类:
配置类目录结构如下:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.oas.annotations.EnableOpenApi;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
@EnableOpenApi
@Configuration
public class Swagger3Conf {
@Bean
public Docket docket() {
return new Docket(DocumentationType.OAS_30)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.web.controller"))
.paths(PathSelectors.any())
.build().groupName("def");
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("swagger测试")
.description("swagger测试")
.termsOfServiceUrl("http://localhost:8080/")
.version("1.0")
.build();
}
}
配置JPA:
1.导入依赖:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.23</version>
</dependency>
2.配置application.yml:
jpa:
hibernate:
ddl-auto: update
show-sql: true
datasource:
driver-class-name: com.mysql.jdbc.Driver
username: root
password: root
url: jdbc:mysql://localhost:3306/demo_db?useSSL=false&useUnicode=true&characterEncoding=utf8&autoReconnect=true
type: com.alibaba.druid.pool.DruidDataSource
项目结构具体代码:
Entity实体类:
package com.entity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.persistence.*;
import java.io.Serializable;
@Data
@Entity
@Table(name = "user")
public class User implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@ApiModelProperty("用户id")
private Integer id;
@ApiModelProperty("用户姓名")
private String username;
@ApiModelProperty("用户密码")
private String password;
@ApiModelProperty("年龄")
private Integer age;
@ApiModelProperty("性别")
private String sex;
}
这里我们用@Date注解自动生成set和get方法,用@Table自动生成表,需要配置JPA和Druid才能自动生成表,之前配置好了JPA但是忘记配置Druid了,一直无法自动生成表配置完就好了。
facede层:
import com.entity.User;
import java.util.List;
public interface UserFacade {
User addUser(User user);
User updateUser(User user);
User findUserById(Integer id);
List<User> findAll();
void deleteUserById(Integer id);
}
Repo层:
import com.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepo extends JpaRepository<User,Integer> {
}
这里直接继承JpaRepository接口,这个接口已经帮我们写好了增删查的操作,可以直接调用这个接口的方法。
Service层:
import com.facade.UserFacade;
import com.repo.UserRepo;
import com.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import java.util.Optional;
@Service
@CacheConfig(cacheNames = "UserFacade")
public class UserService implements UserFacade {
@Resource
private UserRepo userRepo;
//插入一个用户
@Override
public User addUser(User user){
return userRepo.save(user);
}
//修改用户
@Override
public User updateUser(User user) {
return userRepo.save(user);
}
//根据id查询用户
@Override
@Cacheable(value="user", key ="#p0")
public User findUserById(Integer id) {
return userRepo.findById(id).get();
}
//查询所有用户
@Override
@Cacheable(value = "getAllUsers")
public List<User> findAll() {
return userRepo.findAll();
}
//根据id删除一条数据
@Override
public void deleteUserById(Integer id){
userRepo.deleteById(id);
}
}
@Cacheable用来设置缓存,需要配置redis
Web下的config的两个配置类:
1.Swagger配置类:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.oas.annotations.EnableOpenApi;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
@EnableOpenApi
@Configuration
public class Swagger3Conf {
@Bean
public Docket docket() {
return new Docket(DocumentationType.OAS_30)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.web.controller"))
.paths(PathSelectors.any())
.build().groupName("def");
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("swagger测试")
.description("swagger测试")
.termsOfServiceUrl("http://localhost:8080/")
.version("1.0")
.build();
}
}
2.redis配置类:
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.cache.RedisCacheWriter;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import java.lang.reflect.Method;
import java.time.Duration;
/**
* Redis 缓存配置类
*/
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport
{
/**
* 缓存对象集合中,缓存是以 key-value 形式保存的。
* 当不指定缓存的 key 时,SpringBoot 会使用 SimpleKeyGenerator 生成 key。
*/
// @Bean
public KeyGenerator wiselyKeyGenerator()
{
// key前缀,用于区分不同项目的缓存,建议每个项目单独设置
final String PRE_KEY = "test";
final char sp = ':';
return new KeyGenerator()
{
@Override
public Object generate(Object target, Method method, Object... params)
{
StringBuilder sb = new StringBuilder();
sb.append(PRE_KEY);
sb.append(sp);
sb.append(target.getClass().getSimpleName());
sb.append(sp);
sb.append(method.getName());
for (Object obj : params)
{
sb.append(sp);
sb.append(obj.toString());
}
return sb.toString();
}
};
}
@Bean
public CacheManager cacheManager(RedisConnectionFactory factory)
{
// 更改值的序列化方式,否则在Redis可视化软件中会显示乱码。默认为JdkSerializationRedisSerializer
RedisSerializationContext.SerializationPair<Object> pair = RedisSerializationContext.SerializationPair
.fromSerializer(new GenericJackson2JsonRedisSerializer());
RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration
.defaultCacheConfig()
.serializeValuesWith(pair) // 设置序列化方式
.entryTtl(Duration.ofHours(1)); // 设置过期时间
return RedisCacheManager
.builder(RedisCacheWriter.nonLockingRedisCacheWriter(factory))
.cacheDefaults(defaultCacheConfig).build();
}
}
Controller层:
import com.dto.UserUpdateDto;
import com.entity.User;
import com.dto.UserAddDto;
import com.service.UserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
@Controller
@RequestMapping("/")
@Api(tags = "用户管理")
public class UserController {
@Resource
private UserService service;
@ApiOperation("添加用户信息")
@PostMapping( "/addUser")
@ResponseBody
public User addUser(UserAddDto user) {
User userItem = new User();
userItem.setUsername(user.getUsername());
userItem.setPassword(user.getPassword());
userItem.setAge(user.getAge());
userItem.setSex(user.getSex());
return service.addUser(userItem);
}
@ApiOperation("修改用户信息")
@PutMapping("/updateUser")
@ResponseBody
public User updateUser(Integer id,UserUpdateDto user) {
User userItem = service.findUserById(id);
userItem.setUsername(user.getUsername());
userItem.setPassword(user.getPassword());
userItem.setAge(user.getAge());
userItem.setSex(user.getSex());
return service.updateUser(userItem);
}
@ApiOperation("根据id查询用户")
@GetMapping("/findUserById/{id}")
@ResponseBody
public User findUserById(Integer id){
return service.findUserById(id);
}
@ApiOperation("查询用户信息")
@GetMapping( "/findAll")
@ResponseBody
public List<User> findAll() {
return service.findAll();
}
@ApiOperation("根据id删除一条数据")
@ApiImplicitParam(name = "id", value = "删除的id",required = true)
@DeleteMapping("/deleteUserById/{id}")
@ResponseBody
public void deleteUserById(Integer id) {
service.deleteUserById(id);
}
}
Dto层:
1.UserAddDto:
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class UserAddDto {
@ApiModelProperty("用户姓名")
private String username;
@ApiModelProperty("用户密码")
private String password;
@ApiModelProperty("年龄")
private int age;
@ApiModelProperty("性别")
private String sex;
}
2.UserUpdateDto:
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class UserUpdateDto {
@ApiModelProperty("用户姓名")
private String username;
@ApiModelProperty("用户密码")
private String password;
@ApiModelProperty("年龄")
private int age;
@ApiModelProperty("性别")
private String sex;
}
启动类:
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.ComponentScan;
@ComponentScan(basePackages = "com.**.**")
@SpringBootApplication
@EnableCaching
public class StudyApplication implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("StudyApplication::run::20--------success");
}
public static void main(String[] args) {
SpringApplication application = new SpringApplicationBuilder()
.sources(StudyApplication.class)
.build();
application.run(args);
}
}
注意启动类一定要和各层同级,即放在com包下,这样Swagger才会扫描到那些包。
配置文件:
1.application.yml:
spring:
mvc:
pathmatch:
matching-strategy: ant_path_matcher
datasource:
driver-class-name: com.mysql.jdbc.Driver
username: root
password: (你的数据库密码)
url: jdbc:mysql://localhost:3306/demo_db?useSSL=false&useUnicode=true&characterEncoding=utf8&autoReconnect=true
type: com.alibaba.druid.pool.DruidDataSource
redis:
database: 0
host: localhost
port: 6379
password: (你的redis密码)
jpa:
hibernate:
ddl-auto: update
show-sql: true
2.pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.5</version>
<!-- <relativePath/> <!– lookup parent from repository –>-->
</parent>
<groupId>org.example</groupId>
<artifactId>ka-base-study</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.23</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<!-- //*******************************************-->
<build>
<plugins>
</plugins>
</build>
</project>
运行出来结果如下图:
访问网站:Swagger UI