Spring Boot项目中结合MyBatis详细使用

(一)、实现分布

1. Controller层

职责: 负责处理HTTP请求和响应,作为前端与后端服务交互的接口。

实现: 通过@RestController或@Controller注解定义控制器类,并使用如@GetMapping, @PostMapping等注解来映射HTTP请求。

2. Service层

职责: 实现业务逻辑的核心处理,包括数据的处理、验证、计算等。

实现: 通常通过@Service注解来定义服务类,并且这些服务类会被注入到Controller中以供调用。

3. Mapper层 (MyBatis中的DAO层)

职责: 负责数据库操作,即数据的增删改查。

实现: 使用MyBatis的@Mapper注解定义接口,并在接口中声明SQL语句的方法。这些方法会被框架自动代理实现,完成与数据库的交互。

4. POJO层 (Plain Old Java Object, 简单老式Java对象)

职责: 存储数据模型,用于表示应用程序中的实体对象。

实现: 定义Java类来表示数据库表中的记录,通常包括属性和简单的getter/setter方法。

这种分层设计有助于实现高内聚低耦合的设计原则,使得各个组件可以独立开发和测试,同时也方便了后期维护和扩展。

(二)、实现数据

1. 创建演示数据

本次演示用到mysql8数据库进行操作

sql 复制代码
create database if not exists mybatis;

use mybatis;

create table user(
    id int unsigned primary key auto_increment comment 'ID',
    name varchar(100) comment '姓名',
    age tinyint unsigned comment '年龄',
    gender tinyint unsigned comment '性别, 1:男, 2:女',
    phone varchar(11) comment '手机号'
) comment '用户表';

insert into user(id, name, age, gender, phone) VALUES (null,'白眉鹰王',55,'1','18800000000');
insert into user(id, name, age, gender, phone) VALUES (null,'金毛狮王',45,'1','18800000001');
insert into user(id, name, age, gender, phone) VALUES (null,'青翼蝠王',38,'1','18800000002');
insert into user(id, name, age, gender, phone) VALUES (null,'紫衫龙王',42,'2','18800000003');
insert into user(id, name, age, gender, phone) VALUES (null,'光明左使',37,'1','18800000004');
insert into user(id, name, age, gender, phone) VALUES (null,'光明右使',48,'1','18800000005');

(三)、代码实现

1.代码结构(tree /f)

cmd 复制代码
  pom.xml
│
├─src
│  └─main
│      ├─java
│      │  └─com
│      │      └─itheima
│      │          └─springbootmybatis
│      │              │  SpringbootMybatisApplication.java
│      │              │
│      │              ├─controller
│      │              │      UserController.java
│      │              │
│      │              ├─mapper
│      │              │      UserMapper.java
│      │              │
│      │              ├─pojo
│      │              │      User.java
│      │              │
│      │              └─service
│      │                  │  UserService.java
│      │                  │
│      │                  └─impl
│      │                          UserServiceImpl.java
│      │
│      └─resources
│          │  application.yml
│          │
│          ├─static
│          └─templates

2. application.yml 实现

数据库配置:启动类、数据库、用户名、密码

开启端口配置:默认为8080

yaml 复制代码
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mybatis
    username: root
    password: 123456
server:
  port: 8082

3. pom.xml依赖增加

parent 是集成了父工程

mysql驱动依赖、mybatis的起步依赖、springboot启动web、 lombok 注解

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<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 https://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>3.1.3</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.itheima</groupId>
    <artifactId>springboot-mybatis</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-mybatis</name>
    <description>springboot-mybatis</description>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>

        <!--mysql驱动依赖-->
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
        </dependency>

        <!--mybatis的起步依赖-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>3.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>3.1.3</version>
            </plugin>
        </plugins>
    </build>

</project>

4. controller 层

