使用SpringBoot+MyBatis实现增删改查
使用SpringBoot+MyBatis实现增删改查
一 SpringBoot
SpringBoot 是Spring 框架的简化开发工具,由 Pivotal 团队开发,核心目标是简化 Spring 应用的创建、配置和部署。
主要特点:
- 自动配置:根据引入的依赖自动配置项目(例如引入 MySQL 依赖后,自动配置数据库连接相关参数),减少手动 XML 配置。
- 独立运行:内置 Tomcat、Jetty 等服务器,应用可直接通过
java -jar命令运行,无需单独部署到服务器。 - 简化依赖管理:通过
starter依赖(如spring-boot-starter-web)一键引入相关组件,避免手动维护依赖版本冲突。 - 开箱即用:集成了日志、监控、安全等常用功能,开发者可专注于业务逻辑。
二 MyBatis
MyBatis 是一个持久层框架(ORM 框架的一种简化实现),用于解决 Java 对象与数据库交互的问题。
主要特点:
- SQL 语句与代码分离:SQL 语句写在 XML 文件或注解中,便于维护和优化(尤其适合复杂查询)。
- 灵活的映射关系:支持手动定义 Java 对象与数据库表字段的映射关系,比全自动 ORM 框架(如 Hibernate)更灵活。
- 简化 JDBC 操作:自动处理数据库连接、SQL 执行、结果集映射等流程,避免重复编写 JDBC 模板代码。
- 支持动态 SQL:通过
<if>、<where>等标签在 XML 中动态生成 SQL,适应多条件查询场景。
典型用途:
替代传统的 JDBC 代码,高效实现数据库的增删改查(CRUD)操作,尤其适合需要手动优化 SQL 的场景。
三 编码实现

