一、JPA是什么?
是Spring基于ORM框架、JPA规范封装的一套JPA应用框架,可使开发者用极简的代码即可实现对数据的访问和操作,它提供了包括增删改查等在内的常用功能,且易于扩展。
它提供了许多编程接口:
Repository:最顶层的接口,是一个空接口,目的是为了统一所有的Repository的类型,且能让组件扫描的时候自动识别;
CrudRepository:Repository的子接口,提供增删改查CRUD的功能;
PagingAndSortingRepository:CrudRepository的子接口,添加分页排序的功能;
JpaRepository:PagingAndSortingRepository的子接口,增加批量操作等功能;
JpaSpeccificationExecutor:用来做复杂查询的接口。
三、示例
1. 添加spring-boot-starter-data-jpa依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
2. 添加mysql依赖:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
3. 配置数据源,在application.properties文件配置:
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?zeroDateTimeBehavior=convertToNull&useUnicode=true&connectTimeout=5000&socketTimeout=5000&characterEncoding=UTF-8&useConfigs=maxPerformance&prepStmtCacheSqlLimit=1024
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect
注意,如果通过jpa在数据库中建表,将jpa.hibernate,ddl-auto改为create,建完表之后,要改为update,要不然每次重启工程会删除表并新建。
JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。
是Spring基于ORM框架、JPA规范封装的一套JPA应用框架,可使开发者用极简的代码即可实现对数据的访问和操作,它提供了包括增删改查等在内的常用功能,且易于扩展。
它提供了许多编程接口:
Repository:最顶层的接口,是一个空接口,目的是为了统一所有的Repository的类型,且能让组件扫描的时候自动识别;
CrudRepository:Repository的子接口,提供增删改查CRUD的功能;
PagingAndSortingRepository:CrudRepository的子接口,添加分页排序的功能;
JpaRepository:PagingAndSortingRepository的子接口,增加批量操作等功能;
JpaSpeccificationExecutor:用来做复杂查询的接口。
三、示例
1. 添加spring-boot-starter-data-jpa依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
2. 添加mysql依赖:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
3. 配置数据源,在application.properties文件配置:
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?zeroDateTimeBehavior=convertToNull&useUnicode=true&connectTimeout=5000&socketTimeout=5000&characterEncoding=UTF-8&useConfigs=maxPerformance&prepStmtCacheSqlLimit=1024
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect
注意,如果通过jpa在数据库中建表,将jpa.hibernate,ddl-auto改为create,建完表之后,要改为update,要不然每次重启工程会删除表并新建。
创建实体类
通过@Entity 表明是一个映射的实体类, @Id表明id, @GeneratedValue 字段自动生成
package sample.data.jpa.domain;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "t_user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + "]";
}
public User(Long id, String name) {
super();
this.id = id;
this.name = name;
}
public User() {
}
}
Dao层
数据访问层,通过编写一个继承自 JpaRepository 的接口就能完成数据访问,其中包含了几本的单表查询的方法,非常的方便。值得注意的是,这个User对象名,而不是具体的表名,另外Interger是主键的类型,一般为Integer或者Long
package sample.data.jpa.service;
import org.springframework.data.repository.CrudRepository;
import sample.data.jpa.domain.User;
public interface UserRepository extends CrudRepository<User, Long> {
User findByName(String name);
}
Controller层
在这个例子中我简略了service层的书写,在实际开发中,不可省略。新写一个controller,示例如下:
package sample.data.jpa.web;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import sample.data.jpa.domain.User;
import sample.data.jpa.service.UserRepository;
@Controller
public class SampleController {
@Autowired
private UserRepository userRepository;
@GetMapping("/")
@ResponseBody
public String helloWorld() {
userRepository.deleteAll();
User user = new User();
user.setName("zhangsan");
userRepository.save(user);
user = userRepository.findByName("zhangsan");
System.out.println("name:"+user.getName());
return "Hello World";
}
}
测试: 打开浏览器输入 http://localhost:8080/
源码下载:https://gitee.com/zhmal/spring-boot-samples/tree/master/spring-boot-sample-data-jpa
参考资料:
http://projects.spring.io/spring-data-jpa/
https://spring.io/guides/gs/accessing-data-jpa/