MyBatis整合SpringBoot终极指南

以下是一份系统化的 ​MyBatis 整合 Spring Boot 学习笔记,结合官方文档与最佳实践整理,涵盖配置、核心功能、实战示例及常见问题解决。


一、整合基础与依赖配置

1. ​核心依赖

pom.xml 中添加:

<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.2</version> <!-- 推荐 ≥2.3.x -->
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope>
</dependency>
  • 作用​:自动引入 MyBatis 核心库、Spring JDBC、HikariCP 连接池。
2. ​数据源配置

application.yml 中配置:

spring:datasource:url: jdbc:mysql://localhost:3306/test?serverTimezone=UTCusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Drivermybatis:mapper-locations: classpath:mapper/**/*.xml  # XML 映射文件路径type-aliases-package: com.example.entity     # 实体类别名包configuration:map-underscore-to-camel-case: true         # 开启驼峰命名映射

​:无需手动配置 SqlSessionFactory,starter 自动创建。


二、核心组件与数据操作

1. ​实体类与 Mapper 接口
  • 实体类​(使用 Lombok 简化):

    @Data
    public class User {private Long id;private String name;private Integer age;
    }
  • Mapper 接口​(两种注册方式):

    // 方式1:单接口添加 @Mapper
    @Mapper
    public interface UserMapper {User selectById(Long id);
    }// 方式2:启动类批量扫描
    @SpringBootApplication
    @MapperScan("com.example.mapper")  // 扫描包下所有接口
    public class Application { ... }
    注册方式优点缺点
    @Mapper无需全局扫描配置每个接口需单独注解
    @MapperScan批量注册,避免警告需指定包路径
