【数据库系列】Spring Boot 中整合 MyBatis-Plus详细步骤

在这里插入图片描述

在 Spring Boot 中整合 MyBatis-Plus 可以按照以下步骤进行:

一、整合步骤

1. 创建 Spring Boot 项目

首先,使用 Spring Initializr(https://start.spring.io/)创建一个新的 Spring Boot 项目。在创建过程中,选择以下依赖:

  • Spring Web
  • MySQL Driver
  • MyBatis-Plus

2. 配置项目依赖

如果手动创建 pom.xml 文件,确保添加以下依赖:

<dependencies><!-- Spring Boot Starter Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- MyBatis-Plus Starter --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>最新版本</version></dependency><!-- MySQL Driver --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><!-- Spring Boot Starter Test --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
</dependencies>

请将 最新版本 替换为 MyBatis-Plus 的实际最新版本号。

3. 配置数据源

application.yml 文件中配置数据库连接信息:

spring:datasource:url: jdbc:mysql://localhost:3306/yourdatabaseusername: yourusernamepassword: yourpassworddriver-class-name: com.mysql.cj.jdbc.Driver

yourdatabaseyourusernameyourpassword 替换为实际的数据库名称、用户名和密码。

4. 创建实体类

创建一个 Java 实体类,用于映射数据库表。例如,创建一个 User 实体类:

package com.example.demo.entity;import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;@Data
@TableName("user")
public class User {private Long id;private String username;private String password;
}

@Data 是 Lombok 注解,用于自动生成 gettersetterequalshashCodetoString 方法。@TableName 注解指定实体类对应的数据库表名。

5. 创建 Mapper 接口

创建一个 Mapper 接口,继承 BaseMapper 接口,BaseMapper 是 MyBatis-Plus 提供的基础接口,包含了常用的 CRUD 方法。例如,创建一个 UserMapper 接口:

package com.example.demo.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.User;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface UserMapper extends BaseMapper<User> {// 可以在这里定义自定义的 SQL 方法
}

@Mapper 注解用于将该接口标记为 MyBatis 的 Mapper 接口。

6. 创建 Service 层

创建一个 Service 接口和其实现类。例如,创建一个 UserService 接口和 UserServiceImpl 实现类:

package com.example.demo.service;import com.example.demo.entity.User;
import com.baomidou.mybatisplus.extension.service.IService;import java.util.List;public interface UserService extends IService<User> {// 可以在这里定义自定义的业务方法
}
package com.example.demo.service.impl;import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import com.example.demo.service.UserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {// 如果需要,可以重写或实现自定义方法
}

ServiceImpl 是 MyBatis-Plus 提供的基础 Service 实现类,它提供了基本的 CRUD 方法实现。

7. 创建 Controller 层

创建一个 Controller 层,用于处理客户端请求。例如,创建一个 UserController

package com.example.demo.controller;import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;@RestController
@RequestMapping("/users")
public class UserController {@Autowiredprivate UserService userService;@GetMappingpublic List<User> findAll() {return userService.list();}@GetMapping("/{id}")public User findById(@PathVariable Long id) {return userService.getById(id);}@PostMappingpublic boolean save(@RequestBody User user) {return userService.save(user);}@PutMappingpublic boolean update(@RequestBody User user) {return userService.updateById(user);}@DeleteMapping("/{id}")public boolean delete(@PathVariable Long id) {return userService.removeById(id);}
}

8. 配置 MyBatis-Plus 扫描

在 Spring Boot 主应用类上添加 @MapperScan 注解,扫描 Mapper 接口所在的包:

package com.example.demo;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@MapperScan("com.example.demo.mapper")
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}

9. 测试

可以使用 Spring Boot 的测试框架来测试各个接口:

