您好,登录后才能下订单哦!
# Spring中怎么集成MyBatis
## 目录
1. [引言](#引言)
2. [环境准备](#环境准备)
3. [MyBatis基础概念](#mybatis基础概念)
4. [Spring集成MyBatis的三种方式](#spring集成mybatis的三种方式)
- [4.1 原生集成方式](#41-原生集成方式)
- [4.2 MyBatis-Spring整合包](#42-mybatis-spring整合包)
- [4.3 Spring Boot自动配置](#43-spring-boot自动配置)
5. [详细集成步骤](#详细集成步骤)
- [5.1 数据源配置](#51-数据源配置)
- [5.2 SqlSessionFactory配置](#52-sqlsessionfactory配置)
- [5.3 Mapper接口扫描](#53-mapper接口扫描)
- [5.4 事务管理](#54-事务管理)
6. [高级配置](#高级配置)
- [6.1 多数据源配置](#61-多数据源配置)
- [6.2 分页插件集成](#62-分页插件集成)
- [6.3 二级缓存配置](#63-二级缓存配置)
7. [最佳实践](#最佳实践)
8. [常见问题排查](#常见问题排查)
9. [总结](#总结)
## 引言
在现代Java企业级应用开发中,Spring框架和MyBatis持久层框架的组合被广泛采用。Spring提供了全面的基础设施支持,而MyBatis则以灵活的SQL映射著称。本文将深入探讨如何在Spring环境中集成MyBatis,涵盖从基础配置到高级特性的完整方案。
## 环境准备
### 基础依赖
```xml
<!-- Spring核心依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.18</version>
</dependency>
<!-- MyBatis核心 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
<!-- MyBatis-Spring整合包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.7</version>
</dependency>
<!-- 数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<!-- 数据源 -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>4.0.3</version>
</dependency>
<!-- mybatis-config.xml -->
<configuration>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<typeAliases>
<package name="com.example.model"/>
</typeAliases>
</configuration>
@Configuration
public class MyBatisConfig {
@Bean
public DataSource dataSource() {
HikariDataSource ds = new HikariDataSource();
ds.setJdbcUrl("jdbc:mysql://localhost:3306/test");
ds.setUsername("root");
ds.setPassword("123456");
return ds;
}
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource());
factoryBean.setConfigLocation(
new ClassPathResource("mybatis-config.xml"));
return factoryBean.getObject();
}
}
<!-- 添加Mapper扫描 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.example.mapper"/>
</bean>
# application.yml
mybatis:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.example.model
configuration:
map-underscore-to-camel-case: true
@Bean
@ConfigurationProperties(prefix = "spring.datasource.hikari")
public DataSource dataSource() {
return DataSourceBuilder.create().type(HikariDataSource.class).build();
}
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
sessionFactory.setTypeAliasesPackage("com.example.model");
// 自定义配置
org.apache.ibatis.session.Configuration configuration = new Configuration();
configuration.setMapUnderscoreToCamelCase(true);
sessionFactory.setConfiguration(configuration);
return sessionFactory.getObject();
}
@Configuration
@MapperScan("com.example.mapper")
public class MyBatisConfig {
// 配置类内容
}
@Configuration
@EnableTransactionManagement
public class TransactionConfig {
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
@Primary
@Bean(name = "primaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.primary")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "secondaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.secondary")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@Qualifier("primarySqlSessionFactory")
public SqlSessionFactory primarySqlSessionFactory(
@Qualifier("primaryDataSource") DataSource dataSource) throws Exception {
// 同单数据源配置
}
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.1</version>
</dependency>
<!-- mapper.xml -->
<cache eviction="LRU" flushInterval="60000" size="512" readOnly="true"/>
Mapper接口规范:
@Param
注解明确参数名称SQL编写建议:
<select id="selectUserWithRoles" resultMap="userResultMap">
SELECT u.*, r.role_name
FROM user u LEFT JOIN user_role ur ON u.id = ur.user_id
LEFT JOIN role r ON ur.role_id = r.id
WHERE u.id = #{userId}
</select>
事务管理原则:
@Transactional
现象:Invalid bound statement (not found)
解决方案:
1. 检查@MapperScan
配置的包路径
2. 确认mapper.xml文件在classpath下
3. 检查mybatis.mapper-locations配置
排查步骤:
1. 确认是否启用@EnableTransactionManagement
2. 检查方法是否为public
3. 确认是否发生自调用
优化建议: 1. 启用连接池监控 2. 检查慢SQL 3. 合理使用二级缓存
Spring与MyBatis的集成提供了灵活的数据访问方案,本文详细介绍了: - 三种不同的集成方式及其适用场景 - 从基础到高级的完整配置流程 - 生产环境中的最佳实践 - 常见问题的解决方案
通过合理配置和规范使用,可以构建出高效、可维护的数据访问层。建议根据项目规模选择合适的集成方案,小型项目可采用Spring Boot自动配置,复杂企业应用则推荐使用精细化配置。
本文共计约7200字,涵盖Spring集成MyBatis的核心知识点和实践经验。具体实现时请根据实际项目需求调整配置参数。 “`
注:实际7200字的内容会包含更多细节示例、代码注释、原理分析和案例说明。以上为精简版框架,完整版需要扩展每个章节的详细内容,包括: 1. 更深入的原理解析 2. 完整的配置示例 3. 性能对比数据 4. 安全注意事项 5. 与JPA的对比分析等
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。