JPA全称为JAVA Persistence API,它是一个数据持久化的类和方法的集合。JPA的目标是制定一个很多数据库供应商实现的API,开发人员可以通过编码实现该API。目前,在Java项目开发中提到JPA一般是指用Hibernate的实现,因为在Java的ORM框架中,只有Hibernate实现得最好。本节以案例的形式来讲述如何在Spring Boot工程中使用JPA。另外,案例使用的数据库为MySQL数据库,需要自行安装。
(1)新建一个Spring Boot项目
在Spring Boot工程的pom文件依次引入Web功能的起步依赖spring-boot-starter-web、JPA的起步依赖spring-boot-starter-data-jpa、MySQL数据库的连接器的依赖mysql-connector-java,其代码如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
(2)配置数据源
在工程的配置文件application.yml文件中加上相应的配置,需要配置两个选项:DataSource数据源的配置和JPA的配置。其中,数据源的配置包括连接MySQL的驱动类(例如com.mysql.jdbc.Driver)、MySQL数据库的地址Url、MySQL数据库的用户名username和密码password。JPA的配置包括hibernate.ddl-auto配置,配置为create时,程序启动时会在MySQL数据库中建表;配置为update时,在程序启动时不会在MySQL数据库中建表;jpa.show-sql配置为在通过JPA操作数据库时是否显示操作的SQL语句。配置代码如下:
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/spring-cloud?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8
username: root
password: root
jpa:
hibernate:
ddl-auto: create #第一次建表create 后面用update
show-sql: true
(3)创建实体对象
通过@Entity注解表明该类是一个实体类,它和数据库的表名相对应;@Id注解表明该变量对应于数据库中的Id,@GeneratedValue注解配置Id字段为自增长;@Column表明该变量对应于数据库表中的字段,unique=true表明该变量对应于数据库表中的字段为唯一约束。代码如下:
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false,unique = true)
private String username;
@Column
private String password;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
(4)创建DAO层
数据访问层DAO,通过编写一个UserDao类,该类继承JpaRepository的接口,继承之后就能对数据库进行读写操作,包含了基本的单表查询的方法,非常方便。在UserDao类写一个findByUsername的方法,传入参数username,JPA已经实现了根据某个字段去查找的方法,所以该方法可以根据username字段从数据库中获取User的数据,不需要做额外的编码。代码如下:
public interface UserDao extends JpaRepository<User,Long> {
User findByUsername(String username);
}
(5)创建Service层
在UserService类中注入UserDao,并写一个根据用户名获取用户的方法,代码如下:
@Service
public class UserService {
@Autowired
private UserDao userDao;
public User findUserByName(String username){
return userDao.findByUsername(username);
}
}
(6)创建Controller层
在UserController类写一个Get类型的API接口,其中需要说明的是@Path Variable注解,可以获取RESTful风格的Url路径上的参数。
@RequestMapping("/user")
@RestController
public class UserController {
@Autowired
UserService userService;
@GetMapping("/{username}")
public User getUser(@PathVariable("username")String username){
return userService.findUserByName(username);
}
}
启动运行程序,控制台输出的日志如下:
Hibernate: drop table if exists user
Hibernate: create table user (id bigint not null auto_increment, password varchar(255), username varchar(255) not null, primary key (id))
Hibernate: alter table user add constraint UK_sb8bbouer5wak8vyiiy4pf2bx unique (username)
可见,JPA在启动程序时在数据中创建了user表。在navcat中查看确实发现user表被创建了。这时在数据库中插入一条数据:
INSERT into `user`(username,password)values('rock','123456');
再打开浏览器,在浏览器中输入"localhost:8080/user/rock”,可以从数据库中读取username字段为rock的用户对象,浏览器显示如下