创建一个名为demo-user的maven项目,如下图:
pom.xml文件:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>com.xiaohhgroupId>
<artifactId>demo-userartifactId>
<version>1.0-SNAPSHOTversion>
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<maven.compiler.source>8maven.compiler.source>
<maven.compiler.target>8maven.compiler.target>
properties>
project>
当我们来到我们本次讲解的版本的官方文档,可以看到更详细的讲解,来到Getting Started的Creating the POM可以看到我们的maven需要继承一个父项目,代码为
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.3.9.RELEASEversion>
parent>
将其粘贴到项目中:
注意要刷新maven项目,然后我们来到爷爷辈的maven父项目可以看到很多的starter
需要注意SpringBoot之所以能够快速搭建项目,其原理还是使用starter快速导包和SpringBoot的快速配置,其中SpringMVC的starter如下,导入这个starter即可导入web相关的所有依赖:
依赖代码:
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
可以看出我们导入了MVC相关jar包(记得刷新maven项目,下面操作不在提醒,请自觉刷新)
然后我们建立一个启动类 com.xiaohh.user.UserApplication
,代码如下:
package com.xiaohh.user;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
*
* SpringBoot 项目的启动类
*
*
* @author XiaoHH
* @version 1.0
* @date 2021-02-22 星期一 19:00:40
* @file UserApplication.java
*/
@SpringBootApplication
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class);
}
}
然后我们再建立一个 application.yml
在resources中,代码如下:
server:
port: 80 # 设置端口号为 80
servlet:
context-path: /user # 设置一下访问项目的上下文
然后我们编写一个测试用的 Controller 试一下是否搭建成功
package com.xiaohh.user.controllers;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
*
* 测试使用的 controller
*
*
* @author XiaoHH
* @version 1.0
* @date 2021-02-22 星期一 19:05:19
* @file TestController.java
*/
@RestController
@RequestMapping("/v1/test")
public class TestController {
@GetMapping
public String hello() {
return "hello";
}
}
接下来我们启动一下启动类,控制台看到如下界面表示启动成功
接下来我们访问一下这个 Controller 看一下是否成功,可以看到访问是没有问题的
然后我们再来创建对应的数据库:
SET NAMES `UTF8`;
DROP DATABASE IF EXISTS `demo_user`;
CREATE DATABASE `demo_user`;
USE `demo_user`;
-- 创建用户表
CREATE TABLE `user` (
`id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '用户 ID',
`username` VARCHAR(20) NOT NULL COMMENT '用户名',
`password` VARCHAR(20) NOT NULL COMMENT '密码',
`birthday` DATE COMMENT '出生日期'
);
和对应的实体类
package com.xiaohh.user.entities;
import lombok.*;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
*
* 对应数据库中的 user 表
*
*
* @author XiaoHH
* @version 1.0
* @date 2021-02-22 星期一 19:23:56
* @file User.java
*/
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Accessors(chain = true)
public class User implements Serializable {
/**
* 用户 ID
*/
private Long id;
/**
* 用户名
*/
private String username;
/**
* 密码
*/
private String password;
/**
* 出生日期
*/
@DateTimeFormat(pattern = "yyyy-MM-dd") // 前端传过来的数据格式
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") // 我们传给前端的数据格式
private Date birthday;
/**
* 计算年龄
*
* @return 年龄
*/
public int getAge() {
if (this.birthday == null) return 0;
// 现在的日期
Date now = new Date();
// 初始计算年龄
int age = now.getYear() - this.birthday.getYear();
// 设置成同年份然后进行比较
now.setYear(this.birthday.getYear());
// 将时间设置成当天的 0:00:00.000
now.setTime(now.getTime() - (now.getTime() % (1000 * 60 * 60 * 24)) - 1000 * 60 * 60 * 8);
// this.birthday.setTime(this.birthday.getTime() - (this.birthday.getTime() % (1000 * 60 * 60 * 24)) - 1000 * 60 * 60 * 8);
/*
this.birthday.compareTo(now);
如果 birthday 比 now 大,则返回1,如果小返回-1(代表生日还没过),相等则返回0
*/
age += this.birthday.compareTo(now);
return age;
}
}
注意添加lombok相关依赖
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
dependency>
然后接下来我们整合 mybatis,因为mybatis的starter不是spring官方提供的,那么我们就来mybatis官网来看一下如何编写starter:
代码如下:
<dependency>
<groupId>org.mybatis.spring.bootgroupId>
<artifactId>mybatis-spring-boot-starterartifactId>
<version>2.1.3version>
dependency>
顺便导入 MySQL 驱动包:
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
dependency>
然后在 application.yml
中配置数据源:
spring:
datasource: # 数据源配置
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/demo_user?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: root
然后配置mybatis:
mybatis:
mapper-locations: classpath:mybatis/mappers/UserMapper.xml
type-aliases-package: com.xiaohh.user.entities
接下来我们编写三层,因为代码量的原因我就直接将代码放在我的个人gitee上了,可自行下载,也可以按照地址克隆,要特别注意要在 Mapper 上加一个注解来代表这是一个 Mapper,其余的和普通的 SSM 没区别
我们现在来看一下Controller层的方法抬头
package com.xiaohh.user.controllers;
import com.xiaohh.user.entities.User;
import com.xiaohh.user.services.UserService;
import com.xiaohh.user.utils.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
*
* user 对象的前端控制类
*
*/
@RestController
@RequestMapping("/v1/user")
public class UserController {
/**
* 向数据库中添加一个数据的 Controller 接口
* @param user 用户对象
* @return 返回信息中包含是否成功
*/
@PostMapping
public R add(@RequestBody User user);
/**
* 用户对象列表查询
* @return 用户对象的列表
*/
@GetMapping
public R list();
/**
* 根据 id 获取用户对象
* @param id 用户 id
* @return 用户对象
*/
@GetMapping("/{id}")
public R get(@PathVariable("id") long id);
/**
* 根据用户 id 更新一个用户对象
* @param user 用户对象
* @return 是否成功
*/
@PutMapping
public R update(@RequestBody User user);
/**
* 根据用户 id 删除用户对象
* @param id 用户 id
* @return 是否成功
*/
@DeleteMapping("/{id}")
public R delete(@PathVariable("id") long id);
}
那么我们运行起来之后来测试这个端口,使用postman:
注意,所有 RequestBody
的添加路径在:
测试添加接口
url: http://127.0.0.1/user/v1/user
RequestBody: {"username": "XiaoHH", "password": "XiaoHHSuperme", "birthday": "2021-02-22"}
测试结果:
数据库:
测试用户对象列表查询
url: http://127.0.0.1/user/v1/user
数据库:
测试结果:
测试根据 id 获取用户对象
url: http://127.0.0.1/user/v1/user/1
数据库同上,测试结果:
其余的请自己测试,本文不演示了