1. 程式人生 > >springboot(三)SpringDataJPA完成CRUD

springboot(三)SpringDataJPA完成CRUD

connector 存儲 per autowire packaging oca 必須 出現 let

參考博客—恒宇少年: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"
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> <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>
View Code

註意:如果使用內部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