HarryTruman

 

SpringBoot项目初创建记录

写在前面:这是一个记录springboot的笔记,在学完苍穹外卖后感觉很多内容没有掌握,于是对不熟悉的地方进行记录,方便以后查看。(up想到哪里写哪里,不定期更新)
git仓库:https://gitee.com/mrd12345/springboot4-demo.git

新建SpringBoot项目

name version
SpringBoot 4.0.6
Java 25

勾选:Lombok、Spring Web

创建如下的项目结构:

springboot-demo/
│
├── .idea/                          # IDEA 配置目录
│
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com.itstudent.springbootdemo/
│   │   │       ├── SpringbootDemoApplication.java          # 启动类
│   │   │       │
│   │   │       ├── common/                                  # 通用模块✅
│   │   │       │   └── response/                            # 响应相关
│   │   │       │       ├── ResultCode.java                  # 状态码枚举
│   │   │       │       ├── R.java                           # 统一返回体
│   │   │       │       └── PageR.java                       # 分页返回体
│   │   │       │
│   │   │       ├── controller/                              # 控制器层✅
│   │   │       │
│   │   │       ├── service/                                 # 服务层✅
│   │   │       │
│   │   │       ├── dao/                                     # 数据访问层✅
│   │   │       │
│   │   │       └── pojo/                                    # 数据对象✅
│   │   │           ├── entity/                              # 实体类(Java对象和数据库映射)
│   │   │           ├── dto/                                 # 数据传输对象
│   │   │           └── vo/                                  # 视图对象(返回前端)
│   │   │
│   │   └── resources/
│   │       ├── application.yaml                             # 应用配置文件✅
│   │       ├── static/                                      # 静态资源
│   │       └── template/                                    # 模板文件
│   │
│   └── test/
│       └── java/
│           └── com.itstudent.springbootdemo/
│               └── SpringbootDemoApplicationTests.java      # 测试类
│
├── target/                         # Maven 编译输出目录
│
├── pom.xml                         # Maven 配置文件 ✅
│
└── .gitignore                      # Git 忽略配置

application.yaml

这个文件里放着项目的配置,尤其是数据库的配置需要我们手动填写。

写了这些,数据库是MySQL5.7。

开始设置三大块:spring(包括应用名、MySQL);资源访问的url;日志输出。

spring:
    application:
        name: springboot-demo   # 应用名称,用于日志、监控等标识
    datasource:
        url: jdbc:mysql://localhost:3306/springboot-demo-db?useSSL=false&serverTimezone=UTC&characterEncoding=utf8
          # JDBC 连接地址说明:
          # - useSSL=false → 不使用 SSL 加密连接
          # - serverTimezone=UTC → 设置时区为 UTC
          # - characterEncoding=utf8 → 字符编码为 UTF-8
        username: root
        password: 123456
        driver-class-name: com.mysql.cj.jdbc.Driver


server:
    port: 8080
    servlet:
        context-path: / # 应用上下文路径,如果改为 /api,访问地址变为 http://localhost:8080/api

logging:
    level:
        root: INFO      # 根日志级别为 INFO    # 级别从低到高:TRACE < DEBUG < INFO < WARN < ERROR
        com.itstudent: DEBUG    # 你的项目包(com.itstudent)使用 DEBUG 级别
                                # 可以看到更详细的调试信息
        org.hibernate.SQL: DEBUG    # 显示 Hibernate 执行的 SQL 语句
                                    # 配合 show-sql: true 使用
        org.hibernate.type.descriptor.sql.BasicBinder: TRACE
        # 显示 SQL 语句中的参数值
        # 例如:binding parameter [1] as [VARCHAR] - [张三]
    pattern:
        console: '%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n'
          # 日志输出格式:
          # %d{yyyy-MM-dd HH:mm:ss} → 时间:2024-01-15 14:30:25
          # [%thread] → 线程名:[main]
          # %-5level → 日志级别:DEBUG (左对齐,占5个字符)
          # %logger{36} → 类名:com.itstudent.demo.Controller
          # %msg → 日志消息内容
          # %n → 换行符

