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 无(数据载体)
相关推荐
计算机毕业设计木哥3 小时前
计算机毕业设计选题推荐:基于SpringBoot和Vue的爱心公益网站
java·开发语言·vue.js·spring boot·后端·课程设计
IT_陈寒3 小时前
Redis 性能翻倍的 5 个隐藏技巧,99% 的开发者都不知道第3点!
前端·人工智能·后端
JaguarJack3 小时前
PHP 桌面端框架NativePHP for Desktop v2 发布!
后端·php·laravel
番茄Salad3 小时前
自定义Spring Boot Starter项目并且在其他项目中通过pom引入使用
java·spring boot
JosieBook4 小时前
【数据库】时序数据库选型指南:在大数据与工业4.0时代,为何 Apache IoTDB 成为智慧之选?
大数据·数据库·时序数据库
程序员三明治4 小时前
详解Redis锁误删、原子性难题及Redisson加锁底层原理、WatchDog续约机制
java·数据库·redis·分布式锁·redisson·watchdog·看门狗
chenzhou__4 小时前
MYSQL学习笔记(个人)(第十五天)
linux·数据库·笔记·学习·mysql
自由的疯4 小时前
Java 怎么学习Kubernetes
java·后端·架构
自由的疯4 小时前
Java kubernetes
java·后端·架构