MyBatis N_SpringBoot

with springboot 整合

mybatis-spring-boot-starter

mybatis-spring-boot-starter 这个在mybits官页文档中: http://www.mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/

实例

引入

for Maven

<dependency>  
	<groupId>org.mybatis.spring.boot</groupId>  
	<artifactId>mybatis-spring-boot-starter</artifactId>  
	<version>${mybatis.start.version}</version>  
</dependency>

for Gradle

dependencies {
  implementation("org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.2")
}

MyBatis-Spring-Boot-Starter 将会:

  • 自动探测存在的 DataSource
  • 将使用 SqlSessionFactoryBean 创建并注册一个 SqlSessionFactory 的实例,并将探测到的 DataSource 作为数据源
  • 将创建并注册一个从 SqlSessionFactory 中得到的 SqlSessionTemplate 的实例
  • 自动扫描你的 mapper (org.apache.ibatis.annotations.Mapper 注解的对象),将它们与 SqlSessionTemplate 相关联,并将它们注册到Spring 的环境(context)中去,这样它们就可以被注入到你的 bean 中

MyBatis-Spring-Boot-Starter 将默认搜寻带有 @Mapper 注解的 mapper 接口, 你可能想指定一个自定义的注解或接口来扫描,如果那样的话,你就必须使用 @MapperScan 注解了; 参考笔记 MyBatis > 扫描 “Mapper” 的方式

配置 “Mapper” 扫描

MyBatis-Spring-Boot-Starter 将默认搜寻带有 @Mapper 注解的 mapper 接口 指定一个自定义的注解或接口来扫描,使用 @MapperScan 注解

@Configuration
@MapperScan("org.yang.mybits.mapper")
public class ...

参考: MyBatis > 扫描 “Mapper” 的方式

使用 SqlSession

一个 SqlSessionTemplate 的实例被创建并添加到 Spring 的环境中,因此你可以使用 MyBatis API,让它像下面一样被注入到你的 bean 中(Spring 4.3 以上可用)。

@Component
public class CityDao {
 
  private final SqlSession sqlSession;
 
  public CityDao(SqlSession sqlSession) {
    this.sqlSession = sqlSession;
  }
 
  public City selectCityById(long id) {
    return this.sqlSession.selectOne("selectCityById", id);
  }
 
}

事务管理 SqlSessionTemplate

SqlSessionTemplate是MyBatis-Spring模块提供的类,用于在Spring应用程序中简化SqlSession的管理。它提供了一种将MyBatis与Spring的事务管理机制集成的方式,以便更轻松地进行数据库操作。以下是SqlSessionTemplate的工作原理:

  1. SqlSessionFactory配置:在Spring的配置文件中,您需要配置SqlSessionFactory,这是MyBatis的关键组件,负责创建SqlSession实例。SqlSessionTemplate需要引用这个SqlSessionFactory

  2. SqlSessionTemplate配置:您配置SqlSessionTemplate bean,将SqlSessionFactory注入其中,如下所示:

    <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg ref="sqlSessionFactory" />
    </bean>
  3. 使用SqlSessionTemplate:在您的服务类或DAO类中,您可以注入或通过Spring上下文获取SqlSessionTemplate bean。然后,您可以使用它来执行数据库操作,而无需显式创建和关闭SqlSession

    @Autowired
    private SqlSessionTemplate sqlSessionTemplate;
     
    public void doDatabaseOperation() {
        // 使用SqlSessionTemplate执行数据库操作
        sqlSessionTemplate.insert("insertData", data);
        sqlSessionTemplate.update("updateData", data);
        sqlSessionTemplate.delete("deleteData", data);
        sqlSessionTemplate.selectOne("getData", id);
    }
  4. 事务管理:如果您的方法需要事务支持,您可以使用Spring的事务管理机制,例如@Transactional注解,来管理事务。SqlSessionTemplate可以与Spring的事务管理机制无缝集成,以确保在事务中执行数据库操作。

  5. 异常处理SqlSessionTemplate负责处理底层SqlSession的打开和关闭,还会处理潜在的异常情况。如果出现异常,它将确保底层SqlSession被关闭,从而避免资源泄漏。

总之,SqlSessionTemplate的原理是通过注入SqlSessionFactory,它允许在Spring应用程序中简化SqlSession的创建和管理,同时与Spring的事务管理机制进行集成。这使得MyBatis在Spring应用程序中更易于使用,同时确保了数据库操作的事务性和资源管理。

自定义配置

配置 (ConfigurationCustomizer)

MyBatis-Spring-Boot-Starter 将自动寻找实现了 ConfigurationCustomizer 接口的组件,调用自定义 MyBatis 配置的方法。( 1.2.1 及以上的版本可用)

例如:

@Configuration
public class MyBatisConfig {
  @Bean
  ConfigurationCustomizer mybatisConfigurationCustomizer() {
    return new ConfigurationCustomizer() {
      @Override
      public void customize(Configuration configuration) {
        // customize ...
      }
    };
  }
}

