使用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 的场景。

三 编码实现

image-20251015161623156

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);
    }
}

四 功能说明

以上代码实现了一个完整的学生信息管理系统,提供了以下功能:

  1. 新增学生:通过 POST 请求 /api/students 创建新学生
  2. 删除学生:通过 DELETE 请求 /api/students/{id} 逻辑删除学生(将 status 设为 0)
  3. 更新学生:通过 PUT 请求 /api/students/{id} 更新学生信息
  4. 查询单个学生:通过 GET 请求 /api/students/{id} 获取指定学生信息
  5. 查询所有学生:通过 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)
posted @ 2025-10-16 20:37  碧水云天4  阅读(13)  评论(0)    收藏  举报