代码改变世界

详细介绍:Spring Boot 分模块:从数据库到前端接口

2025-11-16 16:04  tlnshuju  阅读(13)  评论(0)    收藏  举报

目录

1、引言:为什么要分模块开发?

2、准备环境

2.1 工具清单:

3、创建SpringBoot项目的子模块

3.1  第一步:在IDEA中创建空项目​编辑

3.2 新建项目子模块mybatis

3.3 运行 mybatis模块的启动类,检查是否正常

3.4 Mysql数据库配置、添加数据

3.4.1 创建数据库连接

3.4.2 创建mybatis数据库

3.4.3 创建user表,添加表的属性字段

3.4.4 添加数据

3.5 新建包,资源目录,编写代码

3.5.1 创建controller、service、mapper、domain包

3.5.2 新建mapper资源目录

3.5.3 编写代码 配置数据库连接和mybatis

1、数据库连接配置(spring.datasource)

2. MyBatis配置(mybatis)

3.5.4 编写实体类 User.java(数据库表映射)

3.5.5 编写 Mapper 接口 UserMapper.java

3.5.7 编写 Mapper XML 文件 UserMapper.xml

3.5.8 编写 Service 层 UserService.java

3.5.9 编写 Controller 层 HelloController.java

3.6 添加必要注解

3.6.1 找到Spring Boot 启动类(MybatisApplication.java)

3.6.2 添加 @MapperScan 注解吧,编译代码、构建程序、执行SpringBoot程序

3.7 启动项目并测试

3.8 总结


1、引言:为什么要分模块开发?

    新手开发常把所有代码堆在一起,导致后期维护困难。分模块开发 就像整理衣柜:把「衣服(代码)」按「上衣(实体)、裤子(接口)、袜子(工具)」分类存放,逻辑清晰、复用性高。本文以 「MyBatis读取数据库数据并返回给前端」

2、准备环境

2.1 工具清单:

  • JDK:17(或8/11,推荐17)
  • IDE:IntelliJ IDEA 2023(社区版免费)
  • 数据库:MySQL 8.0
  • 构建工具:Maven(IDEA自带)
  • API测试:Postman(可选,浏览器也可)

3、创建SpringBoot项目的子模块

3.1  第一步:在IDEA中创建空项目

3.2 新建项目子模块mybatis

3.3 运行 mybatis模块的启动类,检查是否正常

3.4 Mysql数据库配置、添加数据

3.4.1 创建数据库连接

3.4.2 创建mybatis数据库

3.4.3 创建user表,添加表的属性字段

3.4.4 添加数据

3.5 新建包,资源目录,编写代码

3.5.1 创建controller、service、mapper、domain包

3.5.2 新建mapper资源目录

