Spring Boot 分模块:从数据库到前端接口

目录

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

2、准备环境

[2.1 工具清单:](#2.1 工具清单:)

3、创建SpringBoot项目的子模块

[3.1 第一步:在IDEA中创建空项目​编辑](#3.1 第一步:在IDEA中创建空项目编辑)

[3.2 新建项目子模块mybatis](#3.2 新建项目子模块mybatis)

[3.3 运行 mybatis模块的启动类,检查是否正常](#3.3 运行 mybatis模块的启动类,检查是否正常)

[3.4 Mysql数据库配置、添加数据](#3.4 Mysql数据库配置、添加数据)

[3.4.1 创建数据库连接](#3.4.1 创建数据库连接)

[3.4.2 创建mybatis数据库](#3.4.2 创建mybatis数据库)

[3.4.3 创建user表,添加表的属性字段](#3.4.3 创建user表,添加表的属性字段)

[3.4.4 添加数据](#3.4.4 添加数据)

[3.5 新建包,资源目录,编写代码](#3.5 新建包,资源目录,编写代码)

[3.5.1 创建controller、service、mapper、domain包](#3.5.1 创建controller、service、mapper、domain包)

[3.5.2 新建mapper资源目录](#3.5.2 新建mapper资源目录)

[3.5.3 编写代码 配置数据库连接和mybatis](#3.5.3 编写代码 配置数据库连接和mybatis)

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

[2. MyBatis配置(mybatis)](#2. MyBatis配置(mybatis))

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

[3.5.5 编写 Mapper 接口 UserMapper.java](#3.5.5 编写 Mapper 接口 UserMapper.java)

[3.5.7 编写 Mapper XML 文件 UserMapper.xml](#3.5.7 编写 Mapper XML 文件 UserMapper.xml)

[3.5.8 编写 Service 层 UserService.java](#3.5.8 编写 Service 层 UserService.java)

[3.5.9 编写 Controller 层 HelloController.java](#3.5.9 编写 Controller 层 HelloController.java)

[3.6 添加必要注解](#3.6 添加必要注解)

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

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

[3.7 启动项目并测试](#3.7 启动项目并测试)

[3.8 总结](#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-name MySQL 8.0+ 必须用 com.mysql.cj.jdbc.Driver
url jdbc: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-locations MyBatis 的 XML 映射文件路径,classpath:mapper/*.xml 表示扫描 resources/mapper 目录下所有 .xml 文件
map-underscore-to-camel-case 开启下划线转驼峰(例如数据库字段 create_time 自动对应 Java 实体类的 createTime 属性,无需手动配置 resultMap
java 复制代码
# 服务器端口(可选,默认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)。

java 复制代码
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)。

java 复制代码
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 id="selectAll"> 一致)
    List<User> selectAll();  // 返回值为 List<User>,对应多条用户数据
}
3.5.7 编写 Mapper XML 文件 UserMapper.xml

作用 :配置 SQL 语句,与 UserMapper.java 接口的方法绑定(MyBatis 的核心配置)。

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!-- namespace:必须是 Mapper 接口的全类名(包名+类名),否则无法绑定 -->
<mapper namespace="com.example.mybatis.mapper.UserMapper">

    <!-- 查询所有用户:id=接口中的方法名,resultType=返回的实体类全类名(或别名) -->
    <!-- 由于 application.yml 中配置了 mybatis.type-aliases-package=com.example.mybatis.domain,因此这里可以直接写实体类名 "User"(无需全类名) -->
    <select id="selectAll" resultType="User">
        <!-- SQL语句:查询 user 表所有字段 -->
        SELECT * FROM user;
    </select>

</mapper>
3.5.8 编写 Service 层 UserService.java

作用:处理业务逻辑

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<User> getAllUsers() {
        // 直接调用 Mapper 的方法(实际项目中可添加权限校验、数据过滤等逻辑)
        return userMapper.selectAll();
    }
}
3.5.9 编写 Controller 层 HelloController.java

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

java 复制代码
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<User> 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 标记为控制器,返回 JSON Service 接口
Service @Service 标记为业务层组件,处理逻辑 Mapper 接口
Mapper @Mapper 标记为 MyBatis 映射接口,操作数据库 无(被 Service 依赖)
Domain @Data(Lombok) 简化实体类代码,自动生成 getter/setter 无(数据载体)
相关推荐
廋到被风吹走12 分钟前
【数据库】【Redis】定位、优势、场景与持久化机制解析
数据库·redis·缓存
全靠bug跑1 小时前
Spring Cloud OpenFeign 实战三部曲:快速集成 · 连接池优化 · 客户端抽取
java·spring boot·openfeign
有想法的py工程师1 小时前
PostgreSQL + Debezium CDC 踩坑总结
数据库·postgresql
Nandeska2 小时前
2、数据库的索引与底层数据结构
数据结构·数据库
北城以北88882 小时前
Spring定时任务与Spring MVC拦截器
spring boot·spring·mvc
Victor3562 小时前
Netty(20)如何实现基于Netty的WebSocket服务器?
后端
缘不易2 小时前
Springboot 整合JustAuth实现gitee授权登录
spring boot·后端·gitee
小卒过河01042 小时前
使用apache nifi 从数据库文件表路径拉取远程文件至远程服务器目的地址
运维·服务器·数据库
Kiri霧2 小时前
Range循环和切片
前端·后端·学习·golang
过期动态2 小时前
JDBC高级篇:优化、封装与事务全流程指南
android·java·开发语言·数据库·python·mysql