SpringBoot搭建REST API

现在用一天时间可以全部想起来,趁还记得住写一下,免得以后忘记。


八股文

新建项目

安装1.8版本的JDK,保证和服务器的祖传版本一样。
使用IDEA中的 Spring Iitialzr,使用Lombok、Spring Web、Spring Data JPA、JDBC、MySQL Driver,我也不知道,反正多钩点肯定没错。

前期准备

进去后Ctrl+Alt+S设置代理

如果是2021以下的祖传IDEA版本,需要在Plugins 内下载lombok插件,不然自动生成的getter和setter会出现Cannot resolve method问题。

数据库设置

在src/main/recources下的application.properties内,设置数据库和端口相关内容。

spring.jpa.hibernate.ddl-auto=update
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/chatroom?useLegacyDatetimeCode=false&serverTimezone=America/New_York
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.show-sql=false
server.port=8081

回忆

文件夹常识

在Springboot中,一般建立四个文件夹,分别是Controller、Model、Repository和Payload。

Model

Model是数据库内的各个table,把相关数据变成Java内数据类型的Class。
例如,商店需要定义User有在数据库内的int id、str password,而Item有在数据库的int id、str name、float price。

Repository

在这里调用数据库,封装了使用JpaRepository和原始sql语句的各种方法,用于controller调用。

public interface UserRepository extends JpaRepository<User, Integer> {  // 最后是表和主键类型

    User findById(Integer id);

    List<Purchase_history> findByItemIdAndUserId(int itemId, int userId);

    @Modifying
    @Query("delete from Purchase_history p where p.id = ?1")
    void delete(int id);

}

Controller

Controller内是具体路由的行为,通过定义一个函数和路由,调用Repository进行CRUD。
例如,商店需要ItemController添加商品和UserController添加用户。

需要实例化Repository!

@Autowired
private UserRepository userRepository;

@GetMapping("/getuser")
public User getStuedntInfo(@RequestParam("userid") int stuid){ //可以使用payload
   User user = userRepository.findById(userid);
   return user; //{id:4396;password:6324}
}

Payload
Payload是前端发送的内容在后端的类。
例如,User里有id, intro, username, password。但用户提交表单里只有id和intro。因此Payload如下:

@Getter
@Setter
@NoArgsConstructor
public class UpdateIntroPayload {
    private int id;
    private String intro;
}

在Controller内如下使用

@PostMapping("/update")
public void updateUserIntro(@RequestBody UpdateInfoPayload userupdate){
    User user = userRepository.findById(userupdate.getId ());
    user.setIntro(userupdate.getIntro());
    userRepository.save(user);

}

动手

首先需要创建实体类

以Record类为例,引入这叫啥?包?模块?
基础框架如下:

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.persistence.*;

@Getter
@Setter
@NoArgsConstructor
@Entity
public class Record {}

上面定义了一个由lombok负责创建getter和setter的实体类,里面是空的。

public class Record {
    @Id //主键标注
    @Column(name = "time_date") //表明是Record表内的id列
    @GeneratedValue //可以自动增减吧
    private Timestamp timeDate; //这里的变量名需要与下面的findby和数据库内的一样

    @Column(name = "name")
    private String name;

    @Column(name = "message")
    private String message;
}

其次需要创建Repository

调用jpa,基础框架如下

package com.dispnt.webapi.repository;
import com.dispnt.webapi.model.Record;
import org.springframework.data.jpa.repository.JpaRepository;

public interface RecordRepository extends JpaRepository<Record, Timestamp> {
    Record findByTimeDate(Timestamp TimeDate);
}

上面定义了一个jparepository,后面的Record为上面定义的实体类名,Timestamp为主键类型

最后创建Controller

@RequestMapping("/record")
@CrossOrigin("*")
@RestController
public class RecordController {
    @Autowired
    private RecordRepository recordRepository;

    @GetMapping("/msg")
    public Record getMessage(@RequestParam("message") String td){
        List<Record> record = recordRepository.findByMessageLike("%"+td+"%");
        System.out.println(td);
        return record;
    }

运行即可。

打包和服务器部署

开发机操作

因为是Gradle项目,使用IDEA右边选项卡内的clean,随后使用jar指令打包jar文件,保存在./build/libs/目录内。
我懒,用Navicat导出了sql和相关创建表的指令。怕我忘记,创建表的指令复制到下面。

CREATE TABLE `record`  (
  `time_date` datetime NOT NULL,
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  `message` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

服务器端

运行yum install -y java-1.8.0-openjdk-devel.x86_64安装祖传1.8版本JDK。
基本的导入sql的方法,我怕忘记,所以全部写一遍。

mysql -u root -p
create database record;
use record;
*用上面的指令创建table*;
source *上面导出的sql文件*

使用java -jar api-0.0.1-SNAPSHOT.jar命令运行,并使用iptables -A INPUT -p tcp --dport 8081 -j ACCEPT命令打开防火墙。

现在可以通过端口访问服务。

github

tag(s): none
show comments · back · home
Edit with Markdown