SpringBoot使用JPA完成CRUD
1.什麼是JPA
一說JavaWeb,很多小夥伴都知道SSH,這個H代表的就是Hibernate框架,這個小夥伴們都知道,可是什麼又是JPA呢?相信許多剛入門的小夥伴聽說過但不是特別清楚,首先JPA的全稱叫做Java Persistence API,JPA是一個基於O/R映射的標準規範,在這個規範中,JPA只定義標準規則,不提供實現,使用者則需要按照規範中定義的方式來使用。目前JPA的主要實現有Hibernate、EclipseLink、OpenJPA等,事實上,由於Hibernate在數據訪問解決技術領域的絕對霸主地位,JPA的標準基本是由Hibernate來主導的。雖然做開發的小夥伴不怎麼喜歡度娘,不過度娘關於JPA的介紹個人覺得倒是比較清晰,有興趣的小夥伴可前去了解下。JPA_百度百科。另外,Spring框架爲我們提供了Spring Data JPA這樣一個東東,可以減少我們使用JPA時的代碼量。
構建項目
2創建SpringBoot項目
創建項目,請參考:初識springboot之快速搭建
如下圖1所示:
我們打開pom.xml可以看到springboot自動爲我們添加了spring-data-jpa、mysql-connector-java的支持,如下圖5所示:
上圖的註釋是我添加的,項目默認創建完成後是沒有註釋的。
<?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.example</groupId>
<artifactId>datajpa</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>DataJPA</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
注意:如果使用內部tomcat運行項目需要將spring-boot-starter-tomcat的scope標籤註釋掉。
3.配置數據源以及JPA
今後我們修改application.properties文件配置爲application.yml配置。.yml配置文件與.properties配置要更清晰更有層次感,可以很明瞭的看懂配置信息。
我們在resources目錄下創建application.yml文件,並且配置DataSource以及JPA,如下所示:
application.yml
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/testjpa
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
jpa:
hibernate:
ddl-auto: update
naming:
physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
show-sql: true
4.新建數據庫
我平時比較喜歡使用navacat for mysql這個數據庫管理工具進行數據庫操作,數據庫建表代碼如下:
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for t_user
-- ----------------------------
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
`t_id` int(11) NOT NULL,
`t_name` varchar(255) DEFAULT NULL,
`t_age` int(11) DEFAULT NULL,
`t_address` varchar(255) DEFAULT NULL,
PRIMARY KEY (`t_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
建成數據庫和表後如圖所示:
5.代碼編寫
5.1創建實體
根據數據庫中的字段對應建立一個實體類UserEntity,實體類中代碼如下:
package com.crazyang.domain;
import javax.persistence.*;
import java.io.Serializable;
/**
* Created with IntelliJ IDEA.
*
* @Author crazyang
* @Desciption:
* @Date 2018-6-6 17:23
*/
@Entity
@Table(name="t_user")
public class UserEntity implements Serializable {
@Id
@GeneratedValue
@Column(name="t_id")
private Long id;
@Column(name="t_name")
private String name;
@Column(name="t_age")
private int age;
@Column(name="t_address")
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
5.2創建JPA
既然實體類我們也已經創建完成了,那麼接下來我們需要使用SpringDataJPA來完成數據庫操作,我們新建名字叫做jpa的package,然後創建UserJPA接口並且繼承SpringDataJPA內的接口作爲父類,代碼如下:
package com.crazyang.jpa;
import com.crazyang.domain.UserEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import java.io.Serializable;
/**
* Created with IntelliJ IDEA.
*
* @Author crazyang
* @Desciption:
* @Date 2018-6-6 17:32
*/
public interface UserJPA extends JpaRepository<UserEntity, Long>, JpaSpecificationExecutor<UserEntity>, Serializable {
}
我們UserJPA繼承了JpaRepository接口(SpringDataJPA提供的簡單數據操作接口)、JpaSpecificationExecutor(SpringDataJPA提供的複雜查詢接口)、Serializable(序列化接口)。
我們並不需要做其他的任何操作了,因爲SpringBoot以及SpringDataJPA會爲我們全部搞定,SpringDataJPA內部使用了類代理的方式讓繼承了它接口的子接口都以spring管理的Bean的形式存在,也就是說我們可以直接使用@Autowired註解在spring管理bean使用
5.3編寫CRUD方法
新建UserController類,用於請求轉發,代碼如下:
package com.crazyang.controller;
import com.crazyang.domain.UserEntity;
import com.crazyang.jpa.UserJPA;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* Created with IntelliJ IDEA.
*
* @Author crazyang
* @Desciption:
* @Date 2018-6-6 17:21
*/
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserJPA userJPA;
/**
* 查詢所有數據
*
* @return
*/
@RequestMapping("/list")
public List<UserEntity> list() {
return userJPA.findAll();
}
@RequestMapping("/save")
public UserEntity save(UserEntity entity) {
return userJPA.save(entity);
}
@RequestMapping(value = "/delete", method = RequestMethod.GET)
public List<UserEntity> delete(Long id) {
userJPA.deleteById(id);
return userJPA.findAll();
}
}
6.啓動項目
啓動項幕後,由於數據庫中並無數據,直接訪問127.0.0.1:8080/user/list顯示爲空,首先向數據庫中插入數據,在瀏覽器中輸入127.0.0.1:8080/user/save?name=admin&age=16&address=shanghai
效果如下圖:
重複插入後,再次訪問127.0.0.1:8080/user/list,效果如下圖所示:
7.總結
本章介紹瞭如何使用Spring Boot JPA進行數據交互,可以看到,使用JPA可以大量減少Dao代碼,提升開發效率。