2. ​SQL 映射方式
  • 注解方式​(简单查询):

    @Select("SELECT * FROM user WHERE id = #{id}")
    User selectById(Long id);
  • XML 方式​(复杂 SQL):

    <!-- resources/mapper/UserMapper.xml -->
    <mapper namespace="com.example.mapper.UserMapper"><select id="selectByName" resultType="User">SELECT * FROM user WHERE name LIKE CONCAT('%', #{name}, '%')</select>
    </mapper>

三、高级特性与优化

1. ​事务管理
  • 直接使用 Spring 的 @Transactional
    @Service
    public class UserService {@Autowiredprivate UserMapper userMapper;@Transactionalpublic void updateUser(User user) {userMapper.update(user);}
    }

    默认使用 DataSourceTransactionManager

2. ​类型处理器(TypeHandler)​

处理特殊类型转换(如枚举↔数据库字段):

@MappedTypes(SexEnum.class)
public class SexTypeHandler extends BaseTypeHandler<SexEnum> {@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, SexEnum sex, JdbcType jdbcType) {ps.setInt(i, sex.getId());  // 将枚举值存储为整数}// 其他方法实现...
}

在配置中启用:

mybatis:type-handlers-package: com.example.handler  # 类型处理器包路径
3. ​二级缓存
  • 启用步骤​:
    1. 全局配置开启缓存:
    mybatis:configuration:cache-enabled: true
    1. 在 Mapper XML 中添加 <cache/> 标签:
    <mapper namespace="com.example.mapper.UserMapper"><cache/>
    </mapper>

四、常见问题与解决

问题原因解决方案
Mapper 接口注入失败未扫描到接口添加 @MapperScan@Mapper
SQL 参数 #{} 报错参数名未匹配使用 @Param("name") 明确命名
时区错误(ServerTimezone)MySQL 驱动版本问题URL 添加 ?serverTimezone=UTC
驼峰命名未生效配置未开启设置 map-underscore-to-camel-case: true

五、项目结构示例

src/
├── main/
│   ├── java/
│   │   ├── com.example.Application.java     # 启动类
│   │   ├── entity/User.java                 # 实体类
│   │   ├── mapper/UserMapper.java           # Mapper 接口
│   │   └── service/UserService.java         # 业务层
│   └── resources/
│       ├── mapper/UserMapper.xml            # XML 映射文件
│       └── application.yml                  # 配置文件

六、扩展:多数据源配置

@Configuration
@MapperScan(basePackages = "com.example.primary", sqlSessionFactoryRef = "sqlSessionFactory1")
public class PrimaryDataSourceConfig {@Bean@ConfigurationProperties(prefix = "spring.datasource.primary")public DataSource primaryDataSource() {return DataSourceBuilder.create().build();}@Beanpublic SqlSessionFactory sqlSessionFactory1(@Qualifier("primaryDataSource") DataSource dataSource) throws Exception {SqlSessionFactoryBean factory = new SqlSessionFactoryBean();factory.setDataSource(dataSource);return factory.getObject();}
}

需为每个数据源独立配置 SqlSessionFactory 和事务管理器。


参考资料

  1. MyBatis 二级缓存与事务整合
  2. Spring Boot 多数据源实战

完整代码示例可参考 。

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

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

相关文章

企业微信ipad协议接口解决方案最新功能概览

支持最新版本企业微信&#xff0c;安全稳定0封号免费试用&#xff0c;技术支持&#xff1a;string wechat"Mrzhu0107"企微ipad协议接口最新功能升级如下&#xff1a;【初始化】初始化企业微信&#xff0c;设置消息回调地址&#xff0c;获取运行中的实例&#xff0c;根…

ansible 批量 scp 和 load 镜像

1、save 镜像脚本 在本地保存镜像到 ansible 代码目录的脚本。 1.1、使用说明: 保存单个镜像 save -i gcr.io/cadvisor/cadvisor:v0.52.1保存某个 namespace 下的所有镜像 save1.2、脚本内容 cat /usr/local/bin/save #!/bin/bash #set -e # 分隔符 str="-"# …

【C# in .NET】20. 探秘静态类:抽象与密封的结合体

探秘静态类:抽象与密封的结合体 一、静态类的底层本质:抽象与密封的结合体 静态类作为 C# 中特殊的类型形式,其底层实现融合了抽象类与密封类的特性,形成了不可实例化、不可继承的类型约束。 1. IL 层面的静态类标识 定义一个简单的静态类: public static class Stri…

【Vue3】ECharts图表案例

官方参考&#xff1a;Examples - Apache ECharts 1、创建工程 npm create vitelatest 或 npm init vuelatest 设置如下 2、下载依赖集运行项目 cd vue-echarts-demo npm install npm install echarts npm run dev 3、编写核心代码 创建src\components\BarView.vue文件…

二分查找----2.搜索二维矩阵

题目链接 /** 方案一: 每行都是递增的,对每行进行二分,逐行查找;效率不高,每次搜索只能控制列无法兼顾到行,行被固定存在不必要的搜索 方案二: 从右上或左下顶点出发,以右上为例,向左迭代列减小,向下迭代行增大;效率更高避免重复搜索 */ class Solution {/**方案一: 每行都是…

2025.7.23

flen&#xff08;&#xff09;这个函数计算到的文件大小为0&#xff0c;明天解决 原因是路径错误&#xff0c;写成了CONFIG_ROOT_PATH"/music/test2.mp3,但是也没报错&#xff0c;打开文件也成功&#xff0c;所以就没有怀疑到路径方面来

大致自定义文件I/O库函数的实现详解(了解即可)

目录 一、mystdio.h 代码思路分析 二、mystdio.c 1. 辅助函数 BuyFile 2. 文件打开函数 MyFopen 3. 文件关闭函数 MyFclose 4. 数据写入函数 MyFwrite 1、memcpy(file->outbuffer file->bufferlen, str, len); 2、按位与&#xff08;&&#xff09;运算的作…

Zipformer

Zipformer首先&#xff0c;Conv-Embed 将输入的 100Hz 的声学特征下采样为 50 Hz 的特征序列&#xff1b;然后&#xff0c;由 6 个连续的 encoder stack 分别在 50Hz、25Hz、12.5Hz、6.25Hz、12.5Hz 和 25Hz 的采样率下进行时域建模。除了第一个 stack 外&#xff0c;其他的 st…

SpringMVC快速入门之请求与响应

SpringMVC快速入门之请求与响应一、请求处理&#xff1a;获取请求参数1.1 普通参数获取&#xff08;RequestParam&#xff09;1.1.1 基础用法1.1.2 可选参数与默认值1.2 路径变量&#xff08;PathVariable&#xff09;1.3 表单数据绑定到对象1.3.1 定义实体类1.3.2 绑定对象参数…

【Mysql】 Mysql zip解压版 Win11 安装备忘

1. 官网 MySQL :: MySQL Community Downloads 选择 MySQL Community Server 选择Archives 选择 8.0版本 MySQL :: Download MySQL Community Server (Archived Versions) 1. 普通版本&#xff08;推荐&#xff09; 名称&#xff1a;Windows (x86, 64-bit), ZIP Archive 文件…

Web3面试题

1.在使用 Ethers.js 对接 MetaMask 钱包时&#xff0c;如何检测用户账户切换的情况&#xff1f;请简述实现思路。 答案&#xff1a;可通过监听accountsChanged事件来检测。当用户切换账户时&#xff0c;MetaMask 会触发该事件&#xff0c;在事件回调函数中可获取新的账户地址&…

uni-app动态获取屏幕边界到安全区域距离的完整教程

目录 一、什么是安全区域&#xff1f; 二、获取安全区域距离的核心方法 三、JavaScript动态获取安全区域距离 1. 核心API 2. 完整代码示例 3. 关键点说明 四、CSS环境变量适配安全区域 1. 使用 env() 和 constant() 3. 注意事项 五、不同平台的适配策略 1. H5 端 2…

ZKmall开源商城微服务架构实战:Java 商城系统的模块化拆分与通信之道

在电商业务高速增长的今天&#xff0c;传统单体商城系统越来越力不从心 —— 代码堆成一团、改一点牵一片、想加功能得大动干戈&#xff0c;根本扛不住高并发、多场景的业务需求。微服务架构却能破这个局&#xff1a;把系统拆成一个个能独立部署的小服务&#xff0c;每个服务专…

ROS 与 Ubuntu 版本的对应关系

ROS 作为一套用于构建机器人应用的开源框架&#xff0c;其开发和运行高度依赖 Ubuntu 等 Linux 发行版&#xff0c;尤其是 Ubuntu 因其广泛的兼容性和社区支持&#xff0c;成为了 ROS 最主流的运行平台。 一、ROS 与 Ubuntu 版本的对应关系&#xff08;截至 2025 年&#xff0c…

GPT-4o mini TTS:领先的文本转语音技术

什么是 GPT-4o mini TTS&#xff1f; GPT-4o mini TTS 是 OpenAI 推出的全新一代文本转语音&#xff08;TTS&#xff09;技术&#xff0c;能够以自然、流畅的方式将普通文本转换为语音。依托先进的神经网络架构&#xff0c;GPT-4o mini TTS 在语音合成中避免了传统 TTS 的生硬…

Git下载全攻略

目标读者初学者或有经验的开发者不同操作系统用户&#xff08;Windows、macOS、Linux&#xff09;下载前的准备确认系统版本和位数&#xff08;32-bit/64-bit&#xff09;检查网络环境是否稳定确保有足够的磁盘空间Windows系统下载Git访问Git官方网站&#xff08;https://git-s…

ADAS域控软件架构-网络管理状态与唤醒机制

1. 状态介绍: Sleep Mode:总线睡眠模式,控制器不发送应用报文和网络管理报文。 Pre-Sleep Mode:准备总线睡眠模式,控制器不发送应用报文和网络管理报文。 Ready Sleep Mode:就绪睡眠模式,系统发送应用报文但是不发送网络管理报文。 Normal Operation mode:正常工作模式…

pytest简单使用和生成测试报告

目录 1. 基本使用 1--安装 2--pytest书写规则 3--为pycharm设置 以 pytest的方式运行 4--setup和teardown 5--setup_class和teardown 2. pytest生成测试报告 基本使用 安装 pytest文档地址 pytest documentation pip install pytest点击pycharm左边的控制台按钮 输入pip inst…

Spring Boot 第一天知识汇总

一、Spring Boot 是什么&#xff1f;简单说&#xff0c;Spring Boot 是简化 Spring 应用开发的框架 —— 它整合了整个 Spring 技术栈&#xff0c;提供了 “一站式” J2EE 开发解决方案。核心优点&#xff1a;快速创建独立运行的 Spring 项目&#xff0c;无需繁琐配置&#xff…

MySql主从部署

MySql主从部署 1、操作环境 硬件环境&#xff1a;香橙派5 aarch64架构 软件环境&#xff1a;Ubuntu 22.04.3 LTS 软件版本&#xff1a;mysql-8.0.42 操作方式&#xff1a;mysql_1,mysql_2容器 主节点&#xff1a;mysql_1 启动命令&#xff1a;docker run --name mysql_master \…