五、SpringBoot使用JPA完成CRUD

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代碼,提升開發效率。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章