SqlSessionFactory (SqlSessionFactoryBeanCustomizer)

MyBatis-Spring-Boot-Starter 将自动寻找实现了 SqlSessionFactoryBeanCustomizer 接口的组件,调用自定义 SqlSessionFactoryBean 的方法。( 2.2.2 及以上的版本可用)

For example:

@Configuration
public class MyBatisConfig {
  @Bean
  SqlSessionFactoryBeanCustomizer sqlSessionFactoryBeanCustomizer() {
    return new SqlSessionFactoryBeanCustomizer() {
      @Override
      public void customize(SqlSessionFactoryBean factoryBean) {
        // customize ...
      }
    };
  }
}

配置 MyBatis 的其他组件

The MyBatis-Spring-Boot-Starter 将检测实现以下由 MyBatis 提供的接口的组件。

@Configuration
public class MyBatisConfig {
  @Bean
  MyInterceptor myInterceptor() {
    return MyInterceptor();
  }
  @Bean
  MyTypeHandler myTypeHandler() {
    return MyTypeHandler();
  }
  @Bean
  MyLanguageDriver myLanguageDriver() {
    return MyLanguageDriver();
  }
  @Bean
  VendorDatabaseIdProvider databaseIdProvider() {
    VendorDatabaseIdProvider databaseIdProvider = new VendorDatabaseIdProvider();
    Properties properties = new Properties();
    properties.put("SQL Server", "sqlserver");
    properties.put("DB2", "db2");
    properties.put("H2", "h2");
    databaseIdProvider.setProperties(properties);
    return databaseIdProvider;
  }  
}

MyBits 在 application.yml 可配置项

配置项(properties)描述
config-locationMyBatis XML 配置文件的路径。
check-config-location指定是否对 MyBatis XML 配置文件的存在进行检查。
mapper-locationsXML 映射文件的路径。
type-aliases-package搜索类型别名的包名。(包使用的分隔符是 “,; \t\n”)
type-aliases-super-type用于过滤类型别名的父类。如果没有指定,MyBatis会将所有从 type-aliases-package 搜索到的类作为类型别名处理。
type-handlers-package搜索类型处理器的包名。(包使用的分隔符是 “,; \t\n”)
executor-typeSQL 执行器类型: SIMPLEREUSEBATCH
default-scripting-language-driver默认的脚本语言驱动(模板引擎),此功能需要与 mybatis-spring 2.0.2 以上版本一起使用。
configuration-properties可在外部配置的 MyBatis 配置项。指定的配置项可以被用作 MyBatis 配置文件和 Mapper 文件的占位符。更多细节 见 MyBatis 参考页面
lazy-initialization是否启用 mapper bean 的延迟初始化。设置 true 以启用延迟初始化。此功能需要与 mybatis-spring 2.0.2 以上版本一起使用。
mapper-default-scope通过自动配置扫描的 mapper 组件的默认作用域。该功能需要与 mybatis-spring 2.0.6 以上版本一起使用。
inject-sql-session-on-mapper-scan设置是否注入 SqlSessionTemplate 或  SqlSessionFactory 组件 (如果你想回到 2.2.1 或之前的行为,请指定 false )。如果你和 spring-native 一起使用,应该设置为 true (默认)。
configuration.*MyBatis Core 提供的Configuration 组件的配置项。有关可用的内部配置项,请参阅MyBatis 参考页面。注:此属性不能与 config-location 同时使用。
scripting-language-driver.thymeleaf.*MyBatis ThymeleafLanguageDriverConfig 组件的 properties keys。有关可用的内部配置项,请参阅 MyBatis Thymeleaf 参考页面
scripting-language-driver.freemarker.*MyBatis FreemarkerLanguageDriverConfig 组件的 properties keys。有关可用的内部配置项,请参阅 MyBatis FreeMarker 参考页面。这个特性需要与 mybatis-freemarker 1.2.0 以上版本一起使用。
scripting-language-driver.velocity.*MyBatis VelocityLanguageDriverConfig 组件的  properties keys。有关可用的内部属性,请参阅 MyBatis Velocity 参考页面。这个特性需要与 mybatis-velocity 2.1.0 以上版本一起使用。

官方示例

分类样例描述
核心组件样例1展示了最简单的场景,只有一个 mapper 和一个注入 mapper 的组件。这就是我们在“快速入门”部分看到的例子。
样例2展示了如何在 XML 文件中使用一个带有语句的 Mapper,并且也有使用 SqlSessionTemplate 的 DAO 的示例。
LangaugeDriver样例3展示了如何在 mybatis-thymeleaf 的帮助下,使用 Thymeleaf。
样例4展示了如何在 mybatis-freemarker 的帮助下,使用 Freemarker。
样例5展示了如何在 mybatis-velocity 的帮助下,使用 Velocity。
JVM 语言样例6展示了如何和 kotlin 一同使用。
样例7展示了如何和 groovy 一同使用。
Web样例8展示了如何在 web 环境中使用。
样例9展示了如何在 web 环境中使用并且让 war 文件部署在应用程序服务器上。