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最後我們做一些JPA的配置,spring.jpa開頭的配置=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
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 文件中找到的命名規則表:
Keyword | Sample | JPQL snippet |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
相關推薦SpringBoot系列(6)---SpringBoot-JPAJPA 應該都熟悉了,我就不多說了什麼是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 demospring官方提供一個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-JPAJPA(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是持久 |