# springboot-demo
**Repository Path**: BIT_Worker/springboot-demo
## Basic Information
- **Project Name**: springboot-demo
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2022-01-20
- **Last Updated**: 2022-01-20
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 准备数据库
```sql
/*
Navicat Premium Data Transfer
Source Server : localhost
Source Server Type : MySQL
Source Server Version : 80017
Source Host : localhost:3306
Source Schema : springboot
Target Server Type : MySQL
Target Server Version : 80017
File Encoding : 65001
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for book
-- ----------------------------
DROP TABLE IF EXISTS `book`;
CREATE TABLE `book` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id',
`category_id` int(11) NOT NULL COMMENT '分类id',
`name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '名称',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` tinyint(4) NOT NULL DEFAULT 0 COMMENT '逻辑删除',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of book
-- ----------------------------
INSERT INTO `book` (`category_id`, `name`) VALUES (1, 'Java核心技术');
INSERT INTO `book` (`category_id`, `name`) VALUES (1, 'Vue.js实战');
INSERT INTO `book` (`category_id`, `name`) VALUES (2, '十万个为什么');
INSERT INTO `book` (`category_id`, `name`) VALUES (2, '恐龙时代');
INSERT INTO `book` (`category_id`, `name`) VALUES (3, '三体');
INSERT INTO `book` (`category_id`, `name`) VALUES (3, '西游记');
-- ----------------------------
-- Table structure for category
-- ----------------------------
DROP TABLE IF EXISTS `category`;
CREATE TABLE `category` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '分类主键',
`name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '分类名称',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of category
-- ----------------------------
INSERT INTO `category` VALUES (1, '计算机编程');
INSERT INTO `category` VALUES (2, '科普');
INSERT INTO `category` VALUES (3, '小说');
```
# 逆向生成代码
使用`mybatis-plus-generator`项目生成代码
# 创建项目
创建`springboot`项目



将生成的代码复制到该项目中
# 导入依赖
项目创建成功后修改`parent`标签下`spring-boot`的版本
```xml
org.springframework.boot
spring-boot-starter-parent
2.5.0
```
加入`mybatis-plus`的依赖
```xml
com.baomidou
mybatis-plus-boot-starter
3.5.0
```
完整`pom.xml`文件如下
```xml
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.5.0
com.bjsy
springboot-demo
0.0.1-SNAPSHOT
springboot-demo
Demo project for Spring Boot
1.8
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-devtools
runtime
true
org.springframework.boot
spring-boot-configuration-processor
true
mysql
mysql-connector-java
runtime
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.2.1
com.baomidou
mybatis-plus-boot-starter
3.5.0
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-maven-plugin
org.projectlombok
lombok
```
# 配置文件
将`application.properties`改为`application.yaml`,内容如下
```yaml
# 设置服务的端口
server:
port: 8080
# spring相关配置
spring:
# 配置数据库信息
datasource:
# 驱动
driver-class-name: com.mysql.cj.jdbc.Driver
# 链接
url: jdbc:mysql://localhost:3306/springboot?serverTimeZone=Asia/Shanghai
# 用户名
username: root
# 密码
password: 1234
# mybatis-plus相关配置
mybatis-plus:
configuration:
# 开启日志打印
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 开启下划线转驼峰
map-underscore-to-camel-case: true
global-config:
db-config:
# 设置所有表的主键为自增类型
id-type: auto
# 设置逻辑删除字段名称
logic-delete-field: deleted
# 逻辑删除
logic-delete-value: 1
# 逻辑未删除
logic-not-delete-value: 0
```
# 获取所有图书信息接口
在`BookController.java`中添加如下代码
```java
@Autowired
private BookService bookService;
@GetMapping
public Result getAllBook() {
List bookList = bookService.list();
return bookList;
}
```
启动项目,测试,在浏览器输入`localhost:8080/book`查看结果
# 统一返回数据格式
新建`Result.java`
```java
package com.bjsy.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 统一返回对象
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result {
//返回码
private Integer code;
//返回消息
private String msg;
//返回数据
private Object data;
//操作成功
public static Result success(Object data) {
return new Result(200, "success", data);
}
//操作失败
public static Result fail(Integer code, String msg) {
return new Result(code, msg, null);
}
}
```
修改代码
```java
@GetMapping
public Result getAllBook() {
List bookList = bookService.list();
if (!CollectionUtils.isEmpty(bookList)) {
return Result.success(bookList);
}
return Result.fail(10001, "获取失败");
}
```
浏览器测试,发现返回的时间多了个`T`
# 解决返回时间格式
新建`LocalDateTimeConfig.java`
```java
package com.bjsy.config;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
/**
* 配置类,用来解决返回给前端的时间中间有个T
*/
@Configuration
public class LocalDateTimeConfig {
@Bean
public LocalDateTimeSerializer localDateTimeDeserializer() {
return new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}
@Bean
public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
return builder -> builder.serializerByType(LocalDateTime.class, localDateTimeDeserializer());
}
}
```
# 新增图书接口
添加代码
```java
/**
* 插入书的信息(新增书)
* @param book
* @return
*/
@PostMapping
public Result insertBook(@RequestBody Book book) {
boolean flag = bookService.save(book);
if (flag) {
return Result.success(null);
}
return Result.fail(10002, "保存失败");
}
```
使用`PostMan`进行测试

# 删除图书接口
添加代码
```java
/**
* 根据书的id删除
* @param id
* @return
*/
@DeleteMapping("/{id}")
public Result deleteBook(@PathVariable Integer id) {
boolean flag = bookService.removeById(id);
if (flag) {
return Result.success(null);
}
return Result.fail(10003, "删除失败");
}
```
测试

# 更新图书信息接口
添加代码
```java
/**
* 根据id跟新书的信息
* @param book
* @return
*/
@PutMapping
public Result updateBook(@RequestBody Book book) {
boolean flag = bookService.updateById(book);
if (flag) {
return Result.success(null);
}
return Result.fail(10004, "更新失败");
}
```
测试

# 多表查询
新建`BookVo.java`
```java
package com.bjsy.vo;
import lombok.Data;
/**
* 视图对象,用于封装需要返回给前端的数据
*/
@Data
public class BookVo {
Integer id;
String category;
String name;
}
```
修改`BookController.java`中的代码
```java
@GetMapping
public Result getAllBook() {
return bookService.getAllBook();
}
```
在`BookService.java`中添加代码
```java
/**
* 获取所有书的信息
* @return
*/
Result getAllBook();
```
在`BookServiceImpl.java`中添加代码
```java
package com.bjsy.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bjsy.mapper.BookMapper;
import com.bjsy.pojo.Book;
import com.bjsy.service.BookService;
import com.bjsy.vo.BookVo;
import com.bjsy.vo.Result;
import com.bjsy.vo.ResultEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.List;
/**
*
* 服务实现类
*
*
* @author 作者
* @since 2022-01-19
*/
@Service
public class BookServiceImpl extends ServiceImpl implements BookService {
//获取映射对象
//private BookMapper bookMapper = new BookMapper();
@Autowired
private BookMapper bookMapper;
@Override
public Result getAllBook() {
List bookVoList = bookMapper.getAllBook();
//判空
if (!CollectionUtils.isEmpty(bookVoList)) {
return Result.success(bookVoList);
}
return Result.fail(10001, "查询失败");
}
}
```
在`BookMapper.java`中添加代码
```java
List getAllBook();
```
在`BookMapper.xml`中添加代码
```xml
```
测试

# 优化返回状态码
新建`ResultEnum.java`
```java
package com.bjsy.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
/**
* 返回状态码和信息枚举
*/
@Getter
@NoArgsConstructor
@AllArgsConstructor
public enum ResultEnum {
QUERY_FAIL(10001, "获取信息失败"),
SAVA_FAIL(10002, "保存失败"),
DELETE_FAIL(10003, "删除失败"),
UPDATE_FAIL(10004, "更新失败")
;
private Integer code;
private String msg;
}
```
在`Result.java`中添加代码
```java
public static Result fail(ResultEnum resultEnum) {
return new Result(resultEnum.getCode(), resultEnum.getMsg(), null);
}
```
修改原来返回给前端结果的代码
# 查询分类的接口
在`CategoryController.java`中添加代码
```java
@Autowired
private CategoryService categoryService;
@GetMapping
public Result getAllCategory() {
List categoryList = categoryService.list();
if (!CollectionUtils.isEmpty(categoryList)) {
return Result.success(categoryList);
}
return Result.fail(10005, "查询分类失败");
}
```
测试
# 跨域配置
新建类`WebMVCConfig.java`
```java
package com.bjsy.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebMVCConfig implements WebMvcConfigurer {
//跨域配置
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**") //所有接口支持跨域
.allowedOrigins("*") //允许所有请求
.allowedMethods("*") //允许所有方法
.maxAge(3600); //最大跨域时间
}
}
```
# 前端
```html
springboot-demo
获取图书列表
添加图书
删除
```