MyBatis-Spring 使用教程:从入门到精通
【免费下载链接】spring Spring integration for MyBatis 3 项目地址: https://gitcode.com/gh_mirrors/sprin/spring
还在为 MyBatis 与 Spring 的集成而烦恼吗?本文将带你全面掌握 MyBatis-Spring 的使用技巧,从基础配置到高级特性,一文解决所有集成难题!
通过本文你将学到:
- ✅ MyBatis-Spring 的核心组件和工作原理
- ✅ XML 和 Java Config 两种配置方式
- ✅ 事务管理的完整解决方案
- ✅ 批量处理和 Spring Batch 集成
- ✅ 最佳实践和常见问题排查
1. MyBatis-Spring 简介
MyBatis-Spring 是 MyBatis 与 Spring Framework 的官方集成模块,它提供了无缝的整合方案,让你能够在 Spring 应用中轻松使用 MyBatis 的 SQL 映射功能。
1.1 核心优势
- 事务管理:自动参与 Spring 事务
- 依赖注入:支持 Spring 的依赖注入机制
- 异常转换:将 MyBatis 异常转换为 Spring DataAccessException
- 线程安全:SqlSessionTemplate 是线程安全的
- 简化配置:提供多种便捷的配置方式
1.2 版本兼容性
| MyBatis-Spring 版本 | Spring 版本 | Spring Batch 版本 |
|---|---|---|
| master | Spring 6 | Spring Batch 5 |
| 2.1.x | Spring 5 | Spring Batch 4 |
2. 快速开始
2.1 添加依赖
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>3.0.3</version>
</dependency>
2.2 基础配置
XML 配置方式
<!-- 配置数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!-- 配置 SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath*:mapper/**/*.xml"/>
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<constructor-arg ref="dataSource"/>
</bean>
Java Config 方式
@Configuration
@EnableTransactionManagement
public class MyBatisConfig {
@Bean
public DataSource dataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName(env.getProperty("jdbc.driver"));
dataSource.setUrl(env.getProperty("jdbc.url"));
dataSource.setUsername(env.getProperty("jdbc.username"));
dataSource.setPassword(env.getProperty("jdbc.password"));
return dataSource;
}
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource());
factoryBean.setMapperLocations(
new PathMatchingResourcePatternResolver()
.getResources("classpath*:mapper/**/*.xml"));
return factoryBean.getObject();
}
@Bean
public PlatformTransactionManager transactionManager() {
return new DataSourceTransactionManager(dataSource());
}
}
3. 核心组件详解
3.1 SqlSessionFactoryBean
SqlSessionFactoryBean 是创建 SqlSessionFactory 的工厂类,负责初始化 MyBatis 的核心配置。
3.2 SqlSessionTemplate
SqlSessionTemplate 是 MyBatis-Spring 的核心,它包装了原生的 SqlSession,提供了线程安全和事务管理能力。
public class UserServiceImpl implements UserService {
private final SqlSessionTemplate sqlSession;
public UserServiceImpl(SqlSessionTemplate sqlSession) {
this.sqlSession = sqlSession;
}
public User getUserById(String userId) {
return sqlSession.selectOne(
"com.example.mapper.UserMapper.selectById", userId);
}
public void insertUser(User user) {
sqlSession.insert("com.example.mapper.UserMapper.insert", user);
}
}
3.3 MapperFactoryBean
用于创建 Mapper 接口的代理实例,简化数据访问层的开发。
<bean id="userMapper"
class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface"
value="com.example.mapper.UserMapper"/>
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
4. Mapper 扫描与注册
4.1 XML 配置方式
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mybatis="http://mybatis.org/schema/mybatis-spring"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://mybatis.org/schema/mybatis-spring
http://mybatis.org/schema/mybatis-spring.xsd">
<mybatis:scan base-package="com.example.mapper"/>
</beans>
4.2 注解配置方式
@Configuration
@MapperScan("com.example.mapper")
public class AppConfig {
// 配置类内容
}
4.3 MapperScannerConfigurer
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.example.mapper"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
5. 事务管理
5.1 声明式事务
@Service
@Transactional
public class UserServiceImpl implements UserService {
private final UserMapper userMapper;
public UserServiceImpl(UserMapper userMapper) {
this.userMapper = userMapper;
}
@Transactional(rollbackFor = Exception.class)
public void createUser(User user) {
userMapper.insert(user);
// 其他业务逻辑
}
}
5.2 编程式事务
@Service
public class UserService {
private final PlatformTransactionManager transactionManager;
private final UserMapper userMapper;
public UserService(PlatformTransactionManager transactionManager,
UserMapper userMapper) {
this.transactionManager = transactionManager;
this.userMapper = userMapper;
}
public void createUserWithTransaction(User user) {
TransactionTemplate transactionTemplate =
new TransactionTemplate(transactionManager);
transactionTemplate.execute(status -> {
userMapper.insert(user);
// 其他数据库操作
return null;
});
}
}
6. 批量处理
6.1 批量 SqlSession
@Bean
public SqlSessionTemplate batchSqlSession() throws Exception {
return new SqlSessionTemplate(
sqlSessionFactory(), ExecutorType.BATCH);
}
@Service
public class BatchUserService {
private final SqlSessionTemplate batchSqlSession;
public BatchUserService(@Qualifier("batchSqlSession")
SqlSessionTemplate batchSqlSession) {
this.batchSqlSession = batchSqlSession;
}
public void batchInsertUsers(List<User> users) {
for (User user : users) {
batchSqlSession.insert(
"com.example.mapper.UserMapper.insert", user);
}
batchSqlSession.flushStatements();
}
}
6.2 Spring Batch 集成
@Configuration
public class BatchConfig {
@Bean
public MyBatisPagingItemReader<User> userReader() {
return new MyBatisPagingItemReaderBuilder<User>()
.sqlSessionFactory(sqlSessionFactory())
.queryId("com.example.mapper.UserMapper.selectAll")
.pageSize(1000)
.build();
}
@Bean
public MyBatisBatchItemWriter<User> userWriter() {
return new MyBatisBatchItemWriterBuilder<User>()
.sqlSessionFactory(sqlSessionFactory())
.statementId("com.example.mapper.UserMapper.insert")
.build();
}
}
7. 高级特性
7.1 多数据源配置
@Configuration
public class MultipleDataSourceConfig {
@Primary
@Bean
@ConfigurationProperties("spring.datasource.primary")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties("spring.datasource.secondary")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
@Primary
@Bean
public SqlSessionFactory primarySqlSessionFactory() throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(primaryDataSource());
return factoryBean.getObject();
}
@Bean
public SqlSessionFactory secondarySqlSessionFactory() throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(secondaryDataSource());
return factoryBean.getObject();
}
}
7.2 自定义类型处理器
@MappedTypes(LocalDateTime.class)
@MappedJdbcTypes(JdbcType.TIMESTAMP)
public class LocalDateTimeTypeHandler
extends BaseTypeHandler<LocalDateTime> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i,
LocalDateTime parameter, JdbcType jdbcType)
throws SQLException {
ps.setTimestamp(i, Timestamp.valueOf(parameter));
}
@Override
public LocalDateTime getNullableResult(ResultSet rs, String columnName)
throws SQLException {
Timestamp timestamp = rs.getTimestamp(columnName);
return timestamp != null ? timestamp.toLocalDateTime() : null;
}
}
8. 最佳实践
8.1 配置优化建议
mybatis:
configuration:
map-underscore-to-camel-case: true
lazy-loading-enabled: true
aggressive-lazy-loading: false
multiple-result-sets-enabled: true
use-column-label: true
use-generated-keys: true
default-executor-type: REUSE
default-fetch-size: 100
8.2 性能调优
| 配置项 | 推荐值 | 说明 |
|---|---|---|
| default-executor-type | REUSE | 重用预编译语句 |
| default-fetch-size | 100-1000 | 批量获取大小 |
| local-cache-scope | STATEMENT | 避免缓存污染 |
| lazy-loading-enabled | true | 启用延迟加载 |
8.3 常见问题排查
问题1:事务不生效
- 检查是否添加了
@EnableTransactionManagement - 确认方法是否为 public
- 检查异常类型是否匹配 rollbackFor
问题2:Mapper 扫描失败
- 确认 base-package 路径正确
- 检查 Mapper 接口是否有
@Mapper注解
问题3:批量插入性能差
- 使用
ExecutorType.BATCH - 合理设置 batchSize
- 定期调用
flushStatements()
9. 完整示例
9.1 用户管理模块
public interface UserMapper {
@Select("SELECT * FROM users WHERE id = #{id}")
User selectById(Long id);
@Insert("INSERT INTO users(name, email) VALUES(#{name}, #{email})")
@Options(useGeneratedKeys = true, keyProperty = "id")
int insert(User user);
@Update("UPDATE users SET name=#{name}, email=#{email} WHERE id=#{id}")
int update(User user);
@Delete("DELETE FROM users WHERE id=#{id}")
int delete(Long id);
}
@Service
@Transactional
public class UserService {
private final UserMapper userMapper;
public UserService(UserMapper userMapper) {
this.userMapper = userMapper;
}
public User getUserById(Long id) {
return userMapper.selectById(id);
}
public Long createUser(User user) {
userMapper.insert(user);
return user.getId();
}
public void updateUser(User user) {
userMapper.update(user);
}
public void deleteUser(Long id) {
userMapper.delete(id);
}
}
总结
MyBatis-Spring 提供了强大而灵活的集成方案,通过本文的学习,你应该能够:
- 掌握核心配置:理解 SqlSessionFactoryBean、SqlSessionTemplate 等核心组件
- 熟练使用事务:掌握声明式和编程式事务管理
- 优化性能:学会批量处理和性能调优技巧
- 解决常见问题:能够排查和解决集成中的常见问题
在实际项目中,建议根据具体需求选择合适的配置方式,并遵循最佳实践来保证应用的性能和稳定性。
下一步学习建议:
- 深入学习 MyBatis 的动态 SQL
- 了解 MyBatis 的缓存机制
- 探索 MyBatis 的插件开发
- 学习 Spring Boot 与 MyBatis 的自动配置
希望本文能帮助你更好地使用 MyBatis-Spring,提升开发效率和应用性能!
【免费下载链接】spring Spring integration for MyBatis 3 项目地址: https://gitcode.com/gh_mirrors/sprin/spring
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