package com.example.demo;import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import static org.junit.jupiter.api.Assertions.*;@SpringBootTest
public class DemoApplicationTests {@Autowiredprivate UserService userService;@Testpublic void testFindAll() {assertTrue(userService.list().size() >= 0);}@Testpublic void testFindById() {User user = new User();user.setUsername("testuser");user.setPassword("testpassword");userService.save(user);assertNotNull(userService.getById(user.getId()));}@Testpublic void testSave() {User user = new User();user.setUsername("newuser");user.setPassword("newpassword");assertTrue(userService.save(user));}@Testpublic void testUpdate() {User user = new User();user.setUsername("updateuser");user.setPassword("updatepassword");userService.save(user);user.setPassword("newupdatepassword");assertTrue(userService.updateById(user));}@Testpublic void testDelete() {User user = new User();user.setUsername("deleteuser");user.setPassword("deletepassword");userService.save(user);assertTrue(userService.removeById(user.getId()));}
}

通过以上步骤,你就可以在 Spring Boot 项目中成功整合 MyBatis-Plus,并实现基本的 CRUD 操作。在实际项目中,你可以根据需求进一步扩展和优化代码。

二、 基本 CRUD 操作

在前面整合的基础上,我们已经有了基本的 CRUD 方法。

新增操作

UserService 中调用 save 方法:

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {// 新增操作@Overridepublic boolean saveUser(User user) {return this.save(user);}
}
查询操作
  • 根据 ID 查询:调用 getById 方法。
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {// 根据 ID 查询@Overridepublic User getUserById(Long id) {return this.getById(id);}
}
  • 查询所有:调用 list 方法。
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {// 查询所有@Overridepublic List<User> getAllUsers() {return this.list();}
}
更新操作

调用 updateById 方法:

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {// 更新操作@Overridepublic boolean updateUser(User user) {return this.updateById(user);}
}
删除操作
  • 根据 ID 删除:调用 removeById 方法。
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {// 根据 ID 删除@Overridepublic boolean deleteUserById(Long id) {return this.removeById(id);}
}

条件查询

使用 QueryWrapper 构建查询条件。

简单条件查询

例如,查询用户名等于某个值的用户:

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {@Overridepublic List<User> findUsersByUsername(String username) {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.eq("username", username);return this.list(queryWrapper);}
}
复杂条件查询

多个条件组合,例如查询用户名包含某个字符串且年龄大于某个值的用户:

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {@Overridepublic List<User> findComplexUsers(String usernameLike, Integer ageGreaterThan) {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.like("username", usernameLike);queryWrapper.gt("age", ageGreaterThan);return this.list(queryWrapper);}
}

分页查询

使用 Page 类实现分页查询。

首先,在 UserService 中定义分页查询方法:

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {@Overridepublic Page<User> getUserPage(int current, int size) {Page<User> page = new Page<>(current, size);return this.page(page);}
}

批量操作

批量插入

使用 saveBatch 方法批量插入用户:

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {@Overridepublic boolean saveUserBatch(List<User> userList) {return this.saveBatch(userList);}
}
批量更新

使用 updateBatchById 方法批量更新用户:

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {@Overridepublic boolean updateUserBatch(List<User> userList) {return this.updateBatchById(userList);}
}
批量删除

使用 removeByIds 方法批量删除用户:

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {@Overridepublic boolean deleteUserBatch(List<Long> idList) {return this.removeByIds(idList);}
}

自定义 SQL 操作

如果 MyBatis-Plus 提供的内置方法无法满足需求,可以在 Mapper 接口中定义自定义 SQL 方法。

在 Mapper 接口中定义方法
@Mapper
public interface UserMapper extends BaseMapper<User> {@Select("SELECT * FROM user WHERE age > #{age}")List<User> findUsersByAge(int age);
}
在 Service 层调用自定义方法
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {@Overridepublic List<User> findUsersByAge(int age) {return userMapper.findUsersByAge(age);}
}

示例代码总结

上述示例展示了在 Spring Boot 中使用 MyBatis-Plus 进行各种数据库操作的方法。在实际项目中,可以根据具体需求,在 Service 层和 Mapper 层灵活组合和扩展这些方法,以实现复杂的业务逻辑。

