1. 程式人生 > >SpringBoot系列(6)---SpringBoot-JPA

SpringBoot系列(6)---SpringBoot-JPA

JPA 應該都熟悉了,我就不多說了什麼是JPA了。目前JPA主要實現由hibernate和openJPA等。

Spring Data JPA 是Spring Data 的一個子專案,它通過提供基於JPA的Repository極大了減少了操作JPA的程式碼。筆者覺得這個由SpringBoot 提供的JPARepository真的是非常爽。基本上大部分的業務都可以滿足了。

在Spring環境中需要配置大量了XML配置,但是SpringBoot基本上幫助我們配置好了,我們只需要簡單地配置一下DataSource和幾項jpa額外的配置就完成了整個配置持久化層的工作。EntityManagerFactory 那些都不用配置了。

常規貼出一下Spring-data-JPA的MAVEN

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

一、資料來源和JPA配置

當然我們還是需要在application.properties配置資料來源,SpringBoot預設是使用tomcat的資料來源(intellij有自動提示,spring.datasource.tomcat開頭的配置):

#datasource
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_db?charset=utf8mb4&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=tonyyan
spring.datasource.tomcat.max-active=20
spring.datasource.tomcat.test-while-idle
=true spring.datasource.tomcat.validation-query=select 1 spring.datasource.tomcat.default-auto-commit=false spring.datasource.tomcat.min-idle=15 spring.datasource.tomcat.initial-size=15
最後我們做一些JPA的配置,spring.jpa開頭的配置
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jackson.serialization.indent-output=true
當然SpringBoot的maven也沒有新增mysql driver的依賴。所以要吃自己:
<dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
   <version>6.0.6</version>
</dependency>

二、Entity配置

開始之前我先提供一下我的entity配置,便於理解後面的查詢操作,我們使用模仿微博的資料實體:

User類:

@Entity
@Table(name = "users")
public class User {

    public User() {
    }

    public User(String username, String userpwd) {
        this.username = username;
        this.userpwd = userpwd;
}

    private long userId;
    private String username;
    private String userpwd;
@JsonIgnore
private Set<Weibo> weibos;
@Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public long getUserId() {
        return userId;
}

    public void setUserId(long userId) {
        this.userId = userId;
}

    @Column(name="username")
    public String getUsername() {
        return username;
}

    public void setUsername(String username) {
        this.username = username;
}

    @Column(name = "userpwd")
    public String getUserpwd() {
        return userpwd;
}

    public void setUserpwd(String userpwd) {
        this.userpwd = userpwd;
}

    @OneToMany(fetch = FetchType.LAZY,cascade = {CascadeType.REMOVE},mappedBy = "user")
    public Set<Weibo> getWeibos() {
        return weibos;
}

    public void setWeibos(Set<Weibo> weibos) {
        this.weibos = weibos;
}

    @Override
public String toString() {
        return "User{" +
                "userId=" + userId +
                ", username='" + username + '\'' +
                ", userpwd='" + userpwd + '\'' +
                '}';
}
}

Weibo類:

@Entity
@Table(name="weibo")
public class Weibo {

    public Weibo() {
    }

    public Weibo(User user, String weiboText, Date createDate) {
        this.user = user;
        this.weiboText = weiboText;
        this.createDate = createDate;
}

    private long weiboId;
    private User user;
    private String weiboText;
    private Date createDate;
    private Set<Comment> comments;
@Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public long getWeiboId() {
        return weiboId;
}

    public void setWeiboId(long weiboId) {
        this.weiboId = weiboId;
}

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "user_id")
    public User getUser() {
        return user;
}

    public void setUser(User user) {
        this.user = user;
}

    @Column(name = "weibo_text")
    public String getWeiboText() {
        return weiboText;
}

    public void setWeiboText(String weiboText) {
        this.weiboText = weiboText;
}

    @Column(name = "create_date")
    public Date getCreateDate() {
        return createDate;
}

    public void setCreateDate(Date createDate) {
        this.createDate = createDate;
}

    @OneToMany(fetch = FetchType.LAZY,cascade = {CascadeType.REMOVE},mappedBy = "weibo")
    public Set<Comment> getComments() {
        return comments;
}

    public void setComments(Set<Comment> comments) {
        this.comments = comments;
}

    @Override
