《Spring实战》学习笔记-------Spring-Data-JPA

文章目录

    • Spring Data JPA个人理解
    • Spring Data实现自动化JPA Repository
    • 定义查询方法
    • 自定义查询
    • 混合自定义的功能

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="其它字符")

你可能感兴趣的:(Spring)