成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

一起來學(xué)SpringBoot | 第六篇:整合SpringDataJpa

Dionysus_go / 1756人閱讀

摘要:忽略該字段的映射省略創(chuàng)建數(shù)據(jù)訪問層接口,需要繼承,第一個(gè)泛型參數(shù)是實(shí)體對(duì)象的名稱,第二個(gè)是主鍵類型。

SpringBoot 是為了簡(jiǎn)化 Spring 應(yīng)用的創(chuàng)建、運(yùn)行、調(diào)試、部署等一系列問題而誕生的產(chǎn)物,自動(dòng)裝配的特性讓我們可以更好的關(guān)注業(yè)務(wù)本身而不是外部的XML配置,我們只需遵循規(guī)范,引入相關(guān)的依賴就可以輕易的搭建出一個(gè) WEB 工程

上一篇介紹了Spring JdbcTemplate的使用,對(duì)比原始的JDBC而言,它更加的簡(jiǎn)潔。但隨著表的增加,重復(fù)的CRUD工作讓我們苦不堪言,這時(shí)候Spring Data Jpa的作用就體現(xiàn)出來了.....

JPA

JPA是Java Persistence API的簡(jiǎn)稱,中文名Java持久層API,是官方(Sun)在JDK5.0后提出的Java持久化規(guī)范。其目的是為了簡(jiǎn)化現(xiàn)有JAVA EEJAVA SE應(yīng)用開發(fā)工作,以及整合現(xiàn)有的ORM技術(shù)實(shí)現(xiàn)規(guī)范統(tǒng)一

JPA的總體思想和現(xiàn)有Hibernate、TopLinkJDO等ORM框架大體一致??偟膩碚f,JPA包括以下3方面的技術(shù):

ORM映射元數(shù)據(jù): 支持XML和注解兩種元數(shù)據(jù)的形式,元數(shù)據(jù)描述對(duì)象和表之間的映射關(guān)系,框架據(jù)此將實(shí)體對(duì)象持久化到數(shù)據(jù)庫(kù)表中;

API: 操作實(shí)體對(duì)象來執(zhí)行CRUD操作,框架在后臺(tái)替代我們完成所有的事情,開發(fā)者從繁瑣的JDBC和SQL代碼中解脫出來。

查詢語(yǔ)言: 通過面向?qū)ο蠖敲嫦驍?shù)據(jù)庫(kù)的查詢語(yǔ)言查詢數(shù)據(jù),避免程序的SQL語(yǔ)句緊密耦合。

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

Spring Data JPA

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

優(yōu)點(diǎn)

豐富的API,簡(jiǎn)單操作無需編寫額外的代碼

豐富的SQL日志輸出

缺點(diǎn)

學(xué)習(xí)成本較大,需要學(xué)習(xí)HQL

配置復(fù)雜,雖然SpringBoot簡(jiǎn)化的大量的配置,關(guān)系映射多表查詢配置依舊不容易

性能較差,對(duì)比JdbcTemplate、Mybatis等ORM框架,它的性能無異于是最差的

導(dǎo)入依賴

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



    org.springframework.boot
    spring-boot-starter-data-jpa



    mysql
    mysql-connector-java



    org.springframework.boot
    spring-boot-starter-web



    org.springframework.boot
    spring-boot-starter-test
    test
連接數(shù)據(jù)庫(kù)

application.properties中添加如下配置。值得注意的是,SpringBoot默認(rèn)會(huì)自動(dòng)配置DataSource,它將優(yōu)先采用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
# 數(shù)據(jù)庫(kù)類型
spring.jpa.database=mysql
ddl-auto 幾種屬性

create: 每次運(yùn)行程序時(shí),都會(huì)重新創(chuàng)建表,故而數(shù)據(jù)會(huì)丟失

create-drop: 每次運(yùn)行程序時(shí)會(huì)先創(chuàng)建表結(jié)構(gòu),然后待程序結(jié)束時(shí)清空表

upadte: 每次運(yùn)行程序,沒有表時(shí)會(huì)創(chuàng)建表,如果對(duì)象發(fā)生改變會(huì)更新表結(jié)構(gòu),原有數(shù)據(jù)不會(huì)清空,只會(huì)更新(推薦使用)

