搭建Spring boot系统,完成CRUD方法

搭建Spring boot系统,完成CRUD方法

1.创建Project并导入依赖

	<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.0.RELEASE</version>
        <relativePath/>
    </parent>

    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <!-- 通用mapper -->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
            <version>2.0.2</version>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.9</version>
        </dependency>
        
        <dependency>
        <groupId>com.github.xiaoymin</groupId>
        <artifactId>knife4j-spring-boot-starter</artifactId>
        <version>2.0.2</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.2.3</version>
        </dependency>
        
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>
        
        <dependency>
            <groupId>io.swagger</groupId>
            <artifactId>swagger-annotations</artifactId>
            <version>1.5.3</version>
        </dependency>
    </dependencies>

2.编写Spring boot的配置文件

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/qaexer?characterEncoding=utf-8&serverTimezone=UTC
    username: root
    password:
    driver-class-name: com.mysql.cj.jdbc.Driver

  redis:
    host: 127.0.0.1


mybatis:
  mapper-locations: classpath:/mapper/*.xml #加载映射文件
  type-aliases-package: com.QA.pojo #别名搜索的包

3.编写Swagger Configuration

import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
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.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;

@Configuration
@EnableSwagger2
@EnableKnife4j
public class SwaggerConfigration {
    @Bean
    public Docket api() {
        // 选择swagger2版本
        return new Docket(DocumentationType.SWAGGER_2)
                //定义api文档汇总信息
                .apiInfo(apiInfo())         
                .select()
                .apis(RequestHandlerSelectors
                        // 指定生成api文档的包
                        .basePackage("com.QA.controller")) 
                .paths(PathSelectors.any())
                // 指定所有路径 
                .build()
                ;
    }

    /**
     * 构建文档api信息
     * @return
     */
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                //文档标题
                .title("文档标题")      
                //联系人信息
                .contact(new Contact("name", "url", "mail"))  
                //描述
                .description("描述")
                //版本
                .version("0.1")     
                //网站地址
                .termsOfServiceUrl("http://localhost:8080")     
                .build();
    }
}

4.根据数据库表结构设计实体类

在实体类编写的过程中使用了lombok插件简化了操作和代码。

举一个Answer类

@Data
@Table(name = "answer")
public class Answer {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private String id;

    private String content;
    @Column(name = "supportcnt")
    private int supportCnt;
    @Column(name = "opposecnt")
    private int opposeCnt;
    @Column(name = "answerto")
    private String answerTo;
    private Date time;
    @Column(name = "userid")
    private String userId;
    /** status用于假删除 */
    private int status;
}

需要注意变量名与表名的匹配。

5.编写DAO层

编写各个实体类对应的mapper接口

import com.QA.pojo.Answer;
import tk.mybatis.mapper.common.Mapper;
import java.util.List;

public interface AnswerMapper extends Mapper<Answer> {
    /**用于全查*/
    public List<Answer> findAll();
    /**单查*/
    public Answer findById(String id);
    /**假删除*/
    public int deleteById (String id);
}

6.编写mybatis映射文件

<?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.QA.dao.AnswerMapper">

    <!--全查 -->
    <select id="findAll" resultType="Answer">
        select * from answer where status = 0
    </select>

    <!--根据id查询 -->
    <select id="findById" resultType="Answer">
        select * from answer where status = 0 and id = #{id}
    </select>

    <!--假删除 -->
    <insert id="deleteById" >
        update answer set status = 1 where id = #{id}
    </insert>

</mapper>

7.编写Service层

将全查操作放入redis缓存中 并实现CRUD方法。

@Service
public class AnswerService {

    @Autowired
    private AnswerMapper answerMapper;

    @Autowired
    private StringRedisTemplate redisTemplate;

    /**新增方法*/
    public int createAnswer(Answer answer){
        return answerMapper.insert(answer);
    }

    /**在缓存中查询数据*/
    public List<Answer> findInRedis(){
        //查询之前先查缓存
        String json = redisTemplate.opsForValue().get("answerData");
        //如果缓存中有数据直接返回
        if (StringUtils.isNotBlank(json)){
             return JsonUtils.jsonToList(json,Answer.class);
        }
        //缓存中没有数据
        List<Answer> list = answerMapper.findAll();
        //在数据库中找到数据后存到redis
        redisTemplate.opsForValue().set("answerData",JsonUtils.objectToJson(list));
        return list;
    }
    
    /**修改方法*/
    public int changeAnswerById(Answer answer){
        return answerMapper.updateByPrimaryKeySelective(answer);
    }
    
    /**单查*/
    public Answer findById(String id){
        return answerMapper.findById(id);
    }
    
    /**假删除*/
    public int deleteAnswer(String id){
        return answerMapper.deleteById(id);
    }
}

8.编写Controller层

HttpResult类是Controller统一返回的数据结构

import java.io.Serializable;

/**
 * HTTP结果封装
 */
public class HttpResult implements Serializable {

   private int code = 200;
   private String msg;
   private Object data;
   
   public static HttpResult error() {
      return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, "未知异常,请联系管理员");
   }
   
   public static HttpResult error(String msg) {
      return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, msg);
   }
   
   public static HttpResult error(int code, String msg) {
      HttpResult r = new HttpResult();
      r.setCode(code);
      r.setMsg(msg);
      return r;
   }

   public static HttpResult ok(String msg) {
      HttpResult r = new HttpResult();
      r.setMsg(msg);
      return r;
   }
   
   public static HttpResult ok(Object data) {
      HttpResult r = new HttpResult();
      r.setData(data);
      return r;
   }
   
   public static HttpResult ok() {
      return new HttpResult();
   }

   public int getCode() {
      return code;
   }

   public void setCode(int code) {
      this.code = code;
   }

   public String getMsg() {
      return msg;
   }

   public void setMsg(String msg) {
      this.msg = msg;
   }

   public Object getData() {
      return data;
   }

   public void setData(Object data) {
      this.data = data;
   }
   
}

Controller

import com.QA.http.HttpResult;
import com.QA.pojo.Answer;
import com.QA.service.AnswerService;
import com.github.xiaoymin.knife4j.annotations.ApiSort;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;

@ApiSort(1)
@Api(tags = {"回答模块"})
@RestController
@RequestMapping("/answer")
public class AnswerController {

    @Autowired
    private AnswerService answerService;

    @GetMapping("/query/{id}")
    public  HttpResult getAnswerById1(@PathVariable String id){
        Answer answer = answerService.findById(id);
        return HttpResult.ok(answer);
    }

    @GetMapping("/query/all")
    public HttpResult getAllAnswer(){
        List<Answer> answers =  answerService.findInRedis();
        return HttpResult.ok(answers);
    }

    @PostMapping("/add")
    public HttpResult createAnswer(Answer answer){
        answerService.createAnswer(answer);
        return HttpResult.ok("添加成功");
    }

    @PostMapping("/change")
    public HttpResult changeAnswerById(Answer answer){
        answerService.changeAnswerById(answer);
        return HttpResult.ok("修改成功");
    }

    @PostMapping("/delete/{id}")
    public HttpResult deleteById(@PathVariable String id){
        answerService.deleteAnswer(id);
        return HttpResult.ok("删除成功");
    }

}

9.通过postman进行接口测试

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值