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:要统计的聚合根的类型。 |