About Spring Data JPA

About Spring Data JPA

1.Spring Data JPA

​ Spring Data JPA是Spring Data这一个大家族中的一部分,它使得实现基于JPA的存储(repository)变得更加容易。Spring Data JPA这个模块,增强支持了基于JPA的数据库访问层。Spring Data JPA构建的Spring-powered的驱动应用程序,使得数据访问变得更加简单。

2.Spring Data JPA基本功能

​ 实现应用程序的数据访问层,一直都是很麻烦的问题。为了执行简单的查询、分页和审计,需要编写太多冗余的模版代码。Spring Data JPA的出现,就是通过减少实际工作中的工作量来显著改进了数据访问层的实现。作为开发人员,编写repository接口,包括自定义的方法,Spring都自动提供了实现。

Features

  • Sophisticated support to build repositories based on Spring and JPA

  • 支持基于Spring和JPA构建数据库

  • Support for Querydsl predicates and thus type-safe JPA queries

  • 支持查询谓词,以及类安全的JPA查询

  • Transparent auditing of domain class

  • 域类的透明审计

  • Pagination support, dynamic query execution, ability to integrate custom data access code

  • 支持分页、动态查询,可以继承自定义数据库访问

  • Validation of @Query annotated queries at bootstrap time

  • 支持验证@Query的注释查询

  • Support for XML based entity mapping

  • 支持基于XML的实体映射

  • JavaConfig based repository configuration by introducing @EnableJpaRepositories.

  • 通过引入@EnableJpaRepositories,基于JavaConfig的repository的配置

3.核心接口

Repository接口 :

1
2
3
public interface Repository<T,ID extends Serializable>{

}

在这个接口中,定义了所有repository的类型。需要传入两个参数,一个是实体(采用泛型T),另一个则是实体中的ID的数据类型(Integer/String/…)

最近,在项目中,使用到的是JpaRepository。这里先讲讲JpaRepository

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public interface JpaRepository<T,ID extends Serializable> extends PagingAndSortingRepository<T,ID>{
List<T> findAll();

List<T> findAll(Sort sort);

<S extends T> List<S> save(Iterable<S> entities);

void flush();

T saveAndFlush(T entity);

void deleteInBatch(Iterable<T> entities);

void deleteAllInBatch();
}

其实,从方法名上基本都可以理解它们的功能和操作,只需调用即可。也可以进行重写和实现。传入需要的参数或者需要的返回值类型,见仁见智,根据实际情况编写不同的功能。

举个例子来说:

对于实体(Student)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@Entity
@Data
@Table(name = "t_student")
@DynamicUpdate
public class Student{
@Id
@Column(name = "id")
private String id;
@Column(name = "name")
private String name;
@Column(name = "username")
private String username;
@Column(name = "password")
private String password;
@Column(name = "gender")
private Integer gender;
@Column(name = "birth")
private Date birth;
...
/*
* 驼峰命名法
* @Column(name = "create_time")
* private String createTime;
*/
}

这里简单的举了一个例子,是学生的实体类,有一个基本的变量。为什么会有@Entity,@Data…诸如此类的注解?这是从hibernate就有的注解,主要的功能是为了将映射变得更加的容易。

下一篇就@Annotation的知识补充上

我们再把Student实体数据访问层的Repository补上

1
2
3
4
5
6
7
8
9
10
@Repository
public interface StudentRepository extends JpaRepository<Student, String>{
// 这里的两个参数 填写对应的实体类和实体ID字段的数据类型

// 举例说明 通过性别查找所有的男同学和女同学
List<Student> findAllStudentsByGender(Integer gender);

// 通过Pageable达到分页的查询效果
Page<Student> findAllStudentsByGender(Integer gender,Pageable pageable);
}

完成了数据访问层(Repository)之后,就可以编写Service和ServiceImpl的实现了。在Impl中只需将Repository注入(@AutoWired)即可完成对应的功能。

简单来说

​ JpaRepository简化了在SSM框架中,所需要的映射文件的配置:

​ 例如:spring-dao.xml,mapper/StudentDao.xml

SQL语句的编写:

​ 例如:

1
2
3
4
5
6
7
<mapper namespace="cn.inc.dao.StudentDao">
<select id="queryStudent" resultType="cn.inc.entity.Student">
SELECT *
FROM inc.t_student
ORDER BY id DESC
</select>
</mapper>

虽然说JpaRepository简化了很多在SSM框架中的映射,SQL编写,注入,组件等问题。但其实对于刚入门的我来说,在工作效率上提高了许多,但是感觉是走了很多的捷径去完成了工作而已,一些基础知识和底层的原理并没有深入的了解。这也是为什么要开启学习笔记的原因。

今天就更新到这里,感谢。