4.5 Spring Boot整合JPA
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-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa </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(需要提前在数据库中创建数据库名spring-cloud的库)、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&serverTimezone=GMT%2B8 username: root password: 123456 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; …//省略了getter、setter }
(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 userRepository; public User findUserByName(String username){ return userRepository.findByUsername(username); } }
(6)创建Controller层
在UserController类写一个Get类型的API接口,其中需要说明的是@PathVariable注解,可以获取RESTful风格的Url路径上的参数。
@RequestMapping("/user") @RestController public class UserController { @Autowired UserService userService; @GetMapping("/username/{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))
可见,JPA在启动程序时在数据中创建了user表。在终端上用命令行show tables,确实发现user表被创建了。这时在数据库中插入一条数据:
insert into 'user'(username,password) VALUES('forezp','123456');
再打开浏览器,在浏览器中输入“localhost:8080/user/username/forezp”,可以从数据库读取username字段为forezp的用户对象,浏览器显示的数据如下:
{"id":1,"username":"forezp","password":"123456"}