SpringBoot整合Mybatis、Redis和Swagger使用restful風格實現CRUD
一、概述
最近在做一個SpringBoot的項目,距離上一次做已經有一段時間了,現在進行一個總結,總體來說比較通用,也可以算作一個Demo,具體的需求就是增刪改查
總體步驟是這樣的:創建springboot項目 --> 導入相應的依賴 --> 進行相關配置 --> 編寫entity、mapper接口和mapper.xml映射文件 --> 測試mapper --> 編寫service和controller -> 通過swagger進行測試
二、項目目錄結構
三、具體的代碼
-
pom文件
<?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 https://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.4.2</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.vernhe.springboot</groupId> <artifactId>project01</artifactId> <version>0.0.1-SNAPSHOT</version> <name>project01</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- mybatis --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.4</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!-- lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- druid --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.10</version> </dependency> <!-- redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!-- 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> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build> </project>
-
application.yml配置文件
server: port: 8080 spring: datasource: url: jdbc:mysql://127.0.0.1:3306/realProject?useUnicode=true&characterEncoding=utf-8 username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource redis: host: 127.0.0.1 port: 6379 jedis: pool: max-active: 8 max-wait: -1 max-idle: 500 min-idle: 0 mybatis: mapper-locations: classpath:mapper/*.xml logging: level: com.vernhe.springboot.project01.mapper: debug
-
entity實體類(註解是swagger的註解,等到第8步完成後再加)
@Data @ApiModel("Tag對象模型") public class Tag { @ApiModelProperty("id") private String id; @ApiModelProperty("目標") private String tagTo; @ApiModelProperty("名字") private String name; }
-
mapper接口(兩種方式)
一、配合註解使用
TagMapper.java
public interface TagMapper { @Select("select * from tag") List<Tag> getAllTag(); }
二、配合XXXMapper.xml文件使用
TagMapper2.java
public interface TagMapper2 { List<Tag> getAllTag(); Integer addTag(Tag tag); Integer updateTagById(Tag tag); Integer deleteTagById(String id); }
TagMapper.xml
<?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"> <mapper namespace="com.vernhe.springboot.project01.mapper.TagMapper2"> <insert id="addTag" parameterType="com.vernhe.springboot.project01.entity.Tag"> insert into tag (Id,TagTo,Name) values (#{id},#{tagTo},#{name}); </insert> <update id="updateTagById" parameterType="com.vernhe.springboot.project01.entity.Tag"> update tag set TagTo=#{tagTo},Name=#{name} where Id=#{id}; </update> <delete id="deleteTagById"> delete from tag where Id = #{id}; </delete> <select id="getAllTag" resultType="com.vernhe.springboot.project01.entity.Tag"> select * from tag; </select> </mapper>
-
對編寫好的mapper進行測試
@SpringBootTest class Project01ApplicationTests { @Autowired TagMapper mapper1; @Autowired TagMapper2 mapper2; @Autowired RedisTemplate<String, String> redisTemplate; @Test void test1() { // 註解方式 System.out.println(mapper1.getAllTag()); } @Test void test2() { // xml映射文件方式 查詢 System.out.println(mapper2.getAllTag()); } // 其他測試的法這裏暫時省略 }
-
編寫service接口
public interface TagService { List<Tag> getAllTag(); Integer addTag(Tag tag); Integer updateTagById(Tag tag); Integer deleteTagById(String id); }
-
編寫serviceImpl實現類
@Service public class TagServiceImpl implements TagService { @Autowired private TagMapper2 tagMapper; @Override public List<Tag> getAllTag() { return tagMapper.getAllTag(); } @Override public Integer addTag(Tag tag) { return tagMapper.addTag(tag); } @Override public Integer updateTagById(Tag tag) { return tagMapper.updateTagById(tag); } @Override public Integer deleteTagById(String id) { return tagMapper.deleteTagById(id); } }
-
編寫Swagger配置類SwaggerConfig
@Configuration @EnableSwagger2 public class SwaggerConfig { @Bean public Docket creatRestApi() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() .apis(RequestHandlerSelectors.basePackage("com.vernhe.springboot.project01")) //swagger的搜索的包 .paths(PathSelectors.any()) //swagger的路徑匹配規則 .build(); } private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("SpringBoot-CRUD文檔") .description("使用swagger生成文檔") .version("version 1.0") .build(); } }
-
編寫Controller
@Controller @RequestMapping("/tag") @Api(tags = "Tag管理API") public class TagController { @Autowired TagService tagService; @DeleteMapping("/delete/{id}") @ResponseBody @ApiOperation(value = "刪除Tag", notes = "刪除接口") @ApiResponses({ @ApiResponse(code = 200, message = "刪除成功"), @ApiResponse(code = 400, message = "id不存在或者格式不正確") }) public ResponseEntity<String> deleteTag(@PathVariable("id") String id) { Integer result = tagService.deleteTagById(id); if (result > 0) { return ResponseEntity.ok(id); } else { return new ResponseEntity(id, HttpStatus.BAD_REQUEST); } } @GetMapping("/getall") @ResponseBody @ApiOperation(value = "查詢Tag", notes = "查詢接口") @ApiResponses({ @ApiResponse(code = 200, message = "查詢成功"), @ApiResponse(code = 400, message = "查詢失敗") }) public ResponseEntity<List<Tag>> findAllTag() { List<Tag> tags = tagService.getAllTag(); if (tags == null) { return new ResponseEntity(400,HttpStatus.BAD_REQUEST); } else { return ResponseEntity.ok(tags); } } @PostMapping @ResponseBody @ApiOperation(value = "添加Tag", notes = "添加接口") @ApiResponses({ @ApiResponse(code = 200, message = "添加成功"), @ApiResponse(code = 400, message = "添加失敗"), @ApiResponse(code = 401, message = "權限不足"), }) public ResponseEntity<Tag> addTag(Tag tag) { if (tag == null) { return new ResponseEntity(400,HttpStatus.BAD_REQUEST); } Integer result = tagService.addTag(tag); if (result > 0) { return ResponseEntity.ok(tag); } else { return new ResponseEntity<>(tag, HttpStatus.UNAUTHORIZED); } } @PutMapping @ResponseBody @ApiOperation(value = "更新Tag", notes = "更新接口") @ApiResponses({ @ApiResponse(code = 200, message = "更新成功"), @ApiResponse(code = 400, message = "更新失敗"), @ApiResponse(code = 401, message = "權限不足") }) public ResponseEntity<Tag> updateTag(Tag tag) { if (tag == null) { return new ResponseEntity(400,HttpStatus.BAD_REQUEST); } Integer result = tagService.updateTagById(tag); if (result > 0) { return ResponseEntity.ok(tag); } else { return new ResponseEntity<>(tag, HttpStatus.UNAUTHORIZED); } } }
-
啓動項目,瀏覽器打開http://localhost:8080/swagger-ui.html#進入swagger文檔的界面,如下圖所示