userService 自动注入了实现类,通过实现类来进行操作。

  1. Java函数名为findById,它是一个HTTP请求映射方法,通过传入的ID参数查询并返回对应的用户信息。具体用户数据由userService对象的findById方法负责查找。

  2. Java函数名为findAll,它是一个控制器方法,通过@RequestMapping注解指定访问路径为"/findAll"。函数功能是从用户服务(userService)中获取所有用户数据,并返回一个用户列表(List)。简而言之,此方法用于查询并返回所有用户信息。

  3. Java函数名为AddUser,它是一个控制器方法,通过HTTP请求映射添加用户。功能为:接收一个User类型的参数user。调用userService.AddUser(user)添加用户。返回添加操作的结果信息。

  4. Java函数名应为DeleteById,位于一个处理HTTP请求的类中,通过GET或POST等方法接收一个名为id的整数参数。该函数调用.userService的DeleteById方法执行删除操作,并将返回值原样返回。主要功能是根据提供的ID删除用户数据。

  5. Java函数的功能是更新用户信息。

    注解@RequestMapping("/UpdateUser")用于映射URL路径为"/UpdateUser"的客户端请求。

    函数UpdateUser(User user)接收一个类型为User的参数user,这个参数代表需要更新的用户信息。

    在函数体中,它调用userService.UpdateUser(user)方法来执行实际的用户信息更新操作。

    userService是一个User服务类的实例,通过依赖注入的方式引入到当前类中。

    函数返回类型为String,通常用于指定转发或重定向的视图名称,或者告知调用者操作的结果。

java 复制代码
package com.itheima.springbootmybatis.controller;

import com.itheima.springbootmybatis.pojo.User;
import com.itheima.springbootmybatis.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class UserController {

    @Autowired
    private UserService userService;
    @RequestMapping("/findById")
    public User findById(Integer id){
      return   userService.findById(id);
    }
    @RequestMapping("/findAll")
    public List<User> findAll() {
        return userService.findAll();
    }
    @RequestMapping("/AddUser")
    public String AddUser(User user){
        return  userService.AddUser(user);
    }
    @RequestMapping("/DelteById")
    public String DelteById(Integer id){
        return  userService.DelteById(id);
    }
    @RequestMapping("/UpdateUser")
    public String UpdateUser(User user){
        return  userService.UpdateUser(user);
    }
}

5. Service层

接口:UserService.java

  1. findById(Integer id):根据用户ID查找并返回一个特定的用户对象。
  2. findAll():查找并返回所有用户对象的列表。
  3. DeleteById(Integer id):根据用户ID删除一个特定的用户,并返回操作结果的消息。
  4. AddUser(User user):添加一个新的用户对象,并返回操作结果的消息。
  5. UpdateUser(User user):更新一个已存在的用户对象的信息,并返回操作结果的消息。
java 复制代码
package com.itheima.springbootmybatis.service;

import com.itheima.springbootmybatis.pojo.User;

import java.util.List;

public interface UserService {

    User findById(Integer id);

    List<User> findAll();

    String DelteById(Integer id);
    String AddUser(User user);
    String UpdateUser(User user);
}

实现类:UserServiceImpl.java

  1. findById(Integer id):根据用户ID查询单个用户信息。

  2. findAll():查询所有用户信息并返回用户列表。

  3. DelteById(Integer id):根据用户ID删除用户信息,成功后返回"删除成功"的消息。

  4. AddUser(User user):向数据库中添加新的用户信息,成功后返回"添加成功"的消息。

  5. UpdateUser(User user):更新用户信息,成功后返回"更新成功"的消息。

java 复制代码
package com.itheima.springbootmybatis.service.impl;

import com.itheima.springbootmybatis.mapper.UserMapper;
import com.itheima.springbootmybatis.pojo.User;
import com.itheima.springbootmybatis.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    @Override
    public User findById(Integer id) {
        return userMapper.findById(id);
    }

    @Override
    public List<User> findAll() {
        return userMapper.findAll();
    }

    @Override
    public String DelteById(Integer id) {
        userMapper.DelteById(id);
        return "删除成功";
    }

    @Override
    public String AddUser(User user) {
        userMapper.AddUser(user);
        return "添加成功";
    }

    @Override
    public String UpdateUser(User user) {
        userMapper.UpdateUser(user);
        return "更新成功";
    }
}

