一、准备工作:
1、工具准备
IDEA
Mysql
Navicate
JDK
Postman
俗话说的好,工欲善其事必先利其器嘛,所以这些开发工具要安装好。安装完成后就进入项目的准备工作。
2、项目准备
前往http://start.spring.io,生成一个SpringBoot项目
创建一个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中后,会是这个样子。
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
的实体类
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
的接口
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
的类
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类中添加包扫描后运行
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
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
可以看到成功插入了数据
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
如:修改上文数据增加中的小别扇为蔡徐坤
可以看到更新成功
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
7、分页查询
(一)创建类
首先创建一个vo包,在里面创建一个page类
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<>的数据
三、注解解释
@RequestBody
:主要用来接收前端传递给后端的json字符串中的数据的
@RequestParam
:相比@RequestBody,可以接收多个参数
@PathVariable
:映射 URL 绑定的占位符
2 条评论
主播好会啊
你给我口住