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构建

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

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

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

相关文章

【Rust 轻松构建轻量级多端桌面应用】

使用 Tauri 框架构建跨平台应用 Tauri 是一个基于 Rust 的轻量级框架&#xff0c;可替代 Electron&#xff0c;用于构建高性能、低资源占用的桌面应用。其核心优势在于利用系统原生 WebView 而非捆绑 Chromium&#xff0c;显著减小应用体积。 安装 Tauri 需要先配置 Rust 环境…

【Linux】shell脚本的常用命令

目录 简介 一.设置主机名称 1.1通过文件修改 1.2通过命令修改 二.网络管理命令nmcli 2.1查看网卡 2.2设置网卡 三.简单处理字符 3.1seq打印连续字符 3.2printf,echo打印字符 3.3sort排序 3.4uniq冗余处理 3.5cut对字符的截取 四.xargs输入转参 简介 以下命令都是…

解决访问网站提示“405 很抱歉,由于您访问的URL有可能对网站造成安全威胁,您的访问被阻断”问题

一、问题描述 本来前几天都可以正常访问的网站&#xff0c;但是今天当我们访问网站的时候会显示“405 很抱歉&#xff0c;由于您访问的URL有可能对网站造成安全威胁&#xff0c;您的访问被阻断。您的请求ID是&#xff1a;XXXX”&#xff0c;而不能正常的访问网站&#xff0c;如…

页面输入数据的表格字段(如 Web 表单或表格控件)与后台数据库进行交互时常用的两种方式

“从页面输入数据的表格字段(如 Web 表单或表格控件)在与后台数据库进行交互时,常用的有两种方式:” 🎯 两种方式(操作调用数据库、绑定数据) 🚀 方式1:前端代码提交数据到后端,再由后端调用数据库 💡 原理和逻辑: 用户在页面上(比如输入表单、表格)输入数据…

非阻塞套接字编程详解

阻塞与非阻塞套接字对比 传统阻塞式套接字编程使用ServerSocket和Socket类时,关键方法如connect()、accept()、read()、write()都会导致调用线程阻塞,直到操作完成。这种模式存在两个主要问题: 客户端线程在等待数据时会被完全阻塞服务端需要为每个客户端连接创建独立线程,…

电子电路:初步认识CMOS技术

CMOS&#xff08;Complementary Metal-Oxide-Semiconductor&#xff0c;互补金属氧化物半导体&#xff09;是一种半导体技术&#xff0c;广泛应用于集成电路&#xff08;IC&#xff09;的设计和制造中。以下是关于CMOS的详细说明&#xff1a; 1. 基本概念 技术原理&#xff1a…

【11408学习记录】考研英语写作提分秘籍:2013真题邀请信精讲+万能模板套用技巧

邀请信 英语写作2013年考研英语&#xff08;一&#xff09;真题小作文题目分析写作思路第一段&#xff1a;第二段&#xff1a;锦囊妙句1&#xff1a;锦囊妙句2&#xff1a;锦囊妙句3&#xff1a;锦囊妙句5&#xff1a;锦囊妙句6&#xff1a;锦囊妙句9&#xff1a;锦囊妙句14&am…

Java 注解与反射(超详细!!!)

Java 注解与反射&#xff08;超详细&#xff01;&#xff01;&#xff01;&#xff09; 文章目录 Java 注解与反射&#xff08;超详细&#xff01;&#xff01;&#xff01;&#xff09;1.注解1.1内置注解1.1.1 SuppressWarnings注解用法 1.2 元注解1.3自定义注解 2.反射2.1 反…

用nz-tabel写一个合并表格

用nz-tabel写一个合并表格 <nz-table #basicTable [nzData]"tableSearchStatus.dataList" nzBordered><thead><tr><th>班级</th><th>姓名</th><th>年龄</th><th>电话</th></tr></thead&…

第6章 放大电路的反馈

