目录
- Spring Data
- Spring Data 特点
- Spring Data接口
- Spring Data与JPA
- 在Spring Boot中使用JPA
- 导入pom.xml
- 编写一个实体类与数据库字段进行映射
- 编写接口继承JpaRepository
- 使用
- JPA配置文件配置
- 自定义JPA接口
- JPA一对一查询
- 外键方法
- 配置主表实体类
- 配置附表实体类
- 关联表方法
- 配置主表实体类
- JPA一对多查询
- 一端实体类配置
- 多端实体类配置
Spring Data
Spring Data项目的目的是为了简化构建基于Spring框架应用的数据访问技术,包括非关系数据库、Map-Reduce框架、云数据服务等等;另外也包含对关系数据库的访问支持。
Spring Data 特点
Spring Data为我们提供使用统一的API来对数据访问层进行操作,这主要是Spring Data Commons来实现的。它让我们在使用关系型或者非关系型数据库访问时都基于Spring的统一标准,标准包含了CRUD、排序、分页等相关操作。
Spring Data接口
Spring Data与JPA
- 编写接口继承JpaRepository既有CRUD以及分页等基本功能
- 在接口中只要声明符合规范的方法,就有拥有对应的功能,命名规范如下表(不完全)
Keyword | Sample | JPQL snippet |
And | findByLastnameAndFirstname | … where x.lastname = ?1 and |
Or | findByLastnameOrFirstname | … where x.lastname = ?1 or x.firstname = ?2 |
Is,Equals | findByFirstnameIs,findByFirstnameEquals | … where x.firstname = ?1 |
Between | findByStartDateBetween | … where x.startDate between ?1 and ?2 |
LessThan | findByAgeLessThan | … where x.age < ?1 |
LessThanEqual | findByAgeLessThanEqual | … where x.age ⇐ ?1 |
GreaterThan | findByAgeGreaterThan | … where x.age > ?1 |
GreaterThanEqual | findByAgeGreaterThanEqual | … where x.age >= ?1 |
After | findByStartDateAfter | … where x.startDate > ?1 |
Before | findByStartDateBefore | … where x.startDate < ?1 |
IsNull | findByAgeIsNull | … where x.age is null |
IsNotNull,NotNull | findByAge(Is)NotNull | … where x.age not null |
Like | findByFirstnameLike | … where x.firstname like ?1 |
NotLike | findByFirstnameNotLike | … where x.firstname not like ?1 |
- @Query自定义SQL语句
在Spring Boot中使用JPA
导入pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
编写一个实体类与数据库字段进行映射
- @Entity 告诉JPA这是一个实体类
- @Table 其中name属性指定表名,默认为实体类名的小写
- @JsonIgnoreProperties 在使用Jackson进行json序列化时,遇到JPA往实体添加的属性
hibernateLazyInitializer
会报错,使用该注解忽略该属性 - @Id 指定主键
- @GeneratedValue 自增策略,用
GenerationType.IDENTITY
指定为自增主键 - @Column 标注这是一个列,
name
指定列名,默认为属性名,length
指定字符串长度,默认为255,还有更多相关属性不再赘述
@Entity
@Table(name = "student")
@JsonIgnoreProperties(value={"hibernateLazyInitializer"})
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer studentId;
@Column(name = "student_name", length = 45)
private String studentName;
@Column(name = "gender")
private Boolean gender;
@Column(name = "department")
private String department;
@Column(name = "phone_number")
private String phoneNumber;
/**
* Getter and Setter
*/
}
编写接口继承JpaRepository
第一个泛型为实体类,第二个泛型为实体对象的主键的类
public interface StudentRepository extends JpaRepository<Student, Integer> {
}
使用
Contorller类
@RestController
@RequestMapping("student")
public class StudentController {
@Resource
private StudentRepository repository;
@GetMapping("/{id}")
public Student getOne(@PathVariable("id") Integer id){
return repository.findById(id).orElse(null);
}
请求
http://localhost:8080/student/1
结果
{
"studentId": 1,
"studentName": "张三",
"gender": true,
"department": "医工",
"phoneNumber": "114514"
}
JPA配置文件配置
-
spring.jpa.show-sql=true
开启sql语句日志 -
spring.jpa.hibernate.ddl-auto=update
每次启动检查数据库字段是否与实体类不一致,不一致则更新或创建数据表
自定义JPA接口
添加符合命名规范的方法名称
List<Student> findByStudentName(String studentName);
Controller
@GetMapping("byName")
public List<Student> selectByName(Student student){
return repository.findByStudentName(student.getStudentName());
}
请求
{
"studentName": "张三"
}
结果
[
{
"studentId": 1,
"studentName": "张三",
"gender": true,
"department": "医工",
"phoneNumber": "114514"
}
]
观察自动生成的SQL语句
select student0_.student_id as student_1_0_, student0_.department as departme2_0_, student0_.gender as gender3_0_, student0_.phone_number as phone_nu4_0_, student0_.student_name as student_5_0_ from student student0_ where student0_.student_name=?
JPA一对一查询
外键方法
主表中有字段关联附表,例dorm_id
配置主表实体类
- @OneToOne 标注一对一
- @JoinColumn name主表的关联id,referencedColumnName为附表的id
@OneToOne
@JoinColumn(name = "dorm_id", referencedColumnName = "dorm_id")
private Dorm dorm;
配置附表实体类
没有额外配置,配置实体类和接口即可
关联表方法
例student_dorm(student_id, dorm_id)
配置主表实体类
- @JoinColumn
joinColumns
关联表中的主表id,inverseJoinColumns
关联表中的附表id
@OneToOne
@JoinColumn(name = "student_dorm",
joinColumns = @JoinColumn(name="student_id"),
inverseJoinColumns = @JoinColumn(name = "dorm_id")))
private Dorm dorm;
JPA一对多查询
例article 表(id,title,conten,author_id) author 表(id,name)
一端实体类配置
@OneToMany(mappedBy = "author")
private List<Article> articleList;//文章列表
多端实体类配置
@ManyToOne
@JoinColumn(name="author_id")//设置在article表中的关联字段
private Author author;//所属作者