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

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.dtcms.com/a/294894.html

相关文章:

  • 设备维修记录可追溯:管理系统选型指南
  • ESP32-S3 小电视学习笔记2:Arduino开发环境搭建(垃圾)
  • PyTorch深度学习入门记录2
  • sql注入171到185
  • 使用Qemu模拟Arm处理器,运行Linux系统
  • 做了个震动APP
  • 学生信息管理系统 - HTML实现增删改查
  • odoo欧度小程序——添加用户
  • 面试150 合并K个升序链表
  • 智能制造基础-全面质量管理(TQM)
  • 嵌入式学习-土堆目标检测(4)-day28
  • iview表单验证一直提示为空的几个原因?
  • 1.C语言和其关键字的一个简单介绍
  • Spring事务注解详解:确保你的应用数据的一致性
  • 解决BAPI_ACC_DOCUMENT_POST 功能范围输入不生效问题
  • OpenAI o系列模型Responses接口开发Python代码示例
  • 【机器学习深度学习】生成式模型的评估与验证
  • linux驱动开发笔记--GPIO驱动开发
  • iTwin 几何属性获取
  • RAG实战指南 Day 22:混合检索策略实现
  • 认识linux进程内存布局以及与命令行参数和环境变量的关系
  • java 位运算转换 bit operator convert
  • WTL 桌面开发入门
  • Medical | 批次 批号 批准文号
  • 直接偏好优化(DPO):原理、演进与大模型对齐新范式
  • git查看两个commit之间有哪些Pull Request
  • 【盘古100Pro+开发板实验例程】FPGA学习 | Modelsim 的使用和 do 文件编写
  • 如何通过内网穿透,访问公司内部服务器?
  • 企业选择将服务器放在IDC机房托管的优势
  • Python 程序设计讲义(7):Python 的基本数据类型——整数类型