public String toString() {
        return "Weibo{" +
                "weiboId=" + weiboId +
                ", user=" + user +
                ", weiboText='" + weiboText + '\'' +
                ", createDate=" + createDate +
                '}';
}
}

comment評論類:

@Entity
@Table(name = "comments")
public class Comment {

    public Comment() {
    }

    public Comment(User user, Weibo weibo, String commentText, Date commentDate) {
        this.user = user;
        this.weibo = weibo;
        this.commentText = commentText;
        this.commentDate = commentDate;
}

    private long commentId;
    private User user;
@JsonIgnore
private Weibo weibo;
    private String commentText;
    private Date commentDate;
@Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public long getCommentId() {
        return commentId;
}

    public void setCommentId(long commentId) {
        this.commentId = commentId;
}

    @ManyToOne
    @JoinColumn(name = "user_id")
    public User getUser() {
        return user;
}

    public void setUser(User user) {
        this.user = user;
}

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "weibo_id")
    public Weibo getWeibo() {
        return weibo;
}

    public void setWeibo(Weibo weibo) {
        this.weibo = weibo;
}

    @Column(name = "comment_text")
    public String getCommentText() {
        return commentText;
}

    public void setCommentText(String commentText) {
        this.commentText = commentText;
}

    @Column(name = "comment_date")
    public Date getCommentDate() {
        return commentDate;
}

    public void setCommentDate(Date commentDate) {
        this.commentDate = commentDate;
}

    @Override
public String toString() {
        return "Comment{" +
                "commentId=" + commentId +
                ", user=" + user +
                ", weibo=" + weibo +
                ", commentText='" + commentText + '\'' +
                ", commentDate=" + commentDate +
                '}';
}
}

三、強大的Spring JpaRepository

SpringBoot建立DAO層很多種方法其中japrepository是最強大的而且最有特色的一種,我們可以針對不同的實體建立repository介面。Spring會根據方法名稱的規則進行自動生成實現,強大的不要不要的。在SpringBoot中預設已經提供了非常多的常規CRUD操作的repository,以下就是Spring為我們提供的repository介面:

@NoRepositoryBean
public interface JpaRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
    List<T> findAll();
List<T> findAll(Sort var1);
List<T> findAll(Iterable<ID> var1);
<S extends T> List<S> save(Iterable<S> var1);
    void flush();
<S extends T> S saveAndFlush(S var1);
    void deleteInBatch(Iterable<T> var1);
    void deleteAllInBatch();
T getOne(ID var1);
<S extends T> List<S> findAll(Example<S> var1);
<S extends T> List<S> findAll(Example<S> var1, Sort var2);
}

@NoRepositoryBean
public interface PagingAndSortingRepository<T, ID extends Serializable> extends CrudRepository<T, ID> {
    Iterable<T> findAll(Sort var1);
Page<T> findAll(Pageable var1);
}

@NoRepositoryBean
public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> {
    <S extends T> S save(S var1);
<S extends T> Iterable<S> save(Iterable<S> var1);
T findOne(ID var1);
    boolean exists(ID var1);
Iterable<T> findAll();
Iterable<T> findAll(Iterable<ID> var1);
    long count();
    void delete(ID var1);
    void delete(T var1);
    void delete(Iterable<? extends T> var1);
    void deleteAll();
}

這些操作完全不用我們去實現,這些不是我們以往在普通的Spring專案中自己所定義的BaseDao嗎?SpringBoot真的是非常體貼,大大減低了我們的工作量。但是更為強大的還在後面。我們通過繼承JpaRepository介面,除了可以獲得上面的基礎CRUD操作方法之外,還可以通過Spring規定的介面命名方法自動建立複雜的CRUD操作,以下是我在Spring Data JPA 文件中找到的命名規則表:

