介绍
由Spring提供的一个用于简化JPA开发的框架
Spring Data JPA能干什么
可以极大的简化JPA的写法,可以在几乎不用写实现的情况下,实现对数据的访问和操作。除了CRUD外,还包括如分页、排序等一些常用的功能。
Spring Data JPA有什么
主要来看看Spring Data JPA提供的接口,也是Spring Data JPA的核心概念:
1. Repository:最顶层的接口,是一个空的接口,目的是为了统一所有Repository的类型,且能让组件扫描的时候自动识别。
2. CrudRepository :是Repository的子接口,提供CRUD的功能
3. PagingAndSortingRepository:是CrudRepository的子接口,添加分页和排序的功能
4. JpaRepository:是PagingAndSortingRepository的子接口,增加了一些实用的功能,比如:批量操作等。
5. JpaSpecificationExecutor:用来做负责查询的接口
6. Specification:是Spring Data JPA提供的一个查询规范,要做复杂的查询,只需围绕这个规范来设置查询条件即可
example
环境
jdk1.8 + maven3.2 + (idea 或者 eclipse)
项目目录结构:
创建数据库:
CREATE DATABASE study;
maven配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.fly.study</groupId>
<artifactId>spring_data</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<lombok.version>1.16.16</lombok.version>
<java.version>1.8</java.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- JPA Data (We are going to use Repositories, Entities, Hibernate, etc...) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- Use MySQL Connector-J -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
spring配置文件:
resources下的application.yml文件
spring:
datasource:
url: jdbc:mysql://localhost:3306/study
username: root
password: 123456
jpa:
hibernate:
ddl-auto: create
User代码:
package com.fly.study.model;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
/**
* @author weijun.zou
* Create on 2018/5/6
*/
@Entity
@ToString
public class User {
@Getter
@Setter
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Getter
@Setter
private String name;
@Getter
@Setter
private String email;
}
dao层代码:
package com.fly.study.dao;
import com.fly.study.model.User;
import org.springframework.data.repository.CrudRepository;
/**
* @author weijun.zou
* Create on 2018/5/6
*/
public interface UserRepository extends CrudRepository<User, Long> {
}
main方法:
package com.fly.study;
import com.fly.study.dao.UserRepository;
import com.fly.study.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import java.util.Arrays;
/**
* @author weijun.zou
* Create on 2018/5/6
*/
@SpringBootApplication
public class Application implements CommandLineRunner {
@Autowired
private UserRepository userRepository;
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Override
public void run(String... args) {
//保存用户
User user = new User();
user.setEmail("15735170738@163.com");
user.setName("moon");
user = userRepository.save(user);
System.out.println("保存user:" + user);
//查询用户
user = userRepository.findById(user.getId()).orElse(new User());
System.out.println("查询user:" + user);
//删除用户
System.out.println("删除用户" + user.getId());
userRepository.deleteById(user.getId());
//判断用户是否存在
boolean exists = userRepository.existsById(user.getId());
System.out.println("存在user:" + exists);
//保存多个用户
User u1 = new User();
User u2 = new User();
u1.setName("u1");
u1.setEmail("u1@qq.com");
u2.setName("u2");
u2.setEmail("u2@qq.com");
Iterable<User> saveAllUsers = userRepository.saveAll(Arrays.asList(u1, u2));
System.out.println("保存users:" + saveAllUsers);
//计数
long count = userRepository.count();
System.out.println("数量user:" + count);
//删除所有
System.out.println("删除所有用户");
userRepository.deleteAll();
//查询所有
Iterable<User> allUsers = userRepository.findAll();
System.out.println("所有user:" + allUsers);
}
}