当前位置: 首页 > article >正文

SpringBoot整合MyBatis完整实践指南

在Java企业级应用开发中,SpringBoot和MyBatis的组合已经成为主流的技术选型方案之一。本文将详细介绍如何从零开始搭建一个基于SpringBoot和MyBatis的项目,包括环境配置、数据库设计、实体类创建、Mapper接口编写以及实际应用等完整流程。

一、环境准备

1.1 软件安装

首先需要安装以下软件:

  • MySQL 5.7:关系型数据库

  • Navicat:数据库可视化工具(可选但推荐)

安装MySQL时需要注意配置好root用户的密码,并确保服务正常启动。

1.2 数据库创建

我们创建一个名为black20250531的数据库,并建立用户表:

sql

复制

下载

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',`avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '头像',`nick` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '昵称',`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '用户名,登录用户名不能重复',`password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '密码',`role` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '角色',`phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '电话',`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '邮箱验证码',`recharge` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '充值记录',`consume` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '消耗',`balance` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '余额',PRIMARY KEY (`id`) USING BTREE,UNIQUE INDEX `用户登录名称`(`name`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 110 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = DYNAMIC;SET FOREIGN_KEY_CHECKS = 1;

表设计特点:

  • 使用utf8mb4字符集,支持完整的Unicode字符(包括emoji)

  • 主键id自增

  • 用户名name字段设置唯一索引

  • 包含基本的用户信息和财务相关字段

二、SpringBoot项目配置

2.1 引入MyBatis依赖

在pom.xml中添加MyBatis Starter依赖:

xml

复制

下载

运行

<!--mybatis-->
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.0</version>
</dependency>

2.2 数据库连接配置

在application.properties中配置数据库连接:

properties

复制

