Spring Boot项目里MyBatis到底怎么配?从XML映射到缓存开启,一份完整的配置清单
Spring Boot与MyBatis深度整合实战指南1. 项目初始化与环境准备在开始Spring Boot与MyBatis的整合之前我们需要确保开发环境已经准备就绪。首先创建一个基础的Spring Boot项目推荐使用Spring Initializrhttps://start.spring.io/进行快速初始化。在选择依赖时务必勾选以下核心模块Spring Web用于构建Web应用的基础支持MyBatis FrameworkMyBatis的Spring Boot官方starterMySQL Driver或其他数据库驱动根据实际使用的数据库选择初始化完成后项目结构应该包含以下关键目录src/main/java └─com.example.demo ├─config # 自定义配置类 ├─controller # Web层 ├─service # 业务逻辑层 ├─mapper # 数据访问层接口 └─entity # 实体类 src/main/resources ├─static ├─templates └─application.yml # 主配置文件2. 基础配置详解2.1 数据源配置在application.yml中配置数据源是整合的第一步。Spring Boot提供了简洁的配置方式spring: datasource: url: jdbc:mysql://localhost:3306/demo_db?useSSLfalseserverTimezoneUTCcharacterEncodingUTF-8 username: root password: yourpassword driver-class-name: com.mysql.cj.jdbc.Driver hikari: maximum-pool-size: 15 minimum-idle: 5 connection-timeout: 30000提示生产环境中密码应该使用加密配置推荐使用Jasypt等工具进行敏感信息加密2.2 MyBatis基础配置在application.yml中添加MyBatis相关配置mybatis: mapper-locations: classpath:mapper/*.xml # XML映射文件位置 type-aliases-package: com.example.demo.entity # 实体类包路径 configuration: map-underscore-to-camel-case: true # 自动驼峰命名转换 default-fetch-size: 100 default-statement-timeout: 302.3 XML映射与接口绑定MyBatis的核心特性之一就是接口与XML的绑定。创建一个简单的用户查询示例首先定义实体类package com.example.demo.entity; public class User { private Long id; private String username; private String email; // getters and setters }创建Mapper接口package com.example.demo.mapper; import com.example.demo.entity.User; import org.apache.ibatis.annotations.Mapper; Mapper public interface UserMapper { User selectById(Long id); }编写对应的XML映射文件resources/mapper/UserMapper.xml?xml version1.0 encodingUTF-8? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.example.demo.mapper.UserMapper resultMap idBaseResultMap typeUser id columnid propertyid / result columnusername propertyusername / result columnemail propertyemail / /resultMap select idselectById resultMapBaseResultMap SELECT * FROM user WHERE id #{id} /select /mapper3. 高级特性配置3.1 缓存机制详解MyBatis提供了一级缓存和二级缓存机制合理使用可以显著提升性能。一级缓存默认开启作用域SqlSession级别特点同一个SqlSession中相同的查询会直接返回缓存结果失效条件执行增删改操作、调用clearCache()、关闭SqlSession二级缓存配置 在application.yml中开启二级缓存mybatis: configuration: cache-enabled: true在Mapper接口上添加注解CacheNamespace public interface UserMapper { // 方法定义 }或者在XML映射文件中配置mapper namespacecom.example.demo.mapper.UserMapper cache evictionLRU flushInterval60000 size512 readOnlytrue/ !-- 其他配置 -- /mapper3.2 动态SQL实践MyBatis强大的动态SQL能力可以让我们灵活构建查询条件。以下是几个常用场景条件查询示例select idselectUsers resultMapBaseResultMap SELECT * FROM user where if testusername ! null AND username LIKE CONCAT(%, #{username}, %) /if if testemail ! null AND email #{email} /if if teststatusList ! null and statusList.size() 0 AND status IN foreach collectionstatusList itemstatus open( separator, close) #{status} /foreach /if /where ORDER BY create_time DESC /select更新语句示例update idupdateSelective parameterTypeUser UPDATE user set if testusername ! nullusername #{username},/if if testemail ! nullemail #{email},/if /set WHERE id #{id} /update4. 性能优化与最佳实践4.1 分页查询实现MyBatis与Spring Boot整合时推荐使用PageHelper实现物理分页添加依赖dependency groupIdcom.github.pagehelper/groupId artifactIdpagehelper-spring-boot-starter/artifactId version最新版本/version /dependency在application.yml中配置pagehelper: helper-dialect: mysql reasonable: true support-methods-arguments: true使用示例public PageInfoUser getUsers(int pageNum, int pageSize) { PageHelper.startPage(pageNum, pageSize); ListUser users userMapper.selectAll(); return new PageInfo(users); }4.2 批量操作优化对于批量插入或更新操作MyBatis提供了高效的实现方式批量插入示例Insert(script INSERT INTO user (username, email) VALUES foreach collectionlist itemitem separator, (#{item.username}, #{item.email}) /foreach /script) void batchInsert(ListUser users);批量更新示例update idbatchUpdate foreach collectionlist itemitem separator; UPDATE user SET username #{item.username}, email #{item.email} WHERE id #{item.id} /foreach /update注意批量操作时需要考虑数据库对SQL语句长度的限制建议每批处理100-1000条数据4.3 复杂查询结果映射对于一对多、多对多等复杂关系MyBatis提供了强大的结果映射能力resultMap idUserWithOrdersMap typeUser extendsBaseResultMap collection propertyorders ofTypeOrder id columnorder_id propertyid/ result columnorder_no propertyorderNo/ result columnorder_amount propertyamount/ /collection /resultMap select idselectUserWithOrders resultMapUserWithOrdersMap SELECT u.*, o.id as order_id, o.order_no, o.amount as order_amount FROM user u LEFT JOIN orders o ON u.id o.user_id WHERE u.id #{id} /select5. 常见问题排查5.1 配置不生效问题当发现配置没有按预期生效时可以按照以下步骤排查检查配置文件的加载顺序和优先级确认没有在多个位置重复配置相互冲突的属性检查依赖版本是否兼容查看启动日志中的自动配置报告5.2 SQL注入防范虽然MyBatis的#{}语法已经可以防止大部分SQL注入但仍需注意永远不要使用${}拼接用户输入的参数对于like查询应该在Java代码中处理通配符而不是在SQL中定期检查Mapper中的SQL语句安全性5.3 事务管理Spring Boot中整合MyBatis的事务管理非常简单Service Transactional public class UserService { private final UserMapper userMapper; public UserService(UserMapper userMapper) { this.userMapper userMapper; } Transactional(rollbackFor Exception.class) public void updateUser(User user) { userMapper.update(user); // 其他数据库操作 } }关键点使用Transactional注解声明事务默认只对RuntimeException回滚可通过rollbackFor指定其他异常类型事务方法应该放在Service层而不是Controller层