中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringBoot整合 SpringDataJPA

發布時間:2020-07-10 15:44:05 來源:網絡 閱讀:1831 作者:Java_老男孩 欄目:編程語言

SpringBoot?是為了簡化?Spring?應用的創建、運行、調試、部署等一系列問題而誕生的產物,自動裝配的特性讓我們可以更好的關注業務本身而不是外部的XML配置,我們只需遵循規范,引入相關的依賴就可以輕易的搭建出一個 WEB 工程

Spring JdbcTemplate的使用,對比原始的JDBC而言,它更加的簡潔。但隨著表的增加,重復的CRUD工作讓我們苦不堪言,這時候Spring Data Jpa的作用就體現出來了…..

JPA

JPA是Java Persistence API的簡稱,中文名Java持久層API,是官方(Sun)在JDK5.0后提出的Java持久化規范。其目的是為了簡化現有JAVA EEJAVA SE應用開發工作,以及整合現有的ORM技術實現規范統一

JPA的總體思想和現有HibernateTopLinkJDO等ORM框架大體一致。總的來說,JPA包括以下3方面的技術:

  • ORM映射元數據:?支持XML和注解兩種元數據的形式,元數據描述對象和表之間的映射關系,框架據此將實體對象持久化到數據庫表中;
  • API:?操作實體對象來執行CRUD操作,框架在后臺替代我們完成所有的事情,開發者從繁瑣的JDBC和SQL代碼中解脫出來。
  • 查詢語言:?通過面向對象而非面向數據庫的查詢語言查詢數據,避免程序的SQL語句緊密耦合。

JPA只是一種規范,它需要第三方自行實現其功能,在眾多框架中Hibernate是最為強大的一個。從功能上來說,JPA就是Hibernate功能的一個子集。Hibernate 從3.2開始,就開始兼容JPA。同時Hibernate3.2獲得了Sun TCK的JPA(Java Persistence API) 兼容認證。

Spring Data JPA

常見的ORM框架中Hibernate的JPA最為完整,因此Spring Data JPA?是采用基于JPA規范的Hibernate框架基礎下提供了Repository層的實現。Spring Data Repository極大地簡化了實現各種持久層的數據庫訪問而寫的樣板代碼量,同時CrudRepository提供了豐富的CRUD功能去管理實體類。

優點

  • 豐富的API,簡單操作無需編寫額外的代碼
  • 豐富的SQL日志輸出

缺點

  • 學習成本較大,需要學習HQL
  • 配置復雜,雖然SpringBoot簡化的大量的配置,關系映射多表查詢配置依舊不容易
  • 性能較差,對比JdbcTemplateMybatis等ORM框架,它的性能無異于是最差的

導入依賴

在?pom.xml?中添加?spring-boot-starter-data-jpa?的依賴

<!-- Spring JDBC 的依賴包,使用 spring-boot-starter-jdbc 或 spring-boot-starter-data-jpa 將會自動獲得HikariCP依賴 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- MYSQL包 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 默認就內嵌了Tomcat 容器,如需要更換容器也極其簡單-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 測試包,當我們使用 mvn package 的時候該包并不會被打入,因為它的生命周期只在 test 之內-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

連接數據庫

application.properties中添加如下配置。值得注意的是,SpringBoot默認會自動配置DataSource,它將優先采用HikariCP連接池,如果沒有該依賴的情況則選取tomcat-jdbc,如果前兩者都不可用最后選取Commons DBCP2通過spring.datasource.type屬性可以指定其它種類的連接池

spring.datasource.url=jdbc:mysql://localhost:3306/chapter5?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false
spring.datasource.password=root
spring.datasource.username=root
#spring.datasource.type
# JPA配置
spring.jpa.hibernate.ddl-auto=update
# 輸出日志
spring.jpa.show-sql=true
# 數據庫類型
spring.jpa.database=mysql

ddl-auto 幾種屬性

  • create:?每次運行程序時,都會重新創建表,故而數據會丟失
  • create-drop:?每次運行程序時會先創建表結構,然后待程序結束時清空表
  • upadte:?每次運行程序,沒有表時會創建表,如果對象發生改變會更新表結構,原有數據不會清空,只會更新(推薦使用)
  • validate:?運行程序會校驗數據與數據庫的字段類型是否相同,字段不同會報錯

具體編碼

由于上面我們采用的是spring.jpa.hibernate.ddl-auto=update方式,因此這里可以跳過手動建表的操作

實體類

JPA規范注解坐落在javax.persistence包下,@Id注解一定不要引用錯了,否則會報錯@GeneratedValue(strategy = GenerationType.IDENTITY)自增策略,不需要映射的字段可以通過@Transient注解排除掉

