搭建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("删除成功");
}
}