模板文件

# =====================================================
# Spring Boot 配置文件模板(application.yaml)
# 使用说明:复制此模板,根据实际需求修改配置值
# =====================================================

spring:
    # ========== 应用基础配置 ==========
    application:
        name: your-app-name   # 修改为你的应用名称

    # ========== 数据源配置(使用 MySQL 时必填)==========
    datasource:
        url: jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8
        username: root              # 修改为你的数据库用户名
        password: your_password     # 修改为你的数据库密码
        driver-class-name: com.mysql.cj.jdbc.Driver

    # ========== JPA/Hibernate 配置 ==========
    jpa:
        hibernate:
            ddl-auto: update        # 开发环境用 update,生产环境用 validate 或 none
        show-sql: true              # 开发时开启便于调试,生产环境建议关闭
        properties:
            hibernate:
                dialect: org.hibernate.dialect.MySQLDialect
                format_sql: true    # 格式化 SQL,便于阅读
        database-platform: org.hibernate.dialect.MySQLDialect
        
# =========== Mybatis 设置 =============
mybatis:
    # XML映射文件的路径
    mapper-locations: classpath:mapper/*.xml
    configuration:
        # 控制台输出日志(调试专用)
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
        # 自动驼峰命名转换
        map-underscore-to-camel-case: true

# ========== 服务器配置 ==========
server:
    port: 8080                      # 修改为你需要的端口号
    servlet:
        context-path: /             # 应用访问路径前缀

# ========== 日志配置 ==========
logging:
    level:
        root: INFO                  # 全局日志级别
        com.yourpackage: DEBUG      # 修改为你的包名,开发时用 DEBUG
        org.hibernate.SQL: DEBUG    # 显示 SQL 语句
        org.hibernate.type.descriptor.sql.BasicBinder: TRACE  # 显示 SQL 参数
    pattern:
        console: '%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n'


# =====================================================
# 常用配置速查(按需添加)
# =====================================================

# 【多环境配置】激活特定环境
# spring:
#   profiles:
#     active: dev

# 【文件上传配置】
# spring:
#   servlet:
#     multipart:
#       max-file-size: 10MB
#       max-request-size: 10MB

# 【Redis 配置】
# spring:
#   data:
#     redis:
#       host: localhost
#       port: 6379
#       password: your_redis_password

# 【邮件配置】
# spring:
#   mail:
#     host: smtp.qq.com
#     port: 587
#     username: your_email@qq.com
#     password: your_smtp_password

# 【定时任务配置】
# spring:
#   task:
#     scheduling:
#       pool:
#         size: 5

# 【Jackson JSON 配置】
# spring:
#   jackson:
#     date-format: yyyy-MM-dd HH:mm:ss
#     time-zone: Asia/Shanghai
#     serialization:
#       write-dates-as-timestamps: false

统一返回体R

为了标准化API响应格式,无论前端的请求结果是成功还是失败,都不会影响返回固定的格式。这样前端就可以根据code和message进行处理或作为提示信息相应在用户端。

这里由lingma进行了优化:

package com.itstudent.springbootdemo.common.response;

import lombok.Data;

import java.io.Serializable;
import java.time.Instant;

@Data
public class R<T> implements Serializable {
    private Integer code;
    private String message;
    private T data;
    private Long timestamp;

    // 私有构造,避免直接 new
    private R(Integer code, String message, T data) {
        this.code = code;
        this.message = message;
        this.data = data;
        this.timestamp = Instant.now().toEpochMilli();
    }

    // ========== 成功响应 ==========

    // 成功响应:无数据
    public static <T> R<T> success() {
        return new R<>(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMessage(), null);
    }

    // 成功响应:带数据
    public static <T> R<T> success(T data) {
        return new R<>(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMessage(), data);
    }

    // 成功响应:自定义消息 + 数据
    public static <T> R<T> success(String message, T data) {
        return new R<>(ResultCode.SUCCESS.getCode(), message, data);
    }

    // ========== 错误响应 ==========

    // 错误响应:使用枚举定义的状态
    public static <T> R<T> error(ResultCode code) {
        return new R<>(code.getCode(), code.getMessage(), null);
    }

    // 错误响应:自定义状态码和消息
    public static <T> R<T> error(int code, String message) {
        return new R<>(code, message, null);
    }

    // 错误响应:基于枚举 + 自定义消息覆盖
    public static <T> R<T> error(ResultCode resultCode, String customMessage) {
        return new R<>(resultCode.getCode(), customMessage, null);
    }

    // ========== 分页响应 ==========

    // 分页响应:便捷方法
    public static <T> R<PageR<T>> page(PageR<T> pageData) {
        return new R<>(ResultCode.SUCCESS.getCode(), "查询成功", pageData);
    }
}

这样可以做到:

// 1. 标准成功响应
return R.success(studentList);

// 2. 自定义成功消息
return R.success("查询到" + studentList.size() + "个学生", studentList);

// 3. 分页查询
PageR<Student> page = new PageR<>(students, total, pageNum, pageSize);
return R.page(page);

// 4. 参数校验失败
return R.error(ResultCode.PARAM_ERROR);

// 5. 自定义错误消息
return R.error(ResultCode.AUTH_FAILED, "Token已过期,请重新登录");

// 6. 系统异常
return R.error(500, "数据库连接超时");

Restful风格

Qwen3.6-Plus说:RESTful 是一种软件架构风格(由 Roy Fielding 在 2000 年提出),它不是协议、也不是标准,而是一组约束和设计原则。在现代 Web API 开发中,“RESTful 风格”通常指:以资源为中心、基于 HTTP 协议、使用标准 HTTP 方法表达操作意图、通过 URI 定位资源、利用 HTTP 状态码反馈结果 的 API 设计规范。

核心设计原则:

原则 说明 开发体现
资源导向 一切皆资源(用户、订单、商品),用 URI 唯一标识 URI 中只放名词,不放动词
统一接口 用 HTTP 方法表达操作意图 GET 查、POST 增、PUT 全量改、PATCH 局部改、DELETE
无状态 每次请求携带完整上下文,服务端不保存会话 不用 HttpSession,改用 Token/JWT
表现层分离 数据格式与资源解耦 通常用 JSON,通过 Content-Type / Accept 协商
标准状态码 用 HTTP 状态码表达请求结果 成功用 2xx,客户端错 4xx,服务端错 5xx

RESTful 风格,以“用户管理”为例:

操作 RESTful 风格 HTTP 方法
获取用户列表 /api/users GET
获取单个用户 /api/users/1 GET
查询特定状态订单 /api/orders?status=1&page=1&size=20 GET
创建用户 /api/users POST
更新用户 /api/users/1 PUT / PATCH
删除用户 /api/users/1 DELETE

如何接收请求参数?

1、/user/{id},参数在url路径中,使用@PathVariable Long Id接收

2、/user?page=1&size=20,参数以Query形式来,直接定义Integer page, Integer size接收,或者用含有这些属性的对象接收

ORM框架 - Spring Data JPA

Spring Data JPA 是 Spring Data 项目的一部分,它提供了一种简化的数据访问方式,用于与关系型数据库进行交互。它基于 Java Persistence API(JPA) 标准,并提供了一套简洁的 API 和注解,使开发人员能够通过简单的 Java 对象来表示数据库表,并通过自动生成的 SQL 语句执行常见的 CRUD 操作。Spring Data JPA 通过封装 JPA 的复杂性,简化了数据访问层的开发工作,使开发人员能够更专注于业务逻辑的实现。它还提供了丰富的查询方法的定义、分页和排序支持、事务管理等功能,使开发人员能够更方便地进行数据访问和操作。(来自官方手册)

想用它?

第一步:pom.xml中加入:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

它的底层默认基于Hibernate实现,因此在关联的依赖中也会把hibernate-core加进来。

第二步,在application.yaml中加入:

spring:
	jpa:
        hibernate:
            ddl-auto: update
              # 数据库表结构自动更新策略:
              # - update → 自动创建/更新表结构(保留已有数据)
              # - create → 每次启动都删除重建表(数据会丢失)
              # - create-drop → 启动创建,关闭时删除
              # - validate → 只验证表结构,不修改
              # - none → 不做任何操作
        show-sql: true  # 在控制台打印执行的 SQL 语句
        properties:
            hibernate:
                # Hibernate 方言,告诉 Hibernate 使用 MySQL 特有的 SQL 语法
                format_sql: true
                # 格式化输出的 SQL 语句,使其更易阅读

第三步:创建entity实体类,用注解将Java对象和MySQL中的关系进行映射:

package com.itstudent.springbootdemo.pojo.entity;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDate;
import java.time.LocalDateTime;

@Entity	// 标记这个类的实例要被持久化到数据库中
@Table(name = "user")	// 表示这个类的实例要被映射到数据库的哪张表中
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {

    /**
     * 物理主键
     */
    @Id		// 主键标记
    @GeneratedValue(strategy = GenerationType.IDENTITY)		// 主键生成策略:这里有好几种,MySQL建议IDENTITY
    @Column(name = "id", columnDefinition = "INT UNSIGNED COMMENT '物理主键'")	// 实体类的属性和数据表字段的映射	
    private Long id;

    /**
     * 姓名
     */
    @Column(name = "name", nullable = false, length = 50, columnDefinition = "VARCHAR(50) COMMENT '姓名'")
    private String name;

    /**
     * 性别:1-男,0-女
     */
    @Column(name = "gender", columnDefinition = "TINYINT COMMENT '性别:1-男,0-女'")
    private Integer gender;

}