3.5.3 编写代码 配置数据库连接和mybatis
1、数据库连接配置(spring.datasource
配置项说明
driver-class-nameMySQL 8.0+ 必须用 com.mysql.cj.jdbc.Driver
urljdbc:mysql://localhost:3306/数据库名?参数 - localhost:3306:本地MySQL地址和端口(默认3306) - mybatis:你的数据库名) - serverTimezone=Asia/Shanghai:时区必须设置(否则报错,用上海时区避免乱码)
username/password你的MySQL登录信息( root/123456
2. MyBatis配置(mybatis
配置项说明
type-aliases-package

实体类(如 User.java)所在的包路径,例如: 如果你 User.java 的包是 com.example.mybatis.domain,则填 com.example.mybatis.domain

✅ 作用:后续在 XML 中写 resultType="User" 即可,无需写全类名 com.example.mybatis.domain.User

mapper-locationsMyBatis 的 XML 映射文件路径,classpath:mapper/*.xml 表示扫描 resources/mapper 目录下所有 .xml 文件
map-underscore-to-camel-case开启下划线转驼峰(例如数据库字段 create_time 自动对应 Java 实体类的 createTime 属性,无需手动配置 resultMap

# 服务器端口(可选,默认8080,可省略)
server:
  port: 8080
# 数据库连接配置
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver  # MySQL驱动
    url: jdbc:mysql://localhost:3306/mybatis?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8  # 数据库URL
    username: root
    password: 123456
# MyBatis配置
mybatis:
  type-aliases-package: org.example.mybatis.domain  # 实体类所在包(User类的路径,根据你的包名调整!)
  mapper-locations: classpath:mapper/*.xml  # Mapper XML文件路径(resources/mapper下的所有.xml文件)
  configuration:
    map-underscore-to-camel-case: true  # 自动将数据库下划线字段转为Java驼峰命名(如create_time → createTime)
3.5.4 编写实体类 User.java(数据库表映射)

作用:映射数据库 user 表,字段名与表字段一一对应(驼峰命名自动匹配下划线字段,如 create_timecreateTime)。

package com.example.mybatis.domain;  // 包路径必须正确(根据你的项目调整!)
import java.time.LocalDateTime;  // Java 8+ 日期类型,对应数据库 DATETIME
public class User {
    // 字段名必须与数据库表字段一致(忽略大小写,但推荐小写开头+驼峰)
    private Long id;              // 主键(BIGINT → Long)
    private String username;      // 用户名(VARCHAR → String)
    private String password;      // 密码(VARCHAR → String)
    private String email;         // 邮箱(可为null,用String)
    private Integer age;          // 年龄(INT → Integer,可为null)
    private LocalDateTime createTime;  // 创建时间(DATETIME → LocalDateTime)
    // Getter和Setter(必须!MyBatis通过getter/setter赋值,否则字段值为null)
    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }
    public String getUsername() { return username; }
    public void setUsername(String username) { this.username = username; }
    public String getPassword() { return password; }
    public void setPassword(String password) { this.password = password; }
    public String getEmail() { return email; }
    public void setEmail(String email) { this.email = email; }
    public Integer getAge() { return age; }
    public void setAge(Integer age) { this.age = age; }
    public LocalDateTime getCreateTime() { return createTime; }
    public void setCreateTime(LocalDateTime createTime) { this.createTime = createTime; }
    // 可选:重写toString(),方便打印对象信息(调试用)
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", email='" + email + '\'' +
                ", age=" + age +
                ", createTime=" + createTime +
                '}';
    }
}

3.5.5 编写 Mapper 接口 UserMapper.java

作用:定义数据库操作方法(如查询用户),由 MyBatis 自动生成实现类(通过 XML 文件或注解配置 SQL)。

package com.example.mybatis.mapper;  // 包路径必须与启动类 @MapperScan 扫描的路径一致!
import com.example.mybatis.domain.User;  // 导入实体类
import java.util.List;  // 用于返回多个用户
// 无需添加 @Mapper 注解(因为启动类已用 @MapperScan("com.example.mybatis.mapper") 扫描该包)
public interface UserMapper {
    // 查询所有用户(方法名必须与 UserMapper.xml 中的 
        
        SELECT * FROM user;
    
3.5.8 编写 Service 层 UserService.java

作用:处理业务逻辑

package com.example.mybatis.service;
import com.example.mybatis.domain.User;
import com.example.mybatis.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service  // 标记为 Service 层组件,由 Spring 管理
public class UserService {
    // 注入 UserMapper(MyBatis 动态代理生成的实现类)
    @Autowired  // 自动装配,依赖启动类 @MapperScan 扫描到 UserMapper
    private UserMapper userMapper;
    // 业务方法:获取所有用户
    public List getAllUsers() {
        // 直接调用 Mapper 的方法(实际项目中可添加权限校验、数据过滤等逻辑)
        return userMapper.selectAll();
    }
}
3.5.9 编写 Controller 层 HelloController.java

作用:定义 HTTP 接口,接收前端请求并返回数据(此处用 @GetMapping 定义 GET 接口)

package com.example.mybatis.controller;
import com.example.mybatis.domain.User;
import com.example.mybatis.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController  // 组合注解:@Controller + @ResponseBody(返回 JSON 数据,无需视图)
public class HelloController {
    // 注入 Service 层对象
    @Autowired
    private UserService userService;
    // 定义 GET 接口:http://localhost:8080/hello
    @GetMapping("/hello")  // 接口路径,前端通过该路径访问
    public List hello() {
        // 调用 Service 层方法获取所有用户,返回给前端(自动转为 JSON)
        return userService.getAllUsers();
    }
}

3.6 添加必要注解

3.6.1 找到Spring Boot 启动类(MybatisApplication.java
3.6.2 添加 @MapperScan 注解吧,编译代码、构建程序、执行SpringBoot程序

  • 作用:告诉 Spring 去哪里扫描 MyBatis 的 Mapper 接口(如 UserMapper.java),并自动创建实现类(由 MyBatis 动态代理生成),放入 Spring 容器中,后续 @Autowired 才能注入成功。
  • 扫描路径:必须是 Mapper 接口所在的包路径

3.7 启动项目并测试

3.8 总结

- 数据库表设计 - Spring Boot 分层编码 - 接口测试与验证

--分层架构(Controller → Service → Mapper)

- - Controller层 - 作用:接收HTTP请求,返回响应

-- 核心注解:@RestController、@GetMapping

-- 示例:UserController.getAllUsers()

-- Service层 - 作用:处理业务逻辑,调用Mapper

-- 核心注解:@Service、@Autowired

-- 结构:接口(UserService)+ 实现类(UserServiceImpl)

-- Mapper层 - 作用:定义数据库操作接口

-- 核心注解:@Mapper(接口)

-- 映射文件:UserMapper.xml(编写SQL)

--MyBatis映射关系(接口 → XML → 数据库表)

- - UserMapper接口 - 方法:selectAll()(对应SQL查询

- - UserMapper.xml - namespace:绑定接口全类名

-- select标签:id=方法名,resultType=返回实体类

-- SQL语句:SELECT * FROM user

-- 数据库表(user)

-- 字段与实体类User属性一一映射(如id → id,username → username)

分层核心注解作用依赖注入目标
Controller@RestController标记为控制器,返回 JSONService 接口
Service@Service标记为业务层组件,处理逻辑Mapper 接口
Mapper@Mapper标记为 MyBatis 映射接口,操作数据库无(被 Service 依赖)
Domain@Data(Lombok)简化实体类代码,自动生成 getter/setter无(数据载体)