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 : 要删除的实例的 IDgetDomainType : 要删除的实体的类型。 |
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 : 要计数的聚合根的类型。 |