一、JPA是什么?
二、Spring Data 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/