第三步:dao层

这里的每一个实体对应的 Repository 接口需要继承 JpaRepository(或 PagingAndSortingRepositoryCrudRepository),一般命名为 “实体名” + “Repository”,在这里一般的增删改查已经全部自动实现完毕......除了......复杂的查询(如多表关联、条件组合),如果有特别的需要(比如根据name属性查询一行数据并封装为Java对象)就需要根据规定写一行"findByName"这样的方法,service就可以调用并返回。

package com.itstudent.springbootdemo.dao;

import com.itstudent.springbootdemo.pojo.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends JpaRepository<User, Long> {

    User findByName(String name);

}

...感觉 jpa用起来还是比较麻烦和恶心的,准备用回 mybatis。

ORM框架 - Mybatis

官方文档( ̄︶ ̄)↗ 

有关于mybatis是什么就忽略了,详情看官方的介绍。

mybatis的版本和spring版本的对应如下表所示,

Spring Boot v3.5.7使用到的框架是Spring v6.2.12

Spring Boot v4.0.6使用到的框架是Spring v7.0.7

a1

第一步,使用Maven,在pom.xml文件中加入:

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>4.0.0</version>
</dependency>

第二步,application.yaml中加入:

mybatis:
    # XML映射文件的路径
    mapper-locations: classpath:mapper/*.xml
    configuration:
        # 控制台输出日志(调试专用)
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
        # 自动驼峰命名转换
        map-underscore-to-camel-case: true

所有配置介绍:

第三步,dao层(明显比 JPA简洁得多口圭)

@Mapper		// MyBatis-Spring-Boot-Starter 将默认搜寻带有 @Mapper 注解的 mapper 接口。
public interface UserMapper{

    @Select("select * from user where id = #{id}")		// 注解中写SQL语句
    User findById(Long id);

    @Select("select * from user where name = #{name}")
    User findByName(String name);
}

第四步,service层如何调用?(只需要@autowired注入 + 调用方法即可)

@Service
public class UserServiceImpl implements UserService {
    
    @Autowired
    private UserMapper userMapper;

    @Override
    public User findById(Long id) {
        return userMapper.findById(id);
    }

    @Override
    public User findByName(String name) {
        return userMapper.findByName(name);
    }
    
}

posted on 2026-05-16 15:25  HarryTruman  阅读(22)  评论(0)    收藏  举报

导航