springboot(三)SpringDataJPA完成CRUD
參考博客—恒宇少年:https://www.jianshu.com/p/b6932740f3c0
純潔的微笑:http://www.ityouknow.com/springboot/2016/08/20/spring-boo-jpa.html
首先了解JPA是什麽?
JPA(Java Persistence API)是Sun官方提出的Java持久化規範。它為Java開發人員提供了一種對象/關聯映射工具來管理Java應用中的關系數據。他的出現主要是為了簡化現有的持久化開發工作和整合ORM技術,結束現在Hibernate,TopLink,JDO等ORM框架各自為營的局面。值得註意的是,JPA是在充分吸收了現有Hibernate,TopLink,JDO等ORM框架的基礎上發展而來的,具有易於使用,伸縮性強等優點。從目前的開發社區的反應上看,JPA受到了極大的支持和贊揚,其中就包括了Spring與EJB3.0的開發團隊。
註意:JPA是一套規範,不是一套產品,那麽像Hibernate,TopLink,JDO他們是一套產品,如果說這些產品實現了這個JPA規範,那麽我們就可以叫他們為JPA的實現產品。
spring data jpa
Spring Data JPA 是 Spring 基於 ORM 框架、JPA 規範的基礎上封裝的一套JPA應用框架,可使開發者用極簡的代碼即可實現對數據的訪問和操作。它提供了包括增刪改查等在內的常用功能,且易於擴展!學習並使用 Spring Data JPA 可以極大提高開發效率!
spring data jpa讓我們解脫了DAO層的操作,基本上所有CRUD都可以依賴於它來實現。
本文實現目標
學習並且使用SpringBoot訪問MySQL數據庫,並且結合SpringDataJPA完成CRUD(Create,Read,Update,Delete)簡單操作。
一、創建web工程(註意:應選擇war包,web,MySQL,JPA組件作為我們開發必備組件)
二、打開pom.xml可以看到springboot自動為我們添加了spring-data-jpa、mysql-connector-java的支持
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"View Codexmlns: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> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.2.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.dyh</groupId> <artifactId>lesson_three</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <name>lesson_three</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <!--spring-data-jpa--> <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> <!--ysql-connector-java的支持--> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <!--如果使用的是內部Tomcat,那麽應該註釋掉<scope></scope>--> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <!--<scope>provided</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標簽註釋掉。或者Tomcat一直啟動不起來。
配置文件application.xml
spring: datasource: url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT driverClassName: com.mysql.cj.jdbc.Driver username: root password: root jpa: database: MySQL show-sql: true hibernate: # naming_strategy: org.hibernate.cfg.ImprovedNamingStrategy ddl-auto: create
jpa.hibernate.ddl-auto是hibernate的配置屬性,其主要作用是:自動創建、更新、驗證數據庫表結構。該參數的幾種配置如下:
·create:每次加載hibernate時都會刪除上一次的生成的表,然後根據你的model類再重新來生成新表,哪怕兩次沒有任何改變也要這樣執行,這就是導致數據庫表數據丟失的一個重要原因。
·create-drop:每次加載hibernate時根據model類生成表,但是sessionFactory一關閉,表就自動刪除。
·update:最常用的屬性,第一次加載hibernate時根據model類會自動建立起表的結構(前提是先建立好數據庫),以後加載hibernate時根據model類自動更新表結構,即使表結構改變了但表中的行仍然存在不會刪除以前的行。要註意的是當部署到服務器後,表結構是不會被馬上建立起來的,是要等應用第一次運行起來後才會。
·validate:每次加載hibernate時,驗證創建數據庫表結構,只會和數據庫中的表進行比較,不會創建新表,但是會插入新值。
三、實體類與數據庫
import javax.persistence.*; import java.io.Serializable; @Entity @Table(name = "t_user") public class User implements Serializable{ @Id @GeneratedValue @Column(name = "t_id") private int id; @Column(name = "t_name") private String name; @Column(name = "t_address") private String address; @Column(name = "t_pwd") private String pwd; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } @Override public String toString() { return "User{" + "id=" + id + ", name=‘" + name + ‘\‘‘ + ", address=‘" + address + ‘\‘‘ + ", pwd=‘" + pwd + ‘\‘‘ + ‘}‘; } }View Code
四、創建JPA,使用SpringDataJPA來完成數據庫操作
import com.dyh.bean.User; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import java.io.Serializable; public interface UserJpa extends JpaRepository<User,Long>,JpaSpecificationExecutor<User>,Serializable { }
五、controller層代碼(查詢與增加操作)
@RestController public class UserController { @Autowired private UserJpa userJpa; @RequestMapping(value = "/jpalist", method = RequestMethod.GET) public List<User> getListUser(){ List<User> allUser = userJpa.findAll(); return allUser; } @RequestMapping(value = "/jpaadd", method = RequestMethod.GET) public void addUser(User user){ User us = new User(); us.setName("luly"); us.setAddress("鄭州"); us.setPwd("123456"); User save = userJpa.save(us); } }
補充:
JPA擁有哪些註解呢?
@Entity 聲明類為實體或表。
@Table 聲明表名。
@Basic 指定非約束明確的各個字段。
@Embedded 指定類或它的值是一個可嵌入的類的實例的實體的屬性。
@Id 指定的類的屬性,用於識別(一個表中的主鍵)。
@GeneratedValue 指定如何標識屬性可以被初始化,例如自動、手動、或從序列表中獲得的值。
@Transient 指定的屬性,它是不持久的,即:該值永遠不會存儲在數據庫中。
@Column 指定持久屬性欄屬性。
@SequenceGenerator 指定在@GeneratedValue註解中指定的屬性的值。它創建了一個序列。
@TableGenerator 指定在@GeneratedValue批註指定屬性的值發生器。它創造了的值生成的表。
@AccessType 這種類型的註釋用於設置訪問類型。如果設置@AccessType(FIELD),則可以直接訪問變量並且不需要getter和setter,但必須為public。如果設置@AccessType(PROPERTY),通過getter和setter方法訪問Entity的變量。
@JoinColumn 指定一個實體組織或實體的集合。這是用在多對一和一對多關聯。
@UniqueConstraint 指定的字段和用於主要或輔助表的唯一約束。
@ColumnResult 參考使用select子句的SQL查詢中的列名。
@ManyToMany 定義了連接表之間的多對多一對多的關系。
@ManyToOne 定義了連接表之間的多對一的關系。
@OneToMany 定義了連接表之間存在一個一對多的關系。
@OneToOne 定義了連接表之間有一個一對一的關系。
@NamedQueries 指定命名查詢的列表。
@NamedQuery 指定使用靜態名稱的查詢。
springboot(三)SpringDataJPA完成CRUD