KeywordSampleJPQL snippet

And

findByLastnameAndFirstname

… where x.lastname = ?1 and x.firstname = ?2

Or

findByLastnameOrFirstname

… where x.lastname = ?1 or x.firstname = ?2

Is,Equals

findByFirstname,findByFirstnameIs,findByFirstnameEquals

… where x.firstname = ?1

Between

findByStartDateBetween

… where x.startDate between ?1 and ?2

LessThan

findByAgeLessThan

… where x.age < ?1

LessThanEqual

findByAgeLessThanEqual

… where x.age <= ?1

GreaterThan

findByAgeGreaterThan

… where x.age > ?1

GreaterThanEqual

findByAgeGreaterThanEqual

… where x.age >= ?1

After

findByStartDateAfter

… where x.startDate > ?1

Before

findByStartDateBefore

… where x.startDate < ?1

IsNull

findByAgeIsNull

… where x.age is null

IsNotNull,NotNull

findByAge(Is)NotNull

… where x.age not null

Like

findByFirstnameLike

… where x.firstname like ?1

NotLike

findByFirstnameNotLike

… where x.firstname not like ?1

StartingWith

findByFirstnameStartingWith

… where x.firstname like ?1 (parameter bound with appended %)

EndingWith

findByFirstnameEndingWith

… where x.firstname like ?1 (parameter bound with prepended %)

Containing

findByFirstnameContaining

… where x.firstname like ?1 (parameter bound wrapped in %)

OrderBy

findByAgeOrderByLastnameDesc

… where x.age = ?1 order by x.lastname desc

Not

相關推薦

SpringBoot系列(6)---SpringBoot-JPA

JPA 應該都熟悉了,我就不多說了什麼是JPA了。目前JPA主要實現由hibernate和openJPA等。Spring Data JPA 是Spring Data 的一個子專案,它通過提供基於JPA的Repository極大了減少了操作JPA的程式碼。筆者覺得這個由Spri

SpringBoot系列——Spring-Data-JPA(升級版)

  前言   在上篇部落格中:SpringBoot系列——Spring-Data-JPA:https://www.cnblogs.com/huanzi-qch/p/9970545.html,我們實現了單表的基礎get、save(插入/更新)、list、page、delete介面,但是這樣每個單表都要寫著一套

SpringBoot系列之——整合JPA、mysql

們的 什麽 自增 先生 host tput 高級特性 scope zone 一、JPA 1. 概念:JPA顧名思義就是Java Persistence API的意思,是JDK 5.0註解或XML描述對象-關系表的映射關系,並將運行期的實體對象持久化到數據庫中。

SpringBoot系列SpringBoot註解詳解

一、註解(annotations)列表  @SpringBootApplication:包含了@ComponentScan、@Configuration和@EnableAutoConfiguration註解。其中@ComponentScan讓Spring Boot掃描到Con

SpringBoot系列springboot整合Redis

引入依賴: <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-b

SpringBoot系列7-SpringBoot+mybatis+druid+TypeHandler

介紹在SpringBoot中整合mybatis和druid以及自定義TypeHandler 建立資料庫表 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- --------------------------

SpringBoot系列springboot靜態變數注入

【場景】 配置檔案中的配置項的讀取,例如:defaultTimes=3 【變數獲取】 1.一般變數獲取 @Value("${defaultTimes}") private String defaultTimes; 2.靜態變數獲取 @Component public cl

SpringBoot系列SpringBoot打包成war,並在tomcat下執行

1、實現繼承SpringBootServletInitializer類package com.example.demo; import org.springframework.boot.builder.SpringApplicationBuilder; import org

Springboot系列Springboot與Mybatis整合