注意事项

  • 确保数据库表结构与实体类属性对应,否则可能导致数据操作异常。
  • 在使用 QueryWrapper 构建条件时,注意条件的正确性和安全性,防止 SQL 注入。
  • 对于分页操作,要合理设置分页参数,避免数据量过大导致性能问题。

通过以上内容,你可以全面掌握在 Spring Boot 中使用 MyBatis-Plus 进行数据库操作的方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/891464.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

naive ui 使用地址记录

naive ui 地址Naive UI Naive UI 是一个 Vue3 的组件库。 要了解如何安装&#xff0c;参见安装。 它比较完整&#xff0c;主题可调&#xff0c;用 TypeScript 写的&#xff0c;快

CVSS漏洞评分系统曝出严重缺陷

在网络安全领域&#xff0c;漏洞的管理和评估是企业防御的重要一环。然而&#xff0c;随着技术的快速发展和攻击手段的不断演变&#xff0c;传统的漏洞评分系统显露出了不可忽视的弊端。在近期的Black Hat欧洲大会上&#xff0c;摩根大通的网络安全专家警告称&#xff0c;通用漏…

深入剖析MySQL数据库架构:核心组件、存储引擎与优化策略(一)

sql语句分为两大类&#xff1a;查询&#xff08;select&#xff09;、增删改----修改&#xff08;update&#xff09; select语句的执行流程 执行sql语句的流程&#xff1a;连接数据库、缓存查询、解析器、优化器、执行器、存储引擎操作数据 客户端&#xff1a;图形界面工具…

电子病历四级视角下SQL语句的优化策略与实践用例研究

一、引言 1.1 研究背景与意义 在当今数智化医疗时代,电子病历(Electronic Medical Record,EMR)系统已成为医疗机构信息化建设的核心组成部分。电子病历不仅承载着患者的诊疗信息,更是医疗决策、质量控制、科研分析以及医疗管理的重要依据。根据国家卫生健康委发布的《电…

如何借助 AI 提升工作效率

AI让工作更高效 引言 你是否曾在忙碌的工作中感到力不从心&#xff0c;无法高效完成任务&#xff1f;在如今这个信息爆炸的时代&#xff0c;时间似乎总是不够用。而幸运的是&#xff0c;人工智能&#xff08;AI&#xff09;的崛起让这一切发生了变化。AI的应用正日益深入我们…

C++简明教程(14)动态库和静态库的内存共享机制

总结&#xff0c;动态库共享内存&#xff0c;静态库独占一份内存。

NextCloud服务安装与配置教程

NextCloud服务安装与配置教程 什么是 NextCloud: Nextcloud 是一款开源的私有云存储和协作平台,允许用户在自己的服务器上托管数据并管理团队协作。它可以作为一个功能丰富、安全可靠的替代方案,与商业云服务(如 Google Drive、Dropbox)相比提供更多控制和隐私保护。简单来…

Elasticsearch向量检索需要的数据集以及768维向量生成

Elasticsearch8.17.0在mac上的安装 Kibana8.17.0在mac上的安装 Elasticsearch检索方案之一&#xff1a;使用fromsize实现分页 快速掌握Elasticsearch检索之二&#xff1a;滚动查询(scrool)获取全量数据(golang) Elasticsearch检索之三&#xff1a;官方推荐方案search_after…

CSS2笔记

一、CSS基础 1.CSS简介 2.CSS的编写位置 2.1 行内样式 2.2 内部样式 2.3 外部样式 3.样式表的优先级 4.CSS语法规范 5.CSS代码风格 二、CSS选择器 1.CSS基本选择器 通配选择器元素选择器类选择器id选择器 1.1 通配选择器 1.2 元素选择器 1.3 类选择器 1.4 ID选择器 1.5 基…

Prometheus 专栏 —— Prometheus安装、配置

配置文件基本结构 global: 全局配置 scrape_interval: 抓取目标指标的频率,默认为 1minevaluation_interval: 评估告警规则的频率,默认为 1minscrape_timeout: 抓取目标指标数据拉取超时,默认为 10s,如果出现 context deadline exceeded 错误时需要在特定的 job 下配置该字…

