一 什么是Spring Data JPA
先介绍一下Hibernate。Hibernate是数据访问解决技术的绝对霸主,使用O/R映射(对象关系映射)技术实现数据访问,O/R映射即将领域模型类和数据库的表进行映射,程序通过操作对象而实现表数据操作的能力,让数据访问操作无须关注数据库相关技术。
随着Hibernate的盛行,Hibernate主导了EJB(Enterprise Java Bean)3.0 的JPA(Jave Persistence API)规范。JPA是一个基于O/R映射的标准规范。所谓规范即只定义了标准规则(如注解、接口),不提供实现,软件提供商可以按照标准规范来实现,而使用者只需按照规范中定义的方式来使用,而不和软件提供商的实现打交道。JPA的主要实现有Hibernate、EclipseLink和OpenJPA等,这也意味着我们只要使用JPA来开发,无论是哪一个开发方式都是一样的。
Spring Data JPA是Spring Data的一个子项目,它通过提供基于JPA的Repsitory极大地减少了JPA作为数据访问方案的代码量。
二 定义数据访问层
使用Spring Data JPA建立数据访问层十分简单,只需定义一个继承JpaRepository的接口即可,样例定义如下:
public interface PersonRepository extends JpaRepository{
Long countByAge(Integer age);
Long deleteByName(String name);
List findByName(String name);
List findByNameAndAddress(String name,String address);
}
继承了JpaRepository接口意味着默认已经有了下面的数据访问操作方法:
@NoRepositoryBean
public interface JpaRepository extends PagingAndSortingRepository {
List findAll();
List findAll(Sort sort);
List findAll(Iterable ids);
List save(Iterable entities);
void flush();
S saveAndFlush(S entity);
void deleteInBatch(Iterable entities);
void deleteAllInBatch();
T getOne(ID id);
}
三 配置使用Spring Data JPA
在Spring环境下,使用Spring Data JPA可以通过@EnableJpaRepositories注解来开启Spring Data JPA的支持。
先看看@EnableJpaRepositories的定义
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(JpaRepositoriesRegistrar.class)
public @interface EnableJpaRepositories {
String[] value() default {}; //用来扫描数据访问层所在包下的数据访问的接口定义
String[] basePackages() default {};
Class>[] basePackageClasses() default {};
Filter[] includeFilters() default {};
Filter[] excludeFilters() default {};
String repositoryImplementationPostfix() default "Impl";
String namedQueriesLocation() default "";
Key queryLookupStrategy() default Key.CREATE_IF_NOT_FOUND;
Class> repositoryFactoryBeanClass() default JpaRepositoryFactoryBean.class; //指定Repository的工厂类
Class> repositoryBaseClass() default DefaultRepositoryBaseClass.class;
String entityManagerFactoryRef() default "entityManagerFactory";
String transactionManagerRef() default "transactionManager";
boolean considerNestedRepositories() default false;
boolean enableDefaultTransactions() default true;
}
参考https://blog.csdn.net/tengxvincent/article/details/79259828
使用样例1:
@SpringBootApplication
@EnableJpaRepositories(repositoryFactoryBeanClass = CustomRepositoryFactoryBean.class)
public class Ch82Application {
@Autowired
PersonRepository personRepository;
public static void main(String[] args) {
SpringApplication.run(Ch82Application.class, args);
}
}
使用样例2:
@Configuration
@EnableJpaRepositories("com.wisely.repos")
public class JpaConfiguration {
@Bean
public EntityManagerFactory entityManagerFactory() {
//......
}
}