摘要:忽略該字段的映射省略創建數據訪問層接口,需要繼承,第一個泛型參數是實體對象的名稱,第二個是主鍵類型。
SpringBoot 是為了簡化 Spring 應用的創建、運行、調試、部署等一系列問題而誕生的產物,自動裝配的特性讓我們可以更好的關注業務本身而不是外部的XML配置,我們只需遵循規范,引入相關的依賴就可以輕易的搭建出一個 WEB 工程
上一篇介紹了Spring JdbcTemplate的使用,對比原始的JDBC而言,它更加的簡潔。但隨著表的增加,重復的CRUD工作讓我們苦不堪言,這時候Spring Data Jpa的作用就體現出來了.....
JPAJPA是Java Persistence API的簡稱,中文名Java持久層API,是官方(Sun)在JDK5.0后提出的Java持久化規范。其目的是為了簡化現有JAVA EE和JAVA SE應用開發工作,以及整合現有的ORM技術實現規范統一
JPA的總體思想和現有Hibernate、TopLink、JDO等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簡化的大量的配置,關系映射多表查詢配置依舊不容易
性能較差,對比JdbcTemplate、Mybatis等ORM框架,它的性能無異于是最差的
導入依賴在 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
在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 @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String username; private String password; /** * TODO 忽略該字段的映射 */ @Transient private String email; // TODO 省略get set }Repository
創建UserRepository數據訪問層接口,需要繼承JpaRepository
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測試{ /** * 根據用戶名查詢用戶信息 * * @param username 用戶名 * @return 查詢結果 */ List 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總結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("[分頁+排序+查詢所有] - [{}]", 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編寫,包括新版本的特性都會一起介紹...
說點什么個人QQ:1837307557
battcn開源群(適合新手):391619659
微信公眾號(歡迎調戲):battcn
個人博客:http://blog.battcn.com/
全文代碼:https://github.com/battcn/spring-boot2-learning/tree/master/chapter5
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71363.html
摘要:本文主要講解如何在下整合,并訪問數據庫。由于這個框架太過于流行,所以我就不講解了。創建數據庫表建表語句具體實現這篇文篇通過注解的形式實現。創建實體層層層,構建通過測試通過。源碼下載參考資料整合 本文主要講解如何在springboot下整合mybatis,并訪問數據庫。由于mybatis這個框架太過于流行,所以我就不講解了。 引入依賴 在pom文件引入mybatis-spring-boo...
摘要:但是鑒于國內市場環境而言,掌握無異于是佳的選擇,低學習成本和動態解耦的特點使得更容易被人們所接受。 SpringBoot 是為了簡化 Spring 應用的創建、運行、調試、部署等一系列問題而誕生的產物,自動裝配的特性讓我們可以更好的關注業務本身而不是外部的XML配置,我們只需遵循規范,引入相關的依賴就可以輕易的搭建出一個 WEB 工程 MyBatis 是一款優秀的持久層框架,它支持...
摘要:前言由于寫的文章已經是有點多了,為了自己和大家的檢索方便,于是我就做了這么一個博客導航。 前言 由于寫的文章已經是有點多了,為了自己和大家的檢索方便,于是我就做了這么一個博客導航。 由于更新比較頻繁,因此隔一段時間才會更新目錄導航哦~想要獲取最新原創的技術文章歡迎關注我的公眾號:Java3y Java3y文章目錄導航 Java基礎 泛型就這么簡單 注解就這么簡單 Druid數據庫連接池...
摘要:一入門在上次學的時候,那時候的教程就已經涉及到了一點的知識了。入門只是中的一個子模塊是一套標準接口,而是的實現底層默認實現是使用的首個接口就是,它是一個標記接口。這也導致了我出現這個錯誤的原因。 一、SpringData入門 在上次學SpringBoot的時候,那時候的教程就已經涉及到了一點SpringData JPA的知識了。當時還是第一次見,覺得也沒什么大不了,就是封裝了Hiber...
摘要:有必要建一個資源服務器存放靜態資源。一些用戶級別的數據輕量可以考慮存儲在中。存儲的是值,可以通過來對和對象之間的轉換如果我們的數據是在后臺傳過去或者轉換而成的,在前臺上并沒有做什么改變的話。 移動商城項目總結 移動商城項目是我第二個做得比較大的項目,該項目系統來源于傳智Java168期,十天的視頻課程(想要視頻的同學關注我的公眾號就可以直接獲取了) 通過這次的項目又再次開闊了我的視野,...
閱讀 3494·2021-11-24 11:17
閱讀 2281·2021-11-15 11:38
閱讀 3367·2021-10-14 09:42
閱讀 2930·2019-08-30 15:54
閱讀 2024·2019-08-28 18:09
閱讀 538·2019-08-26 11:48
閱讀 1632·2019-08-26 10:48
閱讀 2146·2019-08-26 10:45