基于AT89C51单片机的可暂停八路抢答器设计

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/90196607?spm1001.2014.3001.5503 C15 部分参考设计如下&#xff1a; 摘要 随着社会进步和科技发展&#xff0c;电子设备在各类活动中的应用日益普遍&#xff0c…

【python】unittest单元测试

文章目录 基本使用不同启动方式的区别 基本使用 下面是根据文档写的一个demo&#xff0c;主要的内容基本都包含了&#xff0c;使用时导入自己的业务类测试类中的方法就行。 import unittest# 测试类不强制test开头&#xff0c;仅作为规范。但必须继承unittest.TestCase class…

MySQL实用SQL示例

创建数据库 CREATE DATABASE zq-cloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;创建表 CREATE TABLE regulatory_firm_category (category_id int NOT NULL AUTO_INCREMENT COMMENT 分类id&#xff0c;自增主键,parent_id int NOT NULL COMMENT 父级id,category_…

从0入门自主空中机器人-4-【PX4与Gazebo入门】

前言: 从上一篇的文章 从0入门自主空中机器人-3-【环境与常用软件安装】 | MGodmonkeyの世界 中我们的机载电脑已经安装了系统和常用的软件&#xff0c;这一篇文章中我们入门一下无人机常用的开源飞控PX4&#xff0c;以及ROS中无人机的仿真 1. PX4的安装 1.1 PX4固件代码的下载…

数据结构与算法之动态规划: LeetCode 674. 最长连续递增序列 (Ts版)

最长连续递增序列 https://leetcode.cn/problems/longest-continuous-increasing-subsequence/description/ 描述 给定一个未经排序的整数数组&#xff0c;找到最长且 连续递增的子序列&#xff0c;并返回该序列的长度连续递增的子序列 可以由两个下标 l 和 r&#xff08;l …

SqlSession的线程安全问题源码分析

&#x1f3ae; 作者主页&#xff1a;点击 &#x1f381; 完整专栏和代码&#xff1a;点击 &#x1f3e1; 博客主页&#xff1a;点击 文章目录 SqlSession 是线程安全的吗&#xff1f;为什么说是线程不安全的&#xff1f;事务管理问题 数据库连接的共享问题 一级缓存线程安全问题…

Unity Mesh生成Cube

1. 配置一个Cube的每个面的数据 一共是6个面&#xff0c;每个面包含的数据包括4个顶点的相对顶点坐标&#xff08;Cube的中心为原点&#xff09;&#xff0c;法线方向&#xff0c;UV坐标&#xff0c;顶点渲染顺序&#xff0c;以及这个面用到的材质&#xff0c;因为这里是Top&am…

小程序组件 —— 22 组件案例 - 轮播区域绘制

这一节我们实现轮播图最外层的盒子&#xff0c;也就是把轮播图的最外层搭好&#xff0c;先不给轮播图添加图片&#xff0c;因为图片属于新的组件&#xff0c;组件里面有一些知识点&#xff0c;需要单独分开讲&#xff1b; 回顾一下&#xff0c;在进行传统网页开发时&#xff0…

【文献精读笔记】Explainability for Large Language Models: A Survey (大语言模型的可解释性综述)(二)

****非斜体正文为原文献内容&#xff08;也包含笔者的补充&#xff09;&#xff0c;灰色块中是对文章细节的进一步详细解释&#xff01; 3.1.2 基于注意力的解释&#xff08;Attention-Based Explanation&#xff09; 注意力机制可以揭示输入数据中各个部分之间的关系&#…

【centos8 镜像修改】centos8 镜像修改阿里云

要将 CentOS 8 的镜像源修改为阿里云镜像&#xff0c;你需要编辑 /etc/yum.repos.d/ 目录下的 .repo 文件。以下是具体的步骤&#xff1a; 备份原始的 .repo 文件&#xff1a; 在编辑之前&#xff0c;建议备份原始的 .repo 文件&#xff0c;以便在出现问题时可以恢复。 sudo cp…