MyBatis-Spring 使用教程:从入门到精通

MyBatis-Spring 使用教程:从入门到精通

【免费下载链接】spring Spring integration for MyBatis 3 【免费下载链接】spring 项目地址: 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 版本
masterSpring 6Spring Batch 5
2.1.xSpring 5Spring 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 的核心配置。

mermaid

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-typeREUSE重用预编译语句
default-fetch-size100-1000批量获取大小
local-cache-scopeSTATEMENT避免缓存污染
lazy-loading-enabledtrue启用延迟加载

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 提供了强大而灵活的集成方案,通过本文的学习,你应该能够:

  1. 掌握核心配置:理解 SqlSessionFactoryBean、SqlSessionTemplate 等核心组件
  2. 熟练使用事务:掌握声明式和编程式事务管理
  3. 优化性能:学会批量处理和性能调优技巧
  4. 解决常见问题:能够排查和解决集成中的常见问题

在实际项目中,建议根据具体需求选择合适的配置方式,并遵循最佳实践来保证应用的性能和稳定性。

下一步学习建议

  • 深入学习 MyBatis 的动态 SQL
  • 了解 MyBatis 的缓存机制
  • 探索 MyBatis 的插件开发
  • 学习 Spring Boot 与 MyBatis 的自动配置

希望本文能帮助你更好地使用 MyBatis-Spring,提升开发效率和应用性能!

【免费下载链接】spring Spring integration for MyBatis 3 【免费下载链接】spring 项目地址: https://gitcode.com/gh_mirrors/sprin/spring

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值