Vue 拥有类似 HTML 的模板语法,语法简洁直观,开发者容易理解和上手
SpringBoot 是一款轻量级的快速开发框架,通过 "自动装配" 机制简化了绝大部分 Spring 框架的手动配置,仅需按需配置少量核心项(如端口号、数据库账号密码等)即可快速搭建项目;它内置了 Tomcat 等 Servlet 容器,无需将项目手动部署到外部服务器,可直接以 Jar 包形式独立启动运行;
MyBatis 可通过简洁的 XML 文件或注解配置,将 SQL 语句与 Java 对象(POJO)的映射关系绑定;在数据库操作时,只需调用对应的 Mapper 接口方法,即可自动关联 Java 对象与数据库操作,同时将数据库查询结果自动封装为 Java 对象(后端接收的前端数据需先转换为 Java 对象,再由 MyBatis 处理),大幅消除了繁琐的 JDBC 模板代码。
SMM是指Sping、SpingMVC、Mybaits,优势如下:
1.Sping的核心是IOC和AOP(IOC使得代码复用,可维护性提高;AOP提供切面编程,增加生成力)
- IOC(Inversion of Control,控制反转)
以前,自己new对象,自己管对象的创建、依赖、销毁
现在,把对象交给Sping容器管,需要用的时候直接拿来就行
- DI = Dependency Injection,依赖注入
Spring 自动把需要的对象塞给你,不用你自己去创建
- AOP(Aspect Oriented Programming,面向切面编程)
在不修改原有业务代码的前提下,统一加功能
比如:日志、事务、权限校验、性能统计
- IOC:管对象,让代码松耦合、好维护;AOP:管横切逻辑,加功能不改业务代码
2.Spring MVC 是 Spring Framework 核心生态的重要组成部分,它严格遵循 MVC 设计模式,分离了前端控制器(DispatcherServlet)、控制器(Controller)、模型(Model)、视图(View)等核心角色,这种清晰的职责分离让每个组件都可以独立定制和扩展,大幅提升了 Web 开发的灵活性
3.MyBatis 消除了几乎所有繁琐的 JDBC 模板代码,包括手动设置 SQL 参数、手动封装数据库结果集等操作;MyBatis 支持通过简洁的 XML 文件或注解来配置 SQL 语句及映射规则,能够将 Java 接口与普通 Java 对象(POJO,Plain Old Java Objects)高效映射为数据库中的记录
待补充
Vue + SpringBoot + MyBatis 是目前国内最主流的前后端分离开发技术栈
| 技术 | 定位 | 核心作用 |
|---|---|---|
| Vue | 前端(浏览器端) | 展示页面、接收用户操作、向后端发送请求 |
| SpringBoot | 后端(服务器端) | 接收前端请求、处理业务逻辑、调用 MyBatis |
| MyBatis | 后端数据层 | 执行 SQL、完成数据库与 Java 对象的映射 |
以 "用户信息管理" 为例(查询 / 新增用户)
步骤 1:后端(SpringBoot + MyBatis)搭建
1.1 创建 SpringBoot 项目(推荐使用 IDEA)
选择依赖:Spring Web + MyBatis Framework + MySQL Driver
项目结构(核心目录):
src/main/java/com/example/demo/
├── DemoApplication.java // 启动类
├── controller/ // 前端请求入口
│ └── UserController.java
├── entity/ // 实体类(对应数据库表)
│ └── User.java
├── mapper/ // MyBatis映射接口
│ └── UserMapper.java
└── service/ // 业务逻辑(可选,简化示例可省略)
└── UserService.java
src/main/resources/
├── application.yml // 配置文件
└── mybatis/mapper/ // MyBatis的XML映射文件
└── UserMapper.xml
1.2 核心代码编写
(1)配置文件(application.yml)
spring:
# 数据库配置
datasource:
url: jdbc:mysql://localhost:3306/test_db?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username: root # 你的MySQL用户名
password: 123456 # 你的MySQL密码
driver-class-name: com.mysql.cj.jdbc.Driver
# MyBatis配置
mybatis:
mapper-locations: classpath:mybatis/mapper/*.xml # 指定XML文件位置
type-aliases-package: com.example.demo.entity # 实体类别名包
configuration:
map-underscore-to-camel-case: true # 开启驼峰命名转换
(2)实体类(User.java)
java
package com.example.demo.entity;
public class User {
private Integer id;
private String userName;
private Integer age;
// 必须有无参构造(MyBatis封装需要)
public User() {}
// 全参构造、getter/setter、toString 省略(IDEA可自动生成)
public Integer getId() { return id; }
public void setId(Integer id) { this.id = id; }
public String getUserName() { return userName; }
public void setUserName(String userName) { this.userName = userName; }
public Integer getAge() { return age; }
public void setAge(Integer age) { this.age = age; }
}
(3)Mapper 接口(UserMapper.java)
java
package com.example.demo.mapper;
import com.example.demo.entity.User;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
// 标记为MyBatis映射接口,SpringBoot会自动扫描
@Mapper
public interface UserMapper {
// 查询所有用户
List<User> selectAllUsers();
// 新增用户
int insertUser(User user);
}
(4)Mapper XML 文件(UserMapper.xml)
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">
<mapper namespace="com.example.demo.mapper.UserMapper">
<resultMap id="UserResultMap" type="User">
<id column="id" property="id"/>
<result column="user_name" property="userName"/>
<result column="age" property="age"/>
</resultMap>
<select id="selectAllUsers" resultMap="UserResultMap">
SELECT id, user_name, age FROM user
</select>
<insert id="insertUser">
INSERT INTO user (user_name, age) VALUES (#{userName}, #{age})
</insert>
</mapper>
(5)Controller(前端请求入口)
java
package com.example.demo.controller;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
// 解决跨域(前端Vue和后端端口不同,必须加)
@CrossOrigin
@RestController
@RequestMapping("/user")
public class UserController {
// 注入Mapper
@Resource
private UserMapper userMapper;
// 查询所有用户:GET请求
@GetMapping("/list")
public List<User> getUserList() {
return userMapper.selectAllUsers();
}
// 新增用户:POST请求,接收前端传的User对象
@PostMapping("/add")
public String addUser(@RequestBody User user) {
int result = userMapper.insertUser(user);
return result > 0 ? "新增成功" : "新增失败";
}
}
1.3 数据库准备
在 MySQL 中创建 test_db 数据库和 user 表:
sql
CREATE DATABASE IF NOT EXISTS test_db DEFAULT CHARACTER SET utf8mb4;
USE test_db;
CREATE TABLE IF NOT EXISTS user (
id INT PRIMARY KEY AUTO_INCREMENT,
user_name VARCHAR(50) NOT NULL,
age INT
);
步骤 2:前端(Vue)搭建
2.1 创建 Vue 项目(需先安装 Node.js)
java
# 安装Vue脚手架(首次需要)
npm install -g @vue/cli
# 创建项目(选择Vue2或Vue3,示例用Vue3)
vue create vue-demo
# 进入项目目录
cd vue-demo
# 安装axios(用于发送HTTP请求)
npm install axios
2.2 核心代码编写
(1)配置 axios(src/utils/request.js)
新建工具类,统一管理请求:
javascript
import axios from 'axios'
// 创建axios实例,指定后端基础地址
const request = axios.create({
baseURL: 'http://localhost:8080', // SpringBoot默认端口8080
timeout: 5000 // 请求超时时间
})
export default request
(2)用户页面(src/views/User.vue)
javascript
<template>
<div class="user-container">
<h2>用户管理</h2>
<!-- 新增用户表单 -->
<div class="add-form">
<input v-model="newUser.userName" placeholder="请输入用户名"/>
<input v-model="newUser.age" type="number" placeholder="请输入年龄"/>
<button @click="addUser">新增用户</button>
</div>
<!-- 用户列表 -->
<table border="1" cellpadding="8" cellspacing="0">
<thead>
<tr>
<th>ID</th>
<th>用户名</th>
<th>年龄</th>
</tr>
</thead>
<tbody>
<tr v-for="user in userList" :key="user.id">
<td>{{ user.id }}</td>
<td>{{ user.userName }}</td>
<td>{{ user.age }}</td>
</tr>
</tbody>
</table>
</div>
</template>
<script>
import request from '../utils/request'
export default {
name: 'User',
data() {
return {
userList: [], // 存储用户列表
newUser: { // 新增用户的表单数据
userName: '',
age: ''
}
}
},
// 页面加载时查询用户列表
mounted() {
this.getUserList()
},
methods: {
// 查询所有用户
async getUserList() {
try {
// 向后端发送GET请求:http://localhost:8080/user/list
const res = await request.get('/user/list')
this.userList = res.data
} catch (error) {
alert('查询失败:' + error.message)
}
},
// 新增用户
async addUser() {
if (!this.newUser.userName || !this.newUser.age) {
alert('请填写完整信息')
return
}
try {
// 向后端发送POST请求,携带用户数据
await request.post('/user/add', this.newUser)
alert('新增成功')
// 重置表单 + 重新查询列表
this.newUser = { userName: '', age: '' }
this.getUserList()
} catch (error) {
alert('新增失败:' + error.message)
}
}
}
}
</script>
<style scoped>
.user-container {
width: 800px;
margin: 50px auto;
}
.add-form {
margin-bottom: 20px;
}
.add-form input {
margin-right: 10px;
padding: 5px;
}
</style>
(3)配置路由(src/router/index.js)
javascript
import { createRouter, createWebHistory } from 'vue-router'
import User from '../views/User.vue'
const routes = [
{
path: '/',
name: 'User',
component: User
}
]
const router = createRouter({
history: createWebHistory(process.env.BASE_URL),
routes
})
export default router
步骤 3:运行项目
- 启动后端 :运行 SpringBoot 的
DemoApplication.java(默认端口 8080); - 启动前端 :在 Vue 项目目录执行
npm run serve(默认端口 8081); - 访问页面 :打开浏览器输入
http://localhost:8081,即可看到用户管理页面,支持新增和查询用户

Vue + SpringBoot + MyBatis 的核心是前后端分离:Vue 负责前端交互,SpringBoot 处理业务并作为中间层,MyBatis 完成数据库操作;
三者通过HTTP 请求 + JSON 数据交互:前端发请求→后端接收并调用 MyBatis 操作数据库→后端返回 JSON→前端渲染;
关键配置:后端跨域、MyBatis 映射规则、前端 axios 基础地址。
示例是最基础的骨架,你可以在此基础上扩展(如分页、删除、修改、参数校验、权限控制等)