Spring Data JPA个人理解
PA是一种持久化层框架的规范,定义了接口,它并不实现对数据库的操作,而是其它的框架(例如Hibernate)实现它的接口,进而客户端可以通过对JPA的操作间接使用框架,Spring Data JPA是进一步包装了JPA,方便在不同的ORM框架中切换。
Spring Data实现自动化JPA Repository
在repository接口上继承 JpaRepository类,例如对数据库表Spittle的操作,主码类型为Long。
public interface SpittleRepository extends JpaRepository<Spittle, Long>{
//不用添加实现类,JPA会自动生成Impl,包括基础的CURD
}
Java类配置方法:
@Configuration
@EnableJpaRepositories(basepackage="xxx") //会扫描包来查找扩展自JpaRepository接口的接口,自动生成这个接口的实现
public class JpaConfiguration{
...
}
定义查询方法
例如我们需要新增一项查询通过用户名来查询用户:
public interface SpittleRepository extends JpaRepository<Spittle, Long>{
Spittle findByUsername(String username); //同样,Jpa也会自动生成它的实现
}
Repository的方法名只要符合JPA的命名规范,就可以自动生成。
Repository方法由一个动词、一个可选主题、关键词By、一个断言所组成。
在findByUsername中,动词是find,断言是Username,主题没有指定,因为返回类型是Spittle所以暗含主题也是Spittle。
例如:readSpittleByFirstnameOrLastnameOrderByLastname(),动词是read,主题是Spittle,其余是断言。
Spring Data允许四种动词:get、read、find、count。动词count会返回匹配对象的数量而不是对象本身。
注意:
- 主题名称可以省略,如果主题是以Distinct开头,那么结果集中不包含重复记录。
- 参数顺序要和方法名称中的顺序一致,名称无所谓
自定义查询
如果不能编写出符合规范的JPA方法名,可以通过使用@Query注解来声明sql语句:
@Query("select s from spittle s where s.email like '%gmail.com'")
List<Spittle> findAllGmailSpitles();
局限是@Query仅限于单个JPA的查询。
混合自定义的功能
如果@Query还不能满足需要,那就需要我们自己来编写SpittleRepositoryImpl类了。
当Spring Data JPA 为Repository接口生成实现的时候,它还会查找名字与接口相同、并且添加了Impl后缀的类。如果这个类存在,Spring Data JPA将会把它的方法与Spring Data JPA所生成的方法合并在一起。
例如:新添加一个eliteSweep()方法
public class SpittleRepositoryImpl{ //注意这个类不用实现SpittleRepository接口
@PersistenceContext
private EntityManager em;
public int eliteSweep(){
String updateSql = "****这里写SQL语句*******";
return em.createQuery(updateSql).executeUpdate();
}
}
除此之外,还需要确保eliteSweep()方法被声明在SpittleRepository接口中:
public interface SpittleRepository extends JpaRepository<Spittle, Long>{
...其它方法
int eliteSweep();
}
Impl是默认的后缀,如果想修改成其它字符,可以通过@EnableJpaRepositories实现:
@EnableJpaRepositories(basePackages="xxx", repositoryImplementationPostfix="其它字符")