validate: 運(yùn)行程序會(huì)校驗(yàn)數(shù)據(jù)與數(shù)據(jù)庫(kù)的字段類型是否相同,字段不同會(huì)報(bào)錯(cuò)

具體編碼

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

實(shí)體類

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

常見的幾種自增策略

TABLE: 使用一個(gè)特定的數(shù)據(jù)庫(kù)表格來保存主鍵

SEQUENCE: 根據(jù)底層數(shù)據(jù)庫(kù)的序列來生成主鍵,條件是數(shù)據(jù)庫(kù)支持序列。這個(gè)值要與generator一起使用,generator 指定生成主鍵使用的生成器(可能是orcale中自己編寫的序列)。

IDENTITY: 主鍵由數(shù)據(jù)庫(kù)自動(dòng)生成(主要是支持自動(dòng)增長(zhǎng)的數(shù)據(jù)庫(kù),如mysql)

AUTO: 主鍵由程序控制,也是GenerationType的默認(rèn)值。

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
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String username;
    private String password;
    /**
     * TODO 忽略該字段的映射
     */
    @Transient
    private String  email;

    // TODO  省略get set
}
Repository

創(chuàng)建UserRepository數(shù)據(jù)訪問層接口,需要繼承JpaRepository,第一個(gè)泛型參數(shù)是實(shí)體對(duì)象的名稱,第二個(gè)是主鍵類型。只需要這樣簡(jiǎn)單的配置,該UserRepository就擁常用的CRUD功能,JpaRepository本身就包含了常用功能,剩下的查詢我們按照規(guī)范寫接口即可,JPA支持@Query注解寫HQL,也支持findAllByUsername這種根據(jù)字段名命名的方式(強(qiáng)烈推薦IntelliJ IDEA對(duì)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 {

    /**
     * 根據(jù)用戶名查詢用戶信息
     *
     * @param username 用戶名
     * @return 查詢結(jié)果
     */
    List findAllByUsername(String username);
}
測(cè)試

完成數(shù)據(jù)訪問層接口后,最后編寫一個(gè)junit測(cè)試類來檢驗(yàn)代碼的正確性。

下面的幾個(gè)操作中,只有findAllByUsername是我們自己編寫的代碼,其它的都是繼承自JpaRepository接口中的方法,更關(guān)鍵的是分頁(yè)及排序是如此的簡(jiǎn)單實(shí)例化一個(gè)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 u1 = userRepository.findAllByUsername("u1");
        log.info("[條件查詢] - [{}]", u1);
        Pageable pageable = PageRequest.of(0, 10, Sort.by(Sort.Order.desc("username")));
        final Page users = userRepository.findAll(pageable);
        log.info("[分頁(yè)+排序+查詢所有] - [{}]", 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());
    }
}
總結(jié)

更多內(nèi)容請(qǐng)參考官方文檔

目前很多大佬都寫過關(guān)于 SpringBoot 的教程了,如有雷同,請(qǐng)多多包涵,本教程基于最新的 spring-boot-starter-parent:2.0.1.RELEASE編寫,包括新版本的特性都會(huì)一起介紹...

說點(diǎn)什么

個(gè)人QQ:1837307557

battcn開源群(適合新手):391619659

微信公眾號(hào)(歡迎調(diào)戲):battcn

個(gè)人博客:http://blog.battcn.com/

全文代碼:https://github.com/battcn/spring-boot2-learning/tree/master/chapter5

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/71363.html