常見的幾種自增策略

  • TABLE:?使用一個特定的數據庫表格來保存主鍵
  • SEQUENCE:?根據底層數據庫的序列來生成主鍵,條件是數據庫支持序列。這個值要與generator一起使用,generator 指定生成主鍵使用的生成器(可能是orcale中自己編寫的序列)。
  • IDENTITY:?主鍵由數據庫自動生成(主要是支持自動增長的數據庫,如mysql)
  • AUTO:?主鍵由程序控制,也是GenerationType的默認值。
    
    package com.battcn.entity;

import javax.persistence.GenerationType;
import javax.persistence.Id;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import java.io.Serializable;

/**

  • @author Levin
  • @since 2018/5/7 0007
    */
    @Entity(name = "t_user")
    public class User implements Serializable {

    private static final long serialVersionUID = 8655851615465363473L;@Id
    br/>@Id
    private Long id;
    private String username;
    private String password;
    /**

    • TODO 忽略該字段的映射*/
      @Transient
      br/>*/
      @Transient

    // TODO 省略get set
    }

Repository

創建UserRepository數據訪問層接口,需要繼承JpaRepository&lt;T,K&gt;第一個泛型參數是實體對象的名稱,第二個是主鍵類型。只需要這樣簡單的配置,該UserRepository就擁常用的CRUD功能,JpaRepository本身就包含了常用功能,剩下的查詢我們按照規范寫接口即可,JPA支持@Query注解寫HQL,也支持findAllByUsername這種根據字段名命名的方式(強烈推薦IntelliJ IDEA對JPA支持非常NICE)

package com.battcn.repository;

import com.battcn.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * t_user 操作
 *
 * @author Levin
 * @since 2018/5/7 0007
 */
@Repository
public interface UserRepository extends JpaRepository<User, Long> {

    /**
     * 根據用戶名查詢用戶信息
     *
     * @param username 用戶名
     * @return 查詢結果
     */
    List<User> findAllByUsername(String username);
}

測試

完成數據訪問層接口后,最后編寫一個junit測試類來檢驗代碼的正確性。

下面的幾個操作中,只有findAllByUsername是我們自己編寫的代碼,其它的都是繼承自JpaRepository接口中的方法,更關鍵的是分頁及排序是如此的簡單實例化一個Pageable即可…

package com.battcn;

import com.battcn.entity.User;
import com.battcn.repository.UserRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;

/**
 * @author Levin
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class Chapter5ApplicationTests {

    private static final Logger log = LoggerFactory.getLogger(Chapter5ApplicationTests.class);

    @Autowired
    private UserRepository userRepository;

    @Test
    public void test1() throws Exception {
        final User user = userRepository.save(new User("u1", "p1"));
        log.info("[添加成功] - [{}]", user);
        final List<User> u1 = userRepository.findAllByUsername("u1");
        log.info("[條件查詢] - [{}]", u1);
        Pageable pageable = PageRequest.of(0, 10, Sort.by(Sort.Order.desc("username")));
        final Page<User> users = userRepository.findAll(pageable);
        log.info("[分頁+排序+查詢所有] - [{}]", users.getContent());
        userRepository.findById(users.getContent().get(0).getId()).ifPresent(user1 -> log.info("[主鍵查詢] - [{}]", user1));
        final User edit = userRepository.save(new User(user.getId(), "修改后的ui", "修改后的p1"));
        log.info("[修改成功] - [{}]", edit);
        userRepository.deleteById(user.getId());
        log.info("[刪除主鍵為 {} 成功] - [{}]", user.getId());
    }
}

總結

更多內容請參考官方文檔

目前很多大佬都寫過關于?SpringBoot?的教程了,如有雷同,請多多包涵,本教程基于最新的?spring-boot-starter-parent:2.0.1.RELEASE編寫,包括新版本的特性都會一起介紹…

本文的重點是你有沒有收獲與成長,其余的都不重要,希望讀者們能謹記這一點。同時我經過多年的收藏目前也算收集到了一套完整的學習資料,包括但不限于:分布式架構、高可擴展、高性能、高并發、Jvm性能調優、Spring,MyBatis,Nginx源碼分析,Redis,ActiveMQ、Mycat、Netty、Kafka、Mysql、Zookeeper、Tomcat、Docker、Dubbo、Nginx等多個知識點高級進階干貨,希望對想成為架構師的朋友有一定的參考和幫助

有需要的可以加一下三千人Java技術交流分享群:“708 701 457”免費獲取

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

抚宁县| 合山市| 依安县| 高要市| 枣强县| 方正县| 蒙山县| 邵东县| 石棉县| 全州县| 新化县| 文山县| 微山县| 南投县| 洞口县| 马龙县| 河间市| 青州市| 洛阳市| 德保县| 万山特区| 铁力市| 兴安县| 南部县| 马尔康县| 科尔| 吴堡县| 永福县| 日照市| 南京市| 绍兴县| 巴里| 峨边| 玛沁县| 玉溪市| 涡阳县| 横峰县| 苏州市| 阳山县| 娄烦县| 新邵县|