springboot+mybatis+vue实现的增删改查简单版
项目名称:springboot+mybatis+vue的增删改查的简单实现
一、前期准备
1.工具与版本
jdk:1.8
IDEA 2022.3.2
MySQL 8.0
Maven 3.6.3
2.建立数据库
-- 创建数据库(如果没有) CREATE DATABASE IF NOT EXISTS springmvc_demo DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; -- 切换到数据库 USE springmvc_demo; -- 创建用户表 CREATE TABLE IF NOT EXISTS user ( id INT AUTO_INCREMENT PRIMARY KEY, -- 主键,自增 name VARCHAR(100) NOT NULL, -- 用户名,不能为空 age INT -- 年龄 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; INSERT INTO user (name, age) VALUES ('张三', 20); INSERT INTO user (name, age) VALUES ('李四', 25);
二、后端
4.搭建springboot框架
1.打开IDEA -->新建项目-->选择spring initializr --> 命名为demo1-->选择maven--> java 8
2.点击下一步 springbooot选择2.7.6 -->搜索并添加以下依赖: Spring Web 、MyBatis Framework 、MySQL Driver 、Spring Boot、 DevTools Lombok
|
|
|
5.配置文件目录
这两个是自动生成的一些目录可以删掉

配置完后

7.配置pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>crud</artifactId> <version>0.0.1-SNAPSHOT</version> <name>springboot-mybatis-crud</name> <packaging>jar</packaging> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.5</version> <!-- 或其他稳定版本 --> <relativePath/> </parent> <dependencies> <!-- Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- MyBatis Spring Boot Starter --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.2</version> </dependency> <!-- MySQL驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!-- Lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <!-- 开发工具 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <!-- 测试 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
8.配置application.yml(我的数据库密码为:root 你可以修改为自己的密码)
spring: datasource: url: jdbc:mysql://localhost:3306/springmvc_demo?useSSL=false&serverTimezone=UTC username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver mybatis: mapper-locations: classpath:mapper/*.xml type-aliases-package: com.example.crud.entity server: port: 8080
9.启动类CrudApplication.java
package com.example.crud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class CrudApplication { public static void main(String[] args) { SpringApplication.run(CrudApplication.class, args); } }
10.实体类User.java
package com.example.crud.entity; import lombok.Data; @Data public class User { private Integer id; private String name; private Integer age; }
11.Mapper接口UserMapper.java
package com.example.crud.mapper; import com.example.crud.entity.User; import org.apache.ibatis.annotations.Mapper; import java.util.List; @Mapper public interface UserMapper { List<User> findAll(); User findById(Integer id); void insert(User user); void update(User user); void delete(Integer id); }
12.Mapper XML 文件UserMapper.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.crud.mapper.UserMapper"> <select id="findAll" resultType="com.example.crud.entity.User"> SELECT * FROM user </select> <select id="findById" resultType="com.example.crud.entity.User"> SELECT * FROM user WHERE id = #{id} </select> <insert id="insert" useGeneratedKeys="true" keyProperty="id"> INSERT INTO user(name, age) VALUES(#{name}, #{age}) </insert> <update id="update"> UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id} </update> <delete id="delete"> DELETE FROM user WHERE id = #{id} </delete> </mapper>
13.Service类UserService.java
package com.example.crud.service; import com.example.crud.entity.User; import com.example.crud.mapper.UserMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class UserService { @Autowired private UserMapper userMapper; public List<User> findAll() { return userMapper.findAll(); } public User findById(Integer id) { return userMapper.findById(id); } public void insert(User user) { userMapper.insert(user); } public void update(User user) { userMapper.update(user); } public void delete(Integer id) { userMapper.delete(id); } }
14.Controller类UserController.java
package com.example.crud.controller; import com.example.crud.entity.User; import com.example.crud.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; @RestController @RequestMapping("/user") public class UserController { @Autowired private UserService userService; @GetMapping("/list") public List<User> list() { return userService.findAll(); } @GetMapping("/{id}") public User getById(@PathVariable Integer id) { return userService.findById(id); } @PostMapping("/add") public void add(@RequestBody User user) { userService.insert(user); } @PutMapping("/edit") public void edit(@RequestBody User user) { userService.update(user); } @DeleteMapping("/delete/{id}") public void delete(@PathVariable Integer id) { userService.delete(id); } }
三、前端
1. 创建 Vue 项目
打开终端

输入代码 生成vue目录和下载vue
npm create vite@latest my-vue-app -- --template vue cd my-vue-app npm install
安装Axios
npm install axios
3. 编辑/my-vue-app/src/App.vue 前端界面实现用户增删改查
<template> <div> <h2>用户管理</h2> <div> <input v-model="user.id" type="number" placeholder="ID(编辑时填写)" /> <input v-model="user.name" placeholder="姓名" /> <input v-model.number="user.age" type="number" placeholder="年龄" /> <button @click="addUser">添加</button> <button @click="editUser">修改</button> </div> <div style="margin-top: 20px;"> <input v-model.number="searchId" type="number" placeholder="输入用户ID查询" /> <button @click="searchUser">查询</button> <div v-if="searchedUser"> <p>ID: {{ searchedUser.id }}</p> <p>姓名: {{ searchedUser.name }}</p> <p>年龄: {{ searchedUser.age }}</p> </div> <div v-else-if="searchError" style="color:red;">{{ searchError }}</div> </div> <table border="1" cellspacing="0" cellpadding="5" style="margin-top: 20px;"> <thead> <tr><th>ID</th><th>姓名</th><th>年龄</th><th>操作</th></tr> </thead> <tbody> <tr v-for="u in users" :key="u.id"> <td>{{ u.id }}</td> <td>{{ u.name }}</td> <td>{{ u.age }}</td> <td> <button @click="fillForm(u)">编辑</button> <button @click="deleteUser(u.id)">删除</button> </td> </tr> </tbody> </table> </div> </template> <script setup> import { ref, onMounted } from 'vue' import axios from 'axios' const users = ref([]) const user = ref({ id: null, name: '', age: null }) const searchId = ref(null) const searchedUser = ref(null) const searchError = ref('') function loadUsers() { axios.get('/user/list').then(res => { users.value = res.data }) } function addUser() { axios.post('/user/add', { name: user.value.name, age: user.value.age }).then(() => { alert('添加成功') clearForm() loadUsers() }) } function editUser() { if (!user.value.id) { alert('请输入用户ID') return } axios.put('/user/edit', user.value).then(() => { alert('修改成功') clearForm() loadUsers() }) } function deleteUser(id) { if (!confirm('确定删除该用户?')) return axios.delete(`/user/delete/${id}`).then(() => { alert('删除成功') loadUsers() }) } function searchUser() { searchedUser.value = null searchError.value = '' if (!searchId.value) { alert('请输入用户ID') return } axios.get(`/user/${searchId.value}`).then(res => { searchedUser.value = res.data }).catch(() => { searchError.value = '用户不存在' }) } function fillForm(u) { user.value.id = u.id user.value.name = u.name user.value.age = u.age } function clearForm() { user.value = { id: null, name: '', age: null } } onMounted(loadUsers) </script>
4. 配置代理(解决跨域)
编辑/my-vue-app/vite.config.js,写入:
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
export default defineConfig({
plugins: [vue()],
server: {
proxy: {
'/user': {
target: 'http://localhost:8080', // Spring Boot 端口
changeOrigin: true,
}
}
}
})
四、启动与访问
1.启动后端CrudApplication

2.启动前端
在终端中输入
cd my-vue-app
npm run dev
点击链接




浙公网安备 33010602011771号