相關(guān)文章

  • SpringBoot非官方教程 | 六篇SpringBoot整合mybatis

    摘要:本文主要講解如何在下整合,并訪問數(shù)據(jù)庫(kù)。由于這個(gè)框架太過于流行,所以我就不講解了。創(chuàng)建數(shù)據(jù)庫(kù)表建表語(yǔ)句具體實(shí)現(xiàn)這篇文篇通過注解的形式實(shí)現(xiàn)。創(chuàng)建實(shí)體層層層,構(gòu)建通過測(cè)試通過。源碼下載參考資料整合 本文主要講解如何在springboot下整合mybatis,并訪問數(shù)據(jù)庫(kù)。由于mybatis這個(gè)框架太過于流行,所以我就不講解了。 引入依賴 在pom文件引入mybatis-spring-boo...

    Doyle 評(píng)論0 收藏0
  • 起來學(xué)SpringBoot | 第七篇:整合Mybatis

    摘要:但是鑒于國(guó)內(nèi)市場(chǎng)環(huán)境而言,掌握無異于是佳的選擇,低學(xué)習(xí)成本和動(dòng)態(tài)解耦的特點(diǎn)使得更容易被人們所接受。 SpringBoot 是為了簡(jiǎn)化 Spring 應(yīng)用的創(chuàng)建、運(yùn)行、調(diào)試、部署等一系列問題而誕生的產(chǎn)物,自動(dòng)裝配的特性讓我們可以更好的關(guān)注業(yè)務(wù)本身而不是外部的XML配置,我們只需遵循規(guī)范,引入相關(guān)的依賴就可以輕易的搭建出一個(gè) WEB 工程 MyBatis 是一款優(yōu)秀的持久層框架,它支持...

    includecmath 評(píng)論0 收藏0
  • Java3y文章目錄導(dǎo)航

    摘要:前言由于寫的文章已經(jīng)是有點(diǎn)多了,為了自己和大家的檢索方便,于是我就做了這么一個(gè)博客導(dǎo)航。 前言 由于寫的文章已經(jīng)是有點(diǎn)多了,為了自己和大家的檢索方便,于是我就做了這么一個(gè)博客導(dǎo)航。 由于更新比較頻繁,因此隔一段時(shí)間才會(huì)更新目錄導(dǎo)航哦~想要獲取最新原創(chuàng)的技術(shù)文章歡迎關(guān)注我的公眾號(hào):Java3y Java3y文章目錄導(dǎo)航 Java基礎(chǔ) 泛型就這么簡(jiǎn)單 注解就這么簡(jiǎn)單 Druid數(shù)據(jù)庫(kù)連接池...

    KevinYan 評(píng)論0 收藏0
  • SpringDataJPA入門就這么簡(jiǎn)單

    摘要:一入門在上次學(xué)的時(shí)候,那時(shí)候的教程就已經(jīng)涉及到了一點(diǎn)的知識(shí)了。入門只是中的一個(gè)子模塊是一套標(biāo)準(zhǔn)接口,而是的實(shí)現(xiàn)底層默認(rèn)實(shí)現(xiàn)是使用的首個(gè)接口就是,它是一個(gè)標(biāo)記接口。這也導(dǎo)致了我出現(xiàn)這個(gè)錯(cuò)誤的原因。 一、SpringData入門 在上次學(xué)SpringBoot的時(shí)候,那時(shí)候的教程就已經(jīng)涉及到了一點(diǎn)SpringData JPA的知識(shí)了。當(dāng)時(shí)還是第一次見,覺得也沒什么大不了,就是封裝了Hiber...

    MasonEast 評(píng)論0 收藏0
  • 移動(dòng)商城項(xiàng)目【總結(jié)】

    摘要:有必要建一個(gè)資源服務(wù)器存放靜態(tài)資源。一些用戶級(jí)別的數(shù)據(jù)輕量可以考慮存儲(chǔ)在中。存儲(chǔ)的是值,可以通過來對(duì)和對(duì)象之間的轉(zhuǎn)換如果我們的數(shù)據(jù)是在后臺(tái)傳過去或者轉(zhuǎn)換而成的,在前臺(tái)上并沒有做什么改變的話。 移動(dòng)商城項(xiàng)目總結(jié) 移動(dòng)商城項(xiàng)目是我第二個(gè)做得比較大的項(xiàng)目,該項(xiàng)目系統(tǒng)來源于傳智Java168期,十天的視頻課程(想要視頻的同學(xué)關(guān)注我的公眾號(hào)就可以直接獲取了) 通過這次的項(xiàng)目又再次開闊了我的視野,...

    BlackHole1 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<