跳到主要内容

MyBatis 集成

DeepSeek V3 中英对照 MyBatis Integration

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计算用作前缀的类型的聚合根数量countgetDomainType: 要计数的聚合根的类型。