1 导入数据
新建数据库db_sms,导入数据。
use db_sms;
-- 创建学生表
CREATE TABLE student (
id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '学生ID',
name VARCHAR(50) NOT NULL COMMENT '学生姓名',
age INT NOT NULL COMMENT '学生年龄',
gender VARCHAR(10) NOT NULL COMMENT '学生性别',
email VARCHAR(100) COMMENT '学生邮箱',
phone VARCHAR(20) COMMENT '学生电话',
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
status TINYINT DEFAULT 1 COMMENT '状态:1-正常,0-删除'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='学生信息表';
-- 插入测试数据
INSERT INTO student (name, age, gender, email, phone) VALUES
('张三', 18, '男', 'zhangsan@example.com', '13800138000'),
('李四', 19, '女', 'lisi@example.com', '13900139000'),
('王五', 20, '男', 'wangwu@example.com', '13700137000');
2 新建项目Demo-SMS,修改pom.xml,添加 Maven 依赖
<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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.5</version>
<relativePath/>
<!-- lookup parent from repository -->
</parent>
<groupId>com.yqd</groupId>
<artifactId>Demo-SMS</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Demo-SMS</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- SpringBoot Web依赖,用于构建RESTful接口 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- MyBatis整合SpringBoot的依赖 -->
<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>
<version>5.1.37</version>
<scope>runtime</scope>
</dependency>
<!-- Lombok依赖,用于简化实体类的getter/setter等方法 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<plugins>
<!-- SpringBoot Maven插件,用于打包和运行项目 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
3 配置文件 (application.properties)
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/db_sms?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: 123456
mybatis:
type-aliases-package: com.yqd.entity
configuration:
map-underscore-to-camel-case: true
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
server:
port: 8080
4 实体类 (Student.java)
package com.yqd.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
private Long id;
private String name;
private Integer age;
private String gender;
private String email;
private String phone;
private LocalDateTime createTime;
private Integer status;
}
5 Mapper层 (StudentMapper.java)
package com.yqd.mapper;
import com.yqd.entity.Student;
import org.apache.ibatis.annotations.*;
import java.util.List;
@Mapper
public interface StudentMapper {
// 新增学生
@Insert("INSERT INTO student(name, age, gender, email, phone) " +
"VALUES(#{name}, #{age}, #{gender}, #{email}, #{phone})")
int insert(Student student);
// 根据ID删除学生
@Delete("DELETE FROM student WHERE id = #{id}")
int deleteById(Long id);
// 更新学生信息
@Update("UPDATE student SET name=#{name}, age=#{age}, gender=#{gender}, " +
"email=#{email}, phone=#{phone} WHERE id=#{id}")
int update(Student student);
// 根据ID查询学生
@Select("SELECT * FROM student WHERE id = #{id}")
Student selectById(Long id);
// 查询所有学生
@Select("SELECT * FROM student WHERE status = 1")
List<Student> selectAll();
}
6 Service 层 (StudentService.java)
接口
package com.yqd.service;
import com.yqd.entity.Student;
import java.util.List;
public interface StudentService {
// 新增学生
int addStudent(Student student);
// 根据ID删除学生
int deleteStudentById(Long id);
// 更新学生信息
int updateStudent(Student student);
// 根据ID查询学生
Student getStudentById(Long id);
// 查询所有学生
List<Student> getAllStudents();
}
实现类
package com.yqd.service.impl;
import com.yqd.entity.Student;
import com.yqd.mapper.StudentMapper;
import com.yqd.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class StudentServiceImpl implements StudentService {
@Autowired
private StudentMapper studentMapper;
@Override
public int addStudent(Student student) {
return studentMapper.insert(student);
}
@Override
public int deleteStudentById(Long id) {
return studentMapper.deleteById(id);
}
@Override
public int updateStudent(Student student) {
return studentMapper.update(student);
}
@Override
public Student getStudentById(Long id) {
return studentMapper.selectById(id);
}
@Override
public List<Student> getAllStudents() {
return studentMapper.selectAll();
}
}
7 Controller 层 (StudentController.java)
package com.yqd.controller;
import com.yqd.entity.Student;
import com.yqd.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api/students")
public class StudentController {
@Autowired
private StudentService studentService;
// 新增学生
@PostMapping
public String addStudent(@RequestBody Student student) {
int result = studentService.addStudent(student);
return result > 0 ? "添加成功" : "添加失败";
}
// 根据ID删除学生
@DeleteMapping("/{id}")
public String deleteStudent(@PathVariable Long id) {
int result = studentService.deleteStudentById(id);
return result > 0 ? "删除成功" : "删除失败";
}
// 更新学生信息
@PutMapping
public String updateStudent(@RequestBody Student student) {
int result = studentService.updateStudent(student);
return result > 0 ? "更新成功" : "更新失败";
}
// 根据ID查询学生
@GetMapping("/{id}")
public Student getStudentById(@PathVariable Long id) {
return studentService.getStudentById(id);
}
// 查询所有学生
@GetMapping
public List<Student> getAllStudents() {
return studentService.getAllStudents();
}
}
9 启动类 (StudentManagementApplication.java)
package com.yqd;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class StudentManagementApplication
{
public static void main( String[] args )
{
SpringApplication.run(StudentManagementApplication.class,args);
}
}
四 功能说明
以上代码实现了一个完整的学生信息管理系统,提供了以下功能:
- 新增学生:通过 POST 请求
/api/students创建新学生 - 删除学生:通过 DELETE 请求
/api/students/{id}逻辑删除学生(将 status 设为 0) - 更新学生:通过 PUT 请求
/api/students/{id}更新学生信息 - 查询单个学生:通过 GET 请求
/api/students/{id}获取指定学生信息 - 查询所有学生:通过 GET 请求
/api/students获取所有正常状态的学生
系统采用了分层架构设计:
- 实体层(Entity):映射数据库表结构
- 数据访问层(Mapper):通过 MyBatis 实现数据库操作
- 服务层(Service):实现业务逻辑
- 控制层(Controller):处理 HTTP 请求和响应
五 接口测试
1. 新增学生 (POST)
- 请求 URL:
http://localhost:8080/api/students - 请求方法: POST
- 请求头:
Content-Type: application/json - 请求体 (JSON):
{
"name": "赵六",
"age": 21,
"gender": "男",
"email": "zhaoliu@example.com",
"phone": "13600136000"
}
- 成功响应 (201 Created):
1 // 表示插入成功的记录数
2. 查询所有学生 (GET)
- 请求 URL:
http://localhost:8080/api/students - 请求方法: GET
- 成功响应 (200 OK):
[
{
"id": 1,
"name": "张三",
"age": 18,
"gender": "男",
"email": "zhangsan@example.com",
"phone": "13800138000",
"createTime": "2023-10-15T10:00:00",
"status": 1
},
{
"id": 4,
"name": "赵六",
"age": 21,
"gender": "男",
"email": "zhaoliu@example.com",
"phone": "13600136000",
"createTime": "2023-10-15T14:30:00",
"status": 1
}
]
3. 根据 ID 查询学生 (GET)
- 请求 URL:
http://localhost:8080/api/students/1 - 请求方法: GET
- 成功响应 (200 OK):
{
"id": 1,
"name": "张三",
"age": 18,
"gender": "男",
"email": "zhangsan@example.com",
"phone": "13800138000",
"createTime": "2023-10-15T10:00:00",
"status": 1
}
- 失败响应 (404 Not Found): 当 ID 不存在时
4. 更新学生信息 (PUT)
- 请求 URL:
http://localhost:8080/api/students/1 - 请求方法: PUT
- 请求头:
Content-Type: application/json - 请求体 (JSON):
{
"name": "张三",
"age": 19, // 年龄从18更新为19
"gender": "男",
"email": "zhangsan_new@example.com", // 更新邮箱
"phone": "13800138000"
}
- 成功响应 (200 OK):
1 // 表示更新成功的记录数
5. 删除学生 (DELETE)
- 请求 URL:
http://localhost:8080/api/students/2 - 请求方法: DELETE
- 成功响应 (200 OK):
1 // 表示删除成功的记录数(实际是逻辑删除,更新status为0)

浙公网安备 33010602011771号