本章基本要求 会判&#xff1a;判断电路中有无反馈及反馈的性质 会算&#xff1a;估算深度负反馈条件下的放大倍数 会引&#xff1a;根据需求引入合适的反馈 会判振消振&#xff1a;判断电路是否能稳定工作&#xff0c;会消除自激振荡。 6.1 反馈的概念及判断 一、反馈的…

ansible template 文件中如果包含{{}} 等非ansible 变量处理

在 Ansible 模板中&#xff0c;如果你的 Python 脚本里有大量 {}、f""、或者其他 Jinja 会误解析的语法&#xff0c;就需要用 {% raw %}…{% endraw %} 把它们包起来&#xff0c;只在需要替换变量的那一行单独“放行”。例如&#xff1a; {% raw %} #!/usr/bin/env …

STM32G4 电机外设篇(一) GPIO+UART

目录 一、STM32G4 电机外设篇&#xff08;一&#xff09; GPIOUART1 GPIO1.1 STM32CUBEMX 配置以及Keil代码1.2 代码和实验现象 2 UART2.1 STM32CUBEMX 配置以及Keil代码2.2 代码和实验现象 附学习参考网址欢迎大家有问题评论交流 (* ^ ω ^) 一、STM32G4 电机外设篇&#xff0…

Kotlin 中集合遍历有哪几种方式?

1 for-in 循环&#xff08;最常用&#xff09; val list listOf("A", "B", "C") for (item in list) {print("$item ") }// A B C 2 forEach 高阶函数 val list listOf("A", "B", "C") list.forEac…

尚硅谷redis7 99 springboot整合redis之连接集群

6381宕机&#xff0c;手动shutdown后在redis中&#xff0c;634自动上位变成master结点。 但是在springboot中却没有动态感知道redisCluster的最新集群消息&#xff0c;所以找不到我们要检索的数据。原因是&#xff1a;SpringBoot 2.X版本,Redis默认的连接池采用 Lettuce&#…

AI 的早期萌芽?用 Swift 演绎约翰·康威的「生命游戏」

文章目录 摘要描述题解答案题解代码分析示例测试及结果时间复杂度空间复杂度总结 摘要 你有没有想过&#xff0c;能不能通过简单的规则模拟出生与死亡&#xff1f;「生命游戏」正是这样一种充满魅力的数学模拟系统。这篇文章我们来聊聊它的规则到底有多神奇&#xff0c;并用 S…

web ui自动化工具playwright

playwright是微软开源的一款web ui自动化工具&#xff0c;该工具有很多亮点&#xff0c;解决以前困扰web UI自动化测试的很多难点。这篇博客将介绍playwright主要特点。 playwright支持录制减少了编写成本 如果要使用playwright的录制功能&#xff0c;有两种途径&#xff0c;途…

移动安全Android——客户端静态安全

一、反编译保护 测试工具 Jadx GitHub - skylot/jadx: Dex to Java decompiler PKID [下载]PKID-APP查壳工具-Android安全-看雪-安全社区|安全招聘|kanxue.com 测试流程 &#xff08;1&#xff09;通过Jadx对客户端APK文件进行反编译&#xff0c;观察是否进行代码混淆 &…

04-redis-分布式锁-edisson

1 基本概念 百度百科&#xff1a;控制分布式系统之间同步访问共享资源方式。 在分布式系统中&#xff0c;常常需要协调他们的动作。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源&#xff0c;那么访问这些资源的时候&#xff0c;往往需要互斥来防止…

cf每日刷题

目录 String&#xff08;800&#xff09; Skibidus and Amogu&#xff08;800&#xff09; Apples in Boxes&#xff08;1100&#xff09; String&#xff08;800&#xff09; https://codeforces.com/problemset/problem/2062/A #include <iostream> #include <…

AWS WebRTC:获取ICE服务地址(part 1)

建立WebRTC连接的第二步是获取ICE服务地址。 ICE全称&#xff1a;Interactive Connectivity Establishment&#xff0c;建立互动连接。 ICE 服务地址&#xff0c;主要是 TURN 和 STUN 服务器的地址&#xff0c;用于 WebRTC 在 NAT 网络环境中协商建立连接。 上代码&#xff…