一、准备工作:

1、工具准备

IDEA
Mysql
Navicate
JDK
Postman
俗话说的好,工欲善其事必先利其器嘛,所以这些开发工具要安装好。安装完成后就进入项目的准备工作。

2、项目准备

前往http://start.spring.io,生成一个SpringBoot项目

image-20220818211215464

创建一个Mysql表,用于测试数据

DROP TABLE IF EXISTS `api_test`;
CREATE TABLE `api_test`  (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `age` int NULL DEFAULT NULL,
  `sex` char(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
INSERT INTO api_test (name, address, age, sex, phone) VALUES ("张三","北京四合院儿",18,"男", "13823123456");
INSERT INTO api_test (name, address, age, sex, phone) VALUES ("李四","山东菏泽曹县",16,"男", "13832131254");
INSERT INTO api_test (name, address, age, sex, phone) VALUES ("王五","广东河源紫金",13,"女", "13123555131");
INSERT INTO api_test (name, address, age, sex, phone) VALUES ("赵六","homeless",20,"男", "13512312455");

二、开发

1、打开文件

上面的我们下载的文件引入IDEA中后,会是这个样子。

image-20220818213007523

2、连接数据库。

我们需要先连接数据库,数据库位置位于src/resource/application.properties

server.port=8001

spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8&characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

上面就是需要配置连接数据库的设置。
第二个红框中的是需要设置的服务端口号,这个可以自己修改测试。
第三个细的红框是需要注意的地方,一定是自己的存放表的数据库的名称。

3、数据查询

接下来分层来创建类,SSM框架中的分层及其作用如下

  • entity层

    同类: model层 = entity层 = domain层

    作用: 用于存放我们的实体类,与数据库中的属性值基本保持一致。

  • mapper层

    同类: mapper层 = dao层

    作用: 对数据库进行数据持久化操作,他的方法语句是直接针对数据库操作的

  • service层

    同类: 只有一个 service层

    作用: service层 是针对 controller层的 controller,也就是针对我们使用者。service的 impl 是把mapper和service进行整合的文件。

  • controller层

    同类: controller层 = web 层

    作用: 控制器,导入service层,因为service中的方法是我们使用到的,controller通过接收前端传过来的参数进行业务操作,再将处理结果返回到前端。

其他包:

  • domain

    在domain包下面的实体类,其中的属性会包含数据库中的字段,还可以包含其他的自定义属性。

  • vo
    在vo包下面的实体类,其中的属性与数据库并没有关系,因为它们是用来和前端进行交互的数据类。
  • pojo
    在pojo包下面的实体类并没有严格定义,可以看做是entity、domain、vo的集合包。

(一)创建实体类

在你创建的包名下新建一个包名为entity用于存放实体类,并创建一个名为User的实体类

image-20220818213819680

package com.yzh.apitest.entity;

import lombok.Data;

@Data
public class User {
    private Integer id;
    private String name;
    private String address;
    private Integer age;
    private String sex;
    private String phone;
}

(二)创建数据操作接口

在你创建的包名下新建一个包名为mapper用于存放mapper层类,并创建一个名为UserMapper的接口

image-20220818231738382

package com.yzh.apitest.mapper;

import com.yzh.apitest.entity.User;
import org.apache.ibatis.annotations.*;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

public interface UserMapper {
    @Select("select * from api_test")
    List<User> findAll();

    @Insert("INSERT INTO api_test (name, address, age, sex, phone) VALUES (#{name}, #{address}, #{age}, #{sex}, #{phone});\n")
    @Transactional
    void save(User user);

    @Update("UPDATE api_test SET name=#{name}, address=#{address}, age=#{age}, sex=#{sex}, phone=#{phone} WHERE id = #{id}")
    @Transactional
    void updateUserById(User user);

    @Delete("delete from api_test where id = #{id}")
    void deleteUserById(Long id);

    @Select("select * from api_test WHERE id = #{id}")
    User getById(Long id);

    @Select("select * from api_test limit #{offset}, #{pageSize}")
    List<User> findByPage(Integer offset, Integer pageSize);

}

(三)创建控制层类来写向外传输数据的接口

在你创建的包名下新建一个包名为controller用于存放controller层类,并创建一个名为UserController的类

image-20220818223646844

package com.yzh.apitest.controller;

import com.yzh.apitest.entity.User;
import com.yzh.apitest.mapper.UserMapper;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

@RestController
@RequestMapping("/user")
public class UserController {
    @Resource
    UserMapper userMapper;

    // 查找数据接口
    @GetMapping()
    public List<User> getUser(){
        return userMapper.findAll();
    }

    // 增加数据接口
    @PostMapping
    public String addUser(@RequestBody User user){
        userMapper.save(user);
        return "success";
    }
}

(四)运行项目

代码写完了,下面把项目运行起来。回到谷歌浏览器中检查一下。注意地址要写正确。别忘了加上面@RequesMapping中后的那个路径

到ApitestApplication类中添加包扫描后运行

image-20220818223904162

package com.yzh.apitest;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("com.yzh.apitest.mapper")
public class ApitestApplication {

    public static void main(String[] args) {
        SpringApplication.run(ApitestApplication.class, args);
    }

}

接着到浏览器中访问接口即可接收到数据 http://localhost:port/user

image-20220818224231522

4、数据增加

步骤同上,如果有照着上面的步骤打齐代码,数据增加不需要新增代码

(一)先写增加数据的mysql数据库语句

前文已经写了,增加的内容在UserMapper中的save方法

@Insert("INSERT INTO api_test (name, address, age, sex, phone) VALUES (#{name}, #{address}, #{age}, #{sex}, #{phone});\n")
@Transactional
void save(User user);

(二)在controller中写向外暴露的接口

前文也写了捏,是PostMapping注解下的addUser方法

@PostMapping
public String addUser(@RequestBody User user){
    userMapper.save(user);
    return "success";
}

(三)在Postman中测试接口

Post方法无法直接使用路由器访问,所以需要使用Postman来测试接口

接口地址仍然是http://localhost:port/user

请求方式选择Post,在Body处,选择row并且选择JSON格式,按照字段来添加信息

成功则返回success

image-20220818225530407

image-20220818225703053

可以看到成功插入了数据

5、数据修改

(一)在UserMapper接口中写入更新的语句

@Insert("INSERT INTO api_test (name, address, age, sex, phone) VALUES (#{name}, #{address}, #{age}, #{sex}, #{phone});\n")
@Transactional
void save(User user);

(二)在controller中写向外的接口

// 修改数据接口
@PutMapping
public String updateUser(@RequestBody User user){
    userMapper.updateUserById(user);
    return "update success";
}

(三)在Postman中测试接口

接口地址仍然是http://localhost:port/user

请求方式选择Put,在Body处,选择row并且选择JSON格式,按照字段来添加信息

成功则返回update success

如:修改上文数据增加中的小别扇为蔡徐坤

image-20220818231626363

image-20220818231639710

可以看到更新成功

6、数据删除

(一)写语句

@Delete("delete from api_test where id = #{id}")
void deleteUserById(Long id);

(二)写接口

// 删除数据接口
@DeleteMapping("/{id}")
public String deleteUser(@PathVariable("id") Long id){
    userMapper.deleteUserById(id);
    return "delete success";
}

(三)在Postman中测试接口

接口地址是http://localhost:port/user/id

请求方式选择Delete

image-20220818232641070

image-20220818232656189

7、分页查询

(一)创建类

首先创建一个vo包,在里面创建一个page类

image-20220818233900838

package com.yzh.apitest.vo;

import lombok.Data;

import java.util.List;

@Data
public class Page<T> {
    private Integer pageNum;
    private Integer pageSize;
    private Integer total;
    private List<T> data;
}

(二)Mapper中写sql

// 翻页查询的语句
@Select("select * from api_test limit #{offset}, #{pageSize}")
List<User> findByPage(Integer offset, Integer pageSize);

// 统计列数的语句
@Select("select count(id) from user")
Integer conutUser();

(三)Controller写分页接口

// 分页查询接口
@GetMapping("/page")
public Page<User> findByPage(@RequestParam(defaultValue = "1") Integer pageNum,
                             @RequestParam(defaultValue = "10") Integer pageSize){
    Integer offset = (pageNum - 1) * pageSize;
    List<User> userData = userMapper.findByPage(offset, pageSize);
    Page<User> page = new Page<>();
    page.setData(userData);

    Integer total = userMapper.conutUser();
        page.setTotal(total);
    page.setPageNum(pageNum);
    page.setPageSize(pageSize);

    return page;
}

(四)在Postman中测试接口

接口地址是http://localhost:port/user/page

传值方式选Params,传入页数pageNum和范围pageSize即可查询

成功返回Page<>的数据

image-20220819000446222

三、注解解释

@RequestBody:主要用来接收前端传递给后端的json字符串中的数据的

@RequestParam:相比@RequestBody,可以接收多个参数

@PathVariable:映射 URL 绑定的占位符

最后修改:2022 年 08 月 25 日
如果觉得我的文章对你有用,能不能v我50参加疯狂星期四