前言 技術部落格那麼多,為什麼自己整理呢?太過零散的知識點不易記憶,且查詢的時候也不是太方便,眼過千遍不如手過一遍的操作一遍,即使Springboot已經很好的整合了各項的技術框架,但實際操作的時候也會發現一些問題。我會將可能出現的問題記錄一下,博文時刻更新。 預備知識: Springboot 2.0.6

Springboot系列Springboot的郵件服務

前言 Springboot集常用的功能於一體,當然郵件功能作為最常見的功能,自然不能缺席Springboot的大家庭,spring-boot-starter-mail這個jar裡面封裝了SpringBoot的郵件功能。下面來看一下常見的郵件用途 預備知識: Springboot 2.1.1 Maven 3

SpringBoot 系列-3 SpringBoot 第一個Controller

註解這塊與springmvc都是一樣的 我們看一個簡單點例子。 package com.example.demo; import org.springframework.stereotype.Controller; import org.springframework.web.bind.a

SpringBoot 系列-2 SpringBoot demo

spring官方提供一個demo  https://start.spring.io/ 可以選擇你的構建工具、版本、Group、Artifact 等資訊。 點選generate之後會下載一個zip包。 本文以eclipse 和  maven 作為工作, 匯入zip

Springboot系列Springboot與Thymeleaf模板引擎整合基礎教程(附原始碼)

前言 由於在開發My Blog專案時使用了大量的技術整合,針對於部分框架的使用和整合的流程沒有做詳細的介紹和記錄,導致有些朋友用起來有些吃力,因此打算在接下來的時間裡做一些基礎整合的介紹,當然,可能也不會特別的基礎,但是原始碼會開放給大家,方便大家學習,此次的原始碼地址為s

SpringCloud系列——SSO 單點登入 SpringCloud系列——Zuul 動態路由 SpringBoot系列——Redis SpringBoot系列——Redis

  前言   作為分散式專案,單點登入是必不可少的,文字基於之前的的部落格(猛戳:SpringCloud系列——Zuul 動態路由,SpringBoot系列——Redis)記錄Zuul配合Redis實現一個簡單的sso單點登入例項   sso單點登入思路:   1、訪問分散式系統的任意請求,被Zuul的

SpringBoot系列(7)---SpringBoot-Cache(EhCache)

SpringBoot提供資料快取的功能,相信非常多人已經用過cache了。因為資料庫的IO瓶頸應該大家也吃過不少虧了,所以一般情況下我們都會引入非常多的快取策略,例如引入redis,引入hibernate的二級快取等等。 SpringBoot在annotation的層面給我

springboot系列八 Spring-Data-JPA

JPA(Java Persistence API)是一種物件關係對映的ORM框架,springboot-jpa可以用簡單的配置來完成一些常規的資料庫crud操作 文件:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/ DE

[Spring Boot實戰系列] - No.6 Springboot PageHelper實現後臺分頁

Springboot PageHelper實現後臺分頁 PageHelper是一個很強大的分頁外掛,在Springboot的專案中,如果後臺突然需要改為分頁返回,甚至無需更改過多程式碼即可獲得分頁的結果。 1. 前期程式碼準備 建立一個springboot專案,配置資料庫以及

SpringBoot系列JPA的使用

JPA的簡單定義 對於我這樣初次接觸的人來說,jpa就是一種連線資料的api,由於JpaRepository介面提供了很多強大的方法,能很方便的拼接,從而能讓我們對資料庫的操作較為方便的進行操作。 JpaRepository通過各種介面的繼承,從而有了各種CR

SpringBoot系列教程JPA之新增記錄使用姿勢

SpringBoot系列教程JPA之新增記錄使用姿勢 上一篇文章介紹瞭如何快速的搭建一個JPA的專案環境,並給出了一個簡單的

SpringBoot系列教程JPA之基礎環境搭建

JPA(Java Persistence API)Java持久化API,是 Java 持久化的標準規範,Hibernate是持久