6. Mapper层

  1. findById:通过用户ID查询单个用户的信息。SQL语句为select * from user where id = #{id}。
  2. findAll:查询所有用户的信息。SQL语句为select * from user。
  3. DeleteById:通过用户ID删除用户信息。SQL语句为delete from user where id = #{id}。
  4. AddUser:向用户表中插入一条新的用户记录。SQL语句为insert into user(name,age,gender,phone) values(#{name},#{age},#{gender},#{phone})。
  5. UpdateUser:更新用户表中指定ID的用户信息。SQL语句为update user set name = #{name},age = #{age},gender = #{gender},phone = #{phone} where id = #{id}。
java 复制代码
package com.itheima.springbootmybatis.mapper;

import com.itheima.springbootmybatis.pojo.User;
import org.apache.ibatis.annotations.*;

import java.util.List;

@Mapper
public interface UserMapper {

    @Select("select * from user where id = #{id}")
    User findById(Integer id);
    @Select("select * from user")
    List<User> findAll();

    @Delete("delete from user where id = #{id}")
    void DelteById(Integer id);

    @Insert("insert into user(name,age,gender,phone) values(#{name},#{age},#{gender},#{phone})")
    void AddUser(User user);

    @Update("update user set name = #{name},age = #{age},gender = #{gender},phone = #{phone} where id = #{id}")
    void UpdateUser(User user);
}

7. pojo层

  1. 包名和导入:
    package com.itheima.springbootmybatis.pojo;: 定义了类所在的包路径。
    import lombok.AllArgsConstructor;, import lombok.Data;, import lombok.NoArgsConstructor;: 导入Lombok库的注解,以简化类的代码。
  2. Lombok注解:
    @Data: 自动生成getter和setter方法、toString方法、equalsAndHashCode方法,以及链式调用支持。
    @NoArgsConstructor: 自动生成一个无参构造方法。
    @AllArgsConstructor: 自动生成一个包含所有字段的构造方法。
  3. 类定义:
    public class User: 定义了一个公共类User。
  4. 字段:
    private Integer id;: 用户ID,使用Integer类型。
    private String name;: 用户姓名,使用String类型。
    private Short age;: 用户年龄,使用Short类型。
    private Short gender;: 用户性别,使用Short类型,通常0表示女,1表示男。
    private String phone;: 用户电话号码,使用String类型。
java 复制代码
package com.itheima.springbootmybatis.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @Data 包括了@Getter @Setter @ToString @RequiredArgsConstructor @EqualsAndHashCode @ToString @Accessors(chain = true)
 */
@Data
@NoArgsConstructor //无参构造
@AllArgsConstructor //有参构造
public class User {
    
    private Integer id;
    private String name;
    private Short age;
    private Short gender;
    private String phone;

}

(四)、测试用例

postman ,可以用import进行导入测试。

四种基础操作接口测试.postman_collection.json

  1. 基本信息:
    _postman_id: 该集合的唯一标识符。
    name: 集合名称,这里是"四种基础操作接口测试"。
    schema: 集合遵循的模式版本。
    _exporter_id: 导出者的唯一标识符。
  2. 请求列表:
    查找所有用户:
    方法: GET
    URL: localhost:8082/findAll
    说明: 通过GET请求获取服务器上所有用户的列表。
    添加操作:
    方法: GET
    URL: localhost:8082/AddUser
    查询参数:
    name: 用户名
    age: 年龄
    gender: 性别
    phone: 电话号码
    说明: 通过GET请求向服务器添加一个新的用户记录。
    删除用户操作:
    方法: GET
    URL: localhost:8082/DelteById
    查询参数:
    id: 要删除用户的ID
    说明: 通过GET请求删除指定ID的用户记录。
    更新用户:
    方法: GET
    URL: localhost:8082/UpdateUser
    查询参数:
    id: 要更新用户的ID
    name: 更新后的用户名
    age: 更新后的年龄
    phone: 更新后的电话号码
    gender: 更新后的性别
    说明: 通过GET请求更新指定ID的用户记录。
  3. 其他细节:
    端口: 所有请求都指向localhost:8082。
    响应: 每个请求后面都有一个空的response数组,这意味着这些请求还没有被实际发送或记录响应。
  4. 这是一个包含了四个API测试用例的Postman集合文件,分别对应于CRUD(创建、读取、更新、删除)操作中的"读取所有记录"、"创建新记录"、"删除记录"和"更新记录"。这些测试用例通过GET请求与服务器交互,用于验证后端服务的功能是否正常。
json 复制代码
{
	"info": {
		"_postman_id": "016041ef-488e-4101-ba7e-1aa2f4b7415a",
		"name": "四种基础操作接口测试",
		"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
		"_exporter_id": "14213812"
	},
	"item": [
		{
			"name": "查找所有用户",
			"request": {
				"method": "GET",
				"header": [],
				"url": {
					"raw": "localhost:8082/findAll",
					"host": [
						"localhost"
					],
					"port": "8082",
					"path": [
						"findAll"
					]
				}
			},
			"response": []
		},
		{
			"name": "添加操作",
			"request": {
				"method": "GET",
				"header": [],
				"url": {
					"raw": "localhost:8082/AddUser?name=sky&age=18&gender=1&phone=88888888",
					"host": [
						"localhost"
					],
					"port": "8082",
					"path": [
						"AddUser"
					],
					"query": [
						{
							"key": "name",
							"value": "sky"
						},
						{
							"key": "age",
							"value": "18"
						},
						{
							"key": "gender",
							"value": "1"
						},
						{
							"key": "phone",
							"value": "88888888"
						}
					]
				}
			},
			"response": []
		},
		{
			"name": "删除用户操作",
			"request": {
				"method": "GET",
				"header": [],
				"url": {
					"raw": "localhost:8082/DelteById?id=8",
					"host": [
						"localhost"
					],
					"port": "8082",
					"path": [
						"DelteById"
					],
					"query": [
						{
							"key": "id",
							"value": "8"
						}
					]
				}
			},
			"response": []
		},
		{
			"name": "更新用户",
			"request": {
				"method": "GET",
				"header": [],
				"url": {
					"raw": "localhost:8082/UpdateUser?id=2&name=狗子&age=1&phone=88888888&gender=2",
					"host": [
						"localhost"
					],
					"port": "8082",
					"path": [
						"UpdateUser"
					],
					"query": [
						{
							"key": "id",
							"value": "2"
						},
						{
							"key": "name",
							"value": "狗子"
						},
						{
							"key": "age",
							"value": "1"
						},
						{
							"key": "phone",
							"value": "88888888"
						},
						{
							"key": "gender",
							"value": "2"
						}
					]
				}
			},
			"response": []
		}
	]
}
相关推荐
Java水解3 小时前
SpringBoot3全栈开发实战:从入门到精通的完整指南
spring boot·后端
Java水解3 小时前
Java 中间件:Dubbo 服务降级(Mock 机制)
java·后端
千寻girling3 小时前
一份不可多得的 《 Python 》语言教程
人工智能·后端·python
南风9993 小时前
Claude code安装使用保姆级教程
后端
爱泡脚的鸡腿3 小时前
Node.js 拓展
前端·后端
蚂蚁背大象4 小时前
Rust 所有权系统是为了解决什么问题
后端·rust
子玖6 小时前
go实现通过ip解析城市
后端·go
Java不加班6 小时前
Java 后端定时任务实现方案与工程化指南
后端
心在飞扬6 小时前
RAG 进阶检索学习笔记
后端