MyBatis 集成

CRUD 操作和查询方法可以委托给 MyBatis。本节描述如何配置 Spring Data JDBC 以与 MyBatis 集成,以及遵循哪些约定来将查询的运行以及映射交给该库。

配置

将 MyBatis 正确地插入 Spring Data JDBC 的最简单方法是将 `MyBatisJdbcConfiguration` 导入到您的应用程序配置中。

@Configuration
@EnableJdbcRepositories
@Import(MyBatisJdbcConfiguration.class)
class Application {

  @Bean
  SqlSessionFactoryBean sqlSessionFactoryBean() {
    // Configure MyBatis here
  }
}

如您所见,您只需要声明一个 `SqlSessionFactoryBean`,因为 `MyBatisJdbcConfiguration` 最终依赖于 `ApplicationContext` 中可用的 `SqlSession` bean。

使用约定

对于 `CrudRepository` 中的每个操作,Spring Data JDBC 都会运行多个语句。如果应用程序上下文中存在 `SqlSessionFactory`,Spring Data 会针对每个步骤检查 `SessionFactory` 是否提供语句。如果找到一个,则使用该语句(包括其配置的实体映射)。

语句的名称是通过将实体类型的完全限定名称与 `Mapper.` 和确定语句类型的 `String` 连接起来构建的。例如,如果要插入 `org.example.User` 的实例,Spring Data JDBC 将查找名为 `org.example.UserMapper.insert` 的语句。

运行语句时,会将 [ `MyBatisContext` ] 的实例作为参数传递,这使得语句可以使用各种参数。

下表描述了可用的 MyBatis 语句

名称 用途 可能触发此语句的 CrudRepository 方法 在 `MyBatisContext` 中可用的属性

insert

插入单个实体。这也适用于聚合根引用的实体。

`save`、`saveAll`。

`getInstance`:要保存的实例

`getDomainType`:要保存的实体类型。

`get(<key>)`:引用实体的 ID,其中 `<key>` 是 `NamingStrategy` 提供的反向引用列的名称。

update

更新单个实体。这也适用于聚合根引用的实体。

`save`、`saveAll`。

`getInstance`:要保存的实例

`getDomainType`:要保存的实体类型。

delete

删除单个实体。

`delete`、`deleteById`。

`getId`:要删除的实例的 ID

`getDomainType`:要删除的实体类型。

deleteAll-<propertyPath>

删除所有被用作前缀的类型的任何聚合根引用的实体。请注意,用于作为语句名称前缀的类型是聚合根的名称,而不是要删除的实体的名称。

deleteAll.

`getDomainType`:要删除的实体的类型。

deleteAll

删除所有用作前缀的类型的聚合根

deleteAll.

`getDomainType`:要删除的实体的类型。

delete-<propertyPath>

删除所有由具有给定 propertyPath 的聚合根引用的实体

deleteById.

`getId`:要删除其引用实体的聚合根的 ID。

`getDomainType`:要删除的实体的类型。

findById

按 ID 选择聚合根

findById.

`getId`:要加载的实体的 ID。

`getDomainType`:要加载的实体的类型。

findAll

选择所有聚合根

findAll.

`getDomainType`:要加载的实体的类型。

findAllById

按 ID 值选择一组聚合根

findAllById.

`getId`:要加载的实体的 ID 值列表。

`getDomainType`:要加载的实体的类型。

findAllByProperty-<propertyName>

选择由另一个实体引用的实体集。引用实体的类型用于前缀。引用的实体类型用作后缀。*此方法已弃用。请改用 `findAllByPath`*

所有 `find*` 方法。如果没有为 `findAllByPath` 定义查询

`getId`:引用要加载的实体的实体的 ID。

`getDomainType`:要加载的实体的类型。

findAllByPath-<propertyPath>

选择通过属性路径由另一个实体引用的实体集。

所有 `find*` 方法。

`getIdentifier`:包含聚合根的 id 以及所有路径元素的键和列表索引的 `Identifier`。

`getDomainType`:要加载的实体的类型。

findAllSorted

选择所有已排序的聚合根

findAll(Sort).

`getSort`:排序规范。

findAllPaged

选择一页聚合根,可选排序

findAll(Page).

`getPageable`:分页规范。

count

计算用作前缀的类型的聚合根的数量

count

`getDomainType`:要计数的聚合根的类型。