下载

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# mysql host and user password
spring.datasource.url=jdbc:mysql://${host}:3306/black20250531?serverTimezone=GMT%2b8&allowMultiQueries=true&useAffectedRows=true
spring.datasource.username=root
spring.datasource.password=xxx
mybatis.mapper-locations=classpath:mapper/*.xml

配置说明:

  • 使用MySQL Connector/J驱动

  • 设置时区为GMT+8(中国标准时间)

  • 允许批量查询和使用受影响的行数

  • 指定Mapper XML文件的位置

三、实体类与Mapper设计

3.1 用户实体类

java

复制

下载

package com.black.pojo;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.black.service.PageService;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;import java.util.Date;
import java.util.List;@Data // 直接带get与set
public class User implements PageService {@TableId(type = IdType.AUTO)private Integer id;private String avatar;private String nick;private String name;private String password;private String code;private String phone;private String recharge = "0";private String consume = "0";private String balance; // 余额@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private Date createTime;private String role; // 角色@TableField(exist = false)private String newPassword;// 扣费成功标志@TableField(exist = false)private Boolean reduceFlag;//分页属性@TableField(exist = false)private Integer currentPage;@TableField(exist = false)private Integer pageSize;@TableField(exist = false)private Integer start;@TableField(exist = false)private Integer end;//批量删除id@TableField(exist = false)private List<Integer> removeIdList;@TableField(exist = false)private String token; // 会话凭证@TableField(exist = false)private List<Menu> menuList; // 用户拥有的菜单private String ability;
}

实体类特点:

  • 使用Lombok的@Data注解简化代码

  • 使用MyBatis Plus的@TableId指定自增主键

  • @TableField(exist = false)标记非数据库字段

  • @JsonFormat格式化日期输出

3.2 Mapper接口

java

复制

下载

package com.black.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.black.pojo.User;
import org.apache.ibatis.annotations.Param;import java.util.List;public interface UserMapper extends BaseMapper<User> { // 继承BaseMapper即拥有了CRUD基本方法
}

3.3 MyBatis配置类

java

复制

下载

package com.black.config;import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
@MapperScan("com.black.mapper")
public class MybatisPlus {@Beanpublic MybatisPlusInterceptor buildMybatisPlusInterceptor() {MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return mybatisPlusInterceptor;}
}

配置说明:

  • @MapperScan指定Mapper接口扫描路径

  • 配置MyBatis Plus分页插件

四、实际应用示例

在Controller中使用Mapper进行数据库操作:

java

复制

下载

@RestController
@RequestMapping("/big")
public class BigController {@ResourceUserMapper userMapper;@PostMapping("/checkUser")public Res checkUser(@RequestBody User user) {QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();userQueryWrapper.eq(StringUtils.isNotBlank(user.getName()), "name", user.getName());User existUser = userMapper.selectOne(userQueryWrapper);if (existUser != null) {return Res.error("用户名已存在");}return Res.success();}
}

代码解析:

  1. 使用@Resource注入UserMapper

  2. 创建QueryWrapper构建查询条件

  3. 调用selectOne方法查询单个用户

  4. 根据查询结果返回相应信息

五、MyBatis Plus的优势

  1. 简化CRUD操作:继承BaseMapper即获得基本CRUD方法

  2. 强大的条件构造器:通过QueryWrapper可以方便地构建复杂查询条件

  3. 分页插件:内置分页功能,简化分页查询实现

  4. 自动填充:支持字段自动填充(如创建时间、更新时间等)

  5. 乐观锁:内置乐观锁实现

六、常见问题解决

  1. 数据库连接失败

    • 检查MySQL服务是否启动

    • 检查连接URL、用户名和密码是否正确

    • 检查数据库驱动版本是否匹配

  2. 表字段与实体类属性映射问题

    • 确保数据库字段名与实体类属性名一致(或使用@TableField指定)

    • 检查是否配置了正确的驼峰命名转换

  3. 分页不生效

    • 确保配置了分页插件

    • 检查是否传入了正确的Page参数

七、总结

本文详细介绍了SpringBoot整合MyBatis的完整流程,从环境准备到实际应用,涵盖了数据库设计、实体类创建、Mapper接口编写以及基本CRUD操作。MyBatis Plus作为MyBatis的增强工具,可以显著提高开发效率,减少样板代码的编写。

在实际项目中,还可以进一步探索:

  • MyBatis Plus的自动填充功能

  • 多数据源配置

  • 复杂的动态SQL构建

  • 二级缓存配置等高级特性

相关文章:

SpringBoot整合MyBatis完整实践指南

在Java企业级应用开发中&#xff0c;SpringBoot和MyBatis的组合已经成为主流的技术选型方案之一。本文将详细介绍如何从零开始搭建一个基于SpringBoot和MyBatis的项目&#xff0c;包括环境配置、数据库设计、实体类创建、Mapper接口编写以及实际应用等完整流程。 一、环境准备…...

RNN结构扩展与改进:从简单循环网络到时间间隔网络的技术演进

本文系统介绍 RNN 结构的常见扩展与改进方案。涵盖 简单循环神经网络&#xff08;SRN&#xff09;、双向循环神经网络&#xff08;BRNN&#xff09;、深度循环神经网络&#xff08;Deep RNN&#xff09; 等多种变体&#xff0c;解析其核心架构、技术特点及应用场景&#xff0c;…...

docker中,容器时间和宿机主机时间不一致问题

win11下的docker中有个mysql。今天发现插入数据的时间不正确。后来发现原来是docker容器中的时间不正确。于是尝试了各种修改&#xff0c;什么run -e TZ"${tzutil /g}"&#xff0c;TZ"Asia/Shanghai"&#xff0c;还有初始化时带--mysqld一类的&#xff0c;…...

Unity Shader编程】之高级纹理

一&#xff0c;立方体纹理 Cubemap 用途 用途说明反射贴图表面镜面高光或金属反射环境光采样模拟环境对物体的影响天空盒背景使用六张图拼接场景背景全景投影做360度相机渲染、投影等 二&#xff0c;创建立方体纹理 在 Unity 中创建和保存一个 立方体纹理&#xff08;Cubema…...

类 Excel 数据填报

类 Excel 填报模式&#xff0c;满足用户 Excel 使用习惯 数据填报&#xff0c;可作为独立的功能模块&#xff0c;用于管理业务流程、汇总采集数据&#xff0c;以及开发各类数据报送系统&#xff0c;因此&#xff0c;对于报表工具而言&#xff0c;其典型场景之一就是利用报表模…...

vscode调试stm32,Cortex Debug的配置文件lanuch.json如何写,日志

https://blog.csdn.net/jiladahe1997/article/details/122046665 https://discuss.em-ide.com/blog/67-cortex-debug 第一版 {// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。// 欲了解更多信息&#xff0c;请访问: https://go.microsoft.com/fwlink/?li…...

Office文档图片批量导出工具

软件介绍 本文介绍一款专业的Office文档图片批量导出工具。 软件特点 这款软件能够批量导出Word、Excel和PPT中的图片&#xff0c;采用绿色单文件设计&#xff0c;体积小巧仅344KB。 基本操作流程 使用方法十分简单&#xff1a;直接将Word、Excel或PPT文件拖入软件&#xf…...

【iOS】ARC 与 Autorelease

ARC 与 Autorelease 文章目录 ARC 与 Autorelease前言何为ARC内存管理考虑方式自己生成的对象,自己持有非自己生成的对象,自己也可以持有不再需要自己持有的对象时释放非自己持有的对象无法释放 ARC的具体实现编译期和运行期ARC做的事情ARC实现: __autoreleasing 与 Autoreleas…...

人工智能在智能零售中的创新应用与未来趋势

随着电子商务的蓬勃发展和消费者需求的不断变化&#xff0c;零售行业正面临着前所未有的挑战和机遇。智能零售作为零售行业的重要发展方向&#xff0c;通过引入人工智能&#xff08;AI&#xff09;、物联网&#xff08;IoT&#xff09;、大数据和云计算等前沿技术&#xff0c;正…...

业务材料——半导体行业MES系统核心功能工业协议AI赋能

一、前置概念 半导体行业 半导体行业主要生产基于半导体材料&#xff08;如硅、锗、化合物半导体等&#xff09;的电子元器件及相关产品&#xff0c;广泛应用于计算、通信、能源、医疗等领域。 MES系统 MES系统&#xff08;Manufacturing Execution System&#xff0c;制造…...

docker部署命令行 — 启动一个 MySQL 数据库服务 并且把它的数据存储挂载到卷(volume)里

挂载卷的配置写法&#xff1a; version: "3" services:db:image: mysqlvolumes:- mysql_data:/var/lib/mysqlvolumes:mysql_data:这段 docker-compose.yml 配置非常典型&#xff0c;是用来启动一个 MySQL 数据库服务 并且把它的数据存储挂载到卷&#xff08;volume&…...

铁电液晶破局 VR/AR:10000PPI 重构元宇宙显示体验

一、VR/AR 沉浸感困境&#xff1a;传统显示技术的天花板在哪&#xff1f; &#xff08;一&#xff09;纱窗效应与眩晕感&#xff1a;近眼显示的双重枷锁 当用户戴上 VR 头显&#xff0c;眼前像素网格形成的 “纱窗效应” 瞬间打破沉浸感。传统液晶 500-600PPI 的像素密度&…...

2025年微信小程序开发:AR/VR与电商的最新案例

引言 微信小程序自2017年推出以来&#xff0c;已成为中国移动互联网生态的核心组成部分。根据最新数据&#xff0c;截至2025年&#xff0c;微信小程序的日活跃用户超过4.5亿&#xff0c;总数超过430万&#xff0c;覆盖电商、社交、线下服务等多个领域&#xff08;WeChat Mini …...

从零开始,学会上传,更新,维护github仓库

以下是一份从头到尾、覆盖安装、配置、创建仓库、上传项目到 GitHub 的完整教程。全程使用通用示例&#xff0c;不包含任何具体的仓库链接&#xff0c;仅供参考。 一、准备工作 1. 注册 GitHub 账号 打开浏览器&#xff0c;访问 GitHub 官网&#xff08;输入 “GitHub” 即可找…...

#STM32 HAL库实现的STM32F407时钟配置程序以及和STM32F103配置对比

以下是使用STM32 HAL库实现的STM32F407时钟配置完整代码&#xff08;基于8MHz外部晶振&#xff0c;配置为168MHz系统时钟&#xff09;&#xff0c;包含详细注释和关键点说明&#xff1a; 完整HAL库实现&#xff08;system_stm32f4xx.c main.c&#xff09; 1. 首先在stm32f4xx…...

竞争加剧,美团的战略升维:反内卷、科技与全球化

5月26日&#xff0c;美团发布2025年第一季度业绩报告&#xff0c;交出了一份兼具韧性与创新性的成绩单。 报告显示&#xff0c;公司一季度总营收866亿元&#xff0c;同比增长18%&#xff1b;核心本地商业收入643亿元&#xff0c;同比增长18%&#xff1b;季度研发投入58亿元&a…...

(17)课36:窗口函数的例题:例三登录时间与连续三天登录,例四球员的进球时刻连续进球。

&#xff08;89&#xff09;例三登录时间 &#xff1a; 保留代码版本 &#xff1a; CREATE TABLE sql_8( user_id varchar(2), login_date date ); insert into sql_8(user_id,login_date) values(A,2024-09-02),(A,2024-09-03),(A,2024-09-04),(B,2023-11-25),(B,2023-12- 3…...

高性能分布式消息队列系统(二)

上一篇博客将C进行实现消息队列的用到的核心技术以及环境配置进行了详细的说明&#xff0c;这一篇博客进行记录消息队列进行实现的核心模块的设计 五、项目的需求分析 5.1、项目框架的概念性理解 5.1.1、消息队列的设计和生产消费者模型的关系 在现代系统架构中&#xff0c;…...

Spring 官方推荐构造函数注入

1. 依赖关系明确 构造函数注入可以清晰地声明类的依赖关系&#xff0c;所有必需的依赖项都通过构造函数参数传递&#xff0c;使得代码的可读性更高。这种方式让类的使用者能够直观地了解类的依赖&#xff0c;而不需要通过注解或反射来猜测。 2. 增强代码健壮性 构造函数注入…...

华为OD机试真题——天然蓄水库(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 A卷 200分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 2025华为OD真题目录+全流程解析/备考攻略/经验分享 华为OD机试真题《天然蓄水库》: 目录 题目…...

【Harmony OS】数据存储

目录 数据存储概述 首选项数据存储 关系型数据库 数据存储概述 • 数据存储 是为了解决应用数据持久化问题&#xff0c;使得数据能够存储在外存中&#xff0c;达到保存或共享目的。 • 鸿蒙应用数据存储包括 本地数据存储 和 分布式数据存储 。 • 本地数据存储 为应用…...

MybatisPlus--核心功能--service接口

Service接口 基本用法 MyBatisPlus同时也提供了service接口&#xff0c;继承后一些基础的增删改查的service代码&#xff0c;也不需要去书写。 接口名为Iservice&#xff0c;而Iservice也继承了IRepository&#xff0c;这里提供的方法跟BaseMapper相比只多不少&#xff0c;整…...

uniapp调试,设置默认展示的toolbar内容

uniapp调试&#xff0c;设置默认展示的toolbar内容 设置pages.json中 pages数组中 json的顺序就可以只需要调整顺序&#xff0c;不会影响该bar在页面中的显示默认展示第一条page...

笔记本电脑开机无线网卡自动禁用问题

1.问题环境 电脑品牌&#xff1a;华硕笔记本天选4 电脑型号&#xff1a;FX507VV 电脑系统&#xff1a;windows 11_x64_24h2 文档编写时间&#xff1a;2025年6月 2.问题现象 1. 笔记本电脑开机之后自动禁用无线网卡 使用USB转RJ45转接头同样无效&#xff0c;这个网卡也给禁…...

推荐一款使用html开发桌面应用的工具——mixone

简介 mixone是开发桌面应用&#xff08;Win、Mac、Linux&#xff09;的一款工具、其基于electron实现。其拥有简单的工程结构。以为熟悉前端开发的程序员可以很轻松的开发出桌面应用&#xff0c;它比electron的其他框架更简单&#xff0c;因为那些框架基本上还需要了解electro…...

支持TypeScript并打包为ESM/CommonJS/UMD三种格式的脚手架项目

支持TypeScript并打包为ESM、CommonJS和UMD三种格式的脚手架项目 码云地址 NODE 版本要求 node v16.17.1 npm 8.15.0 设置淘宝镜像 npm set registry https://registry.npmjs.org/ cnpm set registry https://registry.npmjs.org/安装依赖 npm install打包 npm run build…...

【云原生开发】如何通过client-go来操作K8S集群

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…...

八.MySQL复合查询

一.基本查询回顾 分组统计 group by 函数作用示例语句说明count(*)统计记录条数select deptno, count(*) from emp group by deptno;每个部门有多少人&#xff1f;sum(sal)某字段求和select deptno, sum(sal) from emp group by deptno;每个部门总工资avg(sal)求平均值select…...

cacti导出的1分钟监控数据csv文件读取并按5分钟求平均值,然后计算95计费值,假设31天的月份

cacti导出的1分钟监控数据csv文件读取并按5分钟求平均值&#xff0c;然后计算95计费值&#xff0c;假设31天的月份 import pandas as pd import openpyxl from openpyxl.styles import Font from openpyxl.utils.dataframe import dataframe_to_rows import os import chardet…...

FastMCP vs MCP:协议标准与实现框架的协同

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 文章目录 一…...