以下是一份系統化的 ?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. ?二級緩存?
- ?啟用步驟?:
- 全局配置開啟緩存:
mybatis:configuration:cache-enabled: true
- 在 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
和事務管理器。
?參考資料?
- MyBatis 二級緩存與事務整合
- Spring Boot 多數據源實戰
完整代碼示例可參考 。