1
2
3
4
5
6
7
8
9
10
11
src
└── main
├── java
│ └── com.example.demo
│ ├── DemoApplication.java // 启动类
│ ├── controller // 控制层
│ ├── service // 业务逻辑层
│ └── repository // 数据访问层
└── resources
├── application.yml // 配置文件
└── static / templates // 静态资源 / 模板页面

Spring Boot 核心特性

  1. 自动配置(Auto Configuration)
    根据你引入的依赖,自动帮你配置相关组件(比如引入 spring-boot-starter-web,就自动配置了 Tomcat、SpringMVC)。

  2. 起步依赖(Starter)
    官方提供了很多 spring-boot-starter-xxx,例如:

spring-boot-starter-web:Web 开发(包含 SpringMVC + Tomcat)

spring-boot-starter-data-jpa:数据库 JPA

spring-boot-starter-test:测试

  1. 内嵌服务器
    不需要单独安装 Tomcat,Spring Boot 自带,可以直接打成 jar 包运行。

  2. Actuator 监控
    提供了应用运行时的健康检查、监控指标接口。


Spring Boot 常见注解

  • @SpringBootApplication:入口类注解,包含了:

    • @Configuration:配置类

    • @EnableAutoConfiguration:开启自动配置

    • @ComponentScan:开启包扫描

  • @RestController:返回 JSON 的控制器

  • @RequestMapping / @GetMapping / @PostMapping:映射 URL

  • @Autowired:自动注入 Bean

  • @Service / @Repository / @Component:定义 Bean 类型


1
2
3
4
5
6
7
8
9
10
11
12
server:
port: 8080

spring:
datasource:
url: jdbc:mysql://localhost:3306/test
username: root
password: 123456
jpa:
hibernate:
ddl-auto: update # 自动建表 update/create
show-sql: true # 打印 SQL

JPA

全称:Java Persistence API
作用:是一套 Java 的 ORM(对象关系映射)规范,用于把 Java 对象和数据库表关联起来。

核心概念

  1. 实体类(Entity)
    用 @Entity 标注的类,对应数据库的一张表。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @Entity
    @Table(name = "users")
    public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String username;
    private String password;
    }

  2. 实体管理器(EntityManager)
    JPA 操作数据库的核心接口,类似于 JDBC 的 Connection。

  3. 持久化单元(Persistence Unit)
    定义数据库连接、JPA 提供者等信息(在 Spring Boot 里一般写在 application.yml)。

常用注解

  • @Entity:声明一个实体类

  • @Table(name = “xxx”):映射数据库表名

  • @Id:主键

  • @GeneratedValue:主键生成策略(如自增)

  • @Column(name = “xxx”):指定数据库字段名

  • @OneToMany、@ManyToOne、@ManyToMany:定义表之间的关系

在Spring Boot中用JPA

  1. 引入依赖、配置参数
  2. 定义 Repository 接口
    1
    2
    3
    4
    public interface UserRepository extends JpaRepository<实体类名, 主键类型> {
    User findByUsername(String username);
    }

简单查询不需要写sql

1
2
3
User findByUsername(String username);
List<User> findByAgeGreaterThan(int age);
List<User> findByUsernameLike(String username);

复杂查询时

  1. 用 @Query + JPQL

    1
    2
    3
    4
    5
    public interface UserRepository extends JpaRepository<User, Long> {

    @Query("SELECT u FROM User u WHERE u.username = ?1 AND u.password = ?2")
    User login(String username, String password);
    }
  2. 用 @Query + 原生 SQL
    如果 JPQL 表达不出来,可以直接写数据库 SQL:

    1
    2
    3
    4
    5
    public interface UserRepository extends JpaRepository<User, Long> {
    // nativeQuery = true 表示使用原生 SQL。
    @Query(value = "SELECT * FROM users WHERE username = ?1 LIMIT 1", nativeQuery = true)
    User findByUsernameNative(String username);
    }
  3. 用 @NamedQuery
    在实体类上定义查询:

    1
    2
    3
    4
    @Entity
    @NamedQuery(name = "User.findByUsername",
    query = "SELECT u FROM User u WHERE u.username = ?1")
    public class User { ... }
  4. 用 Specification(动态查询)
    Spring Data JPA 提供了 Specification 接口,可以用 Java 代码拼装复杂查询(适合多条件动态查询)。

    1
    2
    3
    List<User> users = userRepository.findAll((root, query, cb) ->
    cb.equal(root.get("username"), "Tom")
    );