版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第4章
SpringBoot數(shù)據(jù)訪問本章內(nèi)容:1.掌握SpringBoot整合JDBC2.掌握SpringBoot整合MyBatis3.掌握SpringBoot整合JPA4.掌握數(shù)據(jù)緩存CacheengineeringSoftware4.1SpringBoot整合JDBC
在開發(fā)中,通常會(huì)涉及對(duì)數(shù)據(jù)庫的數(shù)據(jù)進(jìn)行操作,SpringBoot在簡化項(xiàng)目開發(fā)以及實(shí)現(xiàn)自動(dòng)化配置的基礎(chǔ)上,對(duì)關(guān)系型數(shù)據(jù)庫和非關(guān)系型數(shù)據(jù)庫的訪問操作都提供了非常好的整合支持。用SpringBoot框架開發(fā)時(shí),我們常用的ORM框架有JDBC、MyBatis、Hibernate、JPA等,接下來我們學(xué)習(xí)SpringBoot整合JDBC的實(shí)現(xiàn)。engineeringSoftware無論是SQL還是NoSQL,SpringBoot默認(rèn)采用整合SpringData的方式進(jìn)行統(tǒng)一處理,添加大量自動(dòng)配置,屏蔽了很多設(shè)置,引入各種xxxTemplate、xxxRepository來簡化我們對(duì)數(shù)據(jù)訪問層的操作。對(duì)我們來說,只需要進(jìn)行簡單的設(shè)置即可。我們需要用什么數(shù)據(jù)訪問,就引入相關(guān)的start進(jìn)行開發(fā)。4.1.1SpringData簡介
engineeringSoftwareSpring框架針對(duì)數(shù)據(jù)庫開發(fā)中的應(yīng)用提供了JDBCTemplate類,該類是Spring對(duì)JDBC支持的核心,它提供了所有對(duì)數(shù)據(jù)庫操作功能的支持。Spring框架提供的JDBC支持主要由四個(gè)包組成,分別是core(核心包)、object(對(duì)象包)、dataSource(數(shù)據(jù)源包)和support(支持包),org.springframework.jdbc.core.JdbcTemplate類就包含在核心包中。作為SpringJDBC的核心,JdbcTemplate類中包含了所有數(shù)據(jù)庫操作的基本方法。4.1.2整合JDBCTemplate
engineeringSoftwareJdbcTemplate主要提供以下五類方法:execute方法:可以用于執(zhí)行任何SQL語句,一般用于執(zhí)行DDL語句;update方法及batchUpdate方法:update方法用于執(zhí)行新增、修改、刪除等語句;batchUpdate方法用于執(zhí)行批處理相關(guān)語句;query方法及queryForXXX方法:用于執(zhí)行查詢相關(guān)語句;call方法:用于執(zhí)行存儲(chǔ)過程、函數(shù)相關(guān)語句。4.1.2整合JDBCTemplate
engineeringSoftware在SpringBoot應(yīng)用中,如果使用JdbcTemplate操作數(shù)據(jù)庫,那么只需要在pom.xml文件中添加spring-boot-starter-jdbc模塊,即可通過@Autowired注解依賴注人JdbcTemplate對(duì)象,然后調(diào)用JdbcTemplate提供的方法操作數(shù)據(jù)庫。下面通過實(shí)例講解如何在SpringBoot應(yīng)用中使用JdbcTemplate操作數(shù)據(jù)庫4.1.2整合JDBCTemplate
engineeringSoftware使用數(shù)據(jù)庫連接池主要考慮到程序與數(shù)據(jù)庫建立連接的性能。創(chuàng)建一個(gè)新的數(shù)據(jù)庫是一個(gè)很耗時(shí)的過程,在使用完之后,可能還需要不斷的釋放建立的連接,對(duì)資源的損耗大。而采用數(shù)據(jù)庫連接池之后,首先就創(chuàng)建了固定數(shù)量的數(shù)據(jù)庫連接,需要用的時(shí)候使用即可。當(dāng)然,這樣做的一個(gè)缺點(diǎn)是,可能某些時(shí)候完全沒有數(shù)據(jù)庫請(qǐng)求,但是也保持了數(shù)據(jù)庫的最小連接數(shù),浪費(fèi)了資源。不過這種浪費(fèi)資源相對(duì)于完全不采用數(shù)據(jù)庫連接池還是很有優(yōu)勢的。4.1.3數(shù)據(jù)庫連接池Druid
engineeringSoftwareDruid是阿里巴巴開源平臺(tái)上一個(gè)數(shù)據(jù)庫連接池實(shí)現(xiàn),結(jié)合了C3P0、DBCP等數(shù)據(jù)連接池的優(yōu)點(diǎn),同時(shí)加入了日志監(jiān)控。Druid可以很好的監(jiān)控DB池連接和SQL的執(zhí)行情況,天生就是針對(duì)監(jiān)控而生的數(shù)據(jù)連接池。Druid已經(jīng)在阿里巴巴部署了超過600個(gè)應(yīng)用,經(jīng)過一年多生產(chǎn)環(huán)境大規(guī)模部署的嚴(yán)苛考驗(yàn)。SpringBoot2.0以上默認(rèn)使用Hikari數(shù)據(jù)源,可以說Hikari與Driud都是當(dāng)前JavaWeb上最優(yōu)秀的數(shù)據(jù)源,我們來重點(diǎn)介紹SpringBoot如何集成Druid數(shù)據(jù)源。4.1.3數(shù)據(jù)庫連接池Druid
engineeringSoftware我們都知道在使用SpringBoot的過程中,常用的持久化解決方案主要有兩種,一種是Mybatis框架,另一個(gè)就是SpringDataJPA。而SpringDataJPA和MyBatis最大的區(qū)別就是SpringDataJPA是Spring親生的,這個(gè)從名字的命名方式上也能看出來,為什么這么說呢?如果大家用過Mybatis的話應(yīng)該會(huì)發(fā)現(xiàn),Mybatis依賴的artifactId是mybatis-spring-boot-starter,而SpringDataJPA依賴的artifactId卻是spring-boot-starter-data-jpa,從這個(gè)名字關(guān)鍵字(mybatis、jpa)的順序上,我們就能看出來誰才是親生的。雖然不是親生的,但是Mybatis憑借自己輕巧靈活的身姿(易上手、動(dòng)態(tài)SQL等),贏得了廣大開發(fā)者的喜愛。4.2SpringBoot整合MyBatis
engineeringSoftwareMyBatis是一款優(yōu)秀的持久層框架,它支持定制化SQL、存儲(chǔ)過程以及高級(jí)映射。MyBatis避免了幾乎所有的JDBC代碼和手動(dòng)設(shè)置參數(shù)以及獲取結(jié)果集。MyBatis可以使用簡單的XML或注解來配置和映射原生信息,將接口和Java的POJOs(PlainOldJavaObjects,普通的Java對(duì)象)映射成數(shù)據(jù)庫中的記錄。下面通過例題講解SpringBoot整合MyBatis。4.2SpringBoot整合MyBatis
engineeringSoftware對(duì)數(shù)據(jù)庫進(jìn)行操作就需要編寫SQL語句,這里將沿用Spring整合MyBatis的方式,將SQL語句放在XML配置文件中。#mapper配置文件 mybatis.mapper-locations=classpath:mapper/*.xml #實(shí)體類的別名 mybatis.type-aliases-package=.boot.springboot04_03.po #開啟駝峰命名 mybatis.configuration.map-underscore-to-camel-case=true4.2.1使用配置文件的方式整合MyBatis
engineeringSoftware通過上一小節(jié)的實(shí)例可以看到,相對(duì)于Mybatis初期使用,即需要各種配置文件、實(shí)體類、Dao層映射關(guān)聯(lián)等,SpringBoot以配置文件的方式整合MyBatis已經(jīng)簡化了很多。但是通過使用注解,可以進(jìn)一步進(jìn)行簡化,不需要任何XML配置文件。下面我們介紹這種模式,實(shí)現(xiàn)簡單配置,輕松上手。@Select@Insert@Update@Delete4.2.2使用注解的方式整合MyBatis
engineeringSoftware
為了解決對(duì)象屬性和字段駝峰不一致的問題,我們可以使用映射注解@Results來指定映射關(guān)系。Mybatis主要提供這些映射注解:@Results用于填寫結(jié)果集的多個(gè)字段的映射關(guān)系@Result用于填寫結(jié)果集的單個(gè)字段的映射關(guān)系@ResultMap根據(jù)ID關(guān)聯(lián)XML里面<resultMap>4.2.2使用注解的方式整合MyBatis
engineeringSoftware
JPA是JavaPersistenceAPI的簡稱,中文名Java持久層API,是Sun官方提出的Java持久化規(guī)范。其設(shè)計(jì)目標(biāo)主要是為了簡化現(xiàn)有的持久化開發(fā)工作和整合ORM技術(shù)。
JPA使用XML文件或注解(JDK5.0或更高版本)來描述對(duì)象-關(guān)聯(lián)表的映射關(guān)系,能夠?qū)⑦\(yùn)行期的實(shí)體對(duì)象持久化到數(shù)據(jù)庫,它為Java開發(fā)人員提供了一種ORM工具來管理Java應(yīng)用中的關(guān)系數(shù)據(jù)。簡單地說,JPA就是為POJO(PlainOrdinaryJavaObject)提供持久化的標(biāo)準(zhǔn)規(guī)范,即將Java的普通對(duì)象通過對(duì)象關(guān)系映射(Object-RelationalMapping,ORM)持久化到數(shù)據(jù)庫中。4.3SpringBoot整合JPA
engineeringSoftwareSpringDataJPA是Spring基于SpringData框架、在JPA規(guī)范的基礎(chǔ)上開發(fā)的一個(gè)框架,使用SpringDataJPA可以極大地簡化JPA的寫法,可以在幾乎不用寫實(shí)現(xiàn)的情況下實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的訪問和操作,除了CRUD外,還包括分頁和排序等一些常用的功能。
SpringDataJPA還提供了對(duì)分頁查詢、自定義SQL、查詢指定N條記錄、聯(lián)表查詢等功能的支持
JPA不是一種新的ORM框架,它的出現(xiàn)只是用于規(guī)范現(xiàn)有的ORM技術(shù),它不能取代現(xiàn)有的Hibernate、TopLink等框架。相反,在采用JPA開發(fā)時(shí),我們將仍將使用到這些ORM框架,只是此時(shí)開發(fā)出來的應(yīng)用不再依賴于某個(gè)持久化提供商。應(yīng)用可以在不修改代碼的情況下在任何JPA環(huán)境下運(yùn)行,真正做到低耦合,可擴(kuò)展的程序設(shè)計(jì)。4.3.1SpringDataJPA簡介
engineeringSoftwareSpringDataJPA通過提供基于JPA的Repository極大地簡化了JPA的寫法,在幾乎不寫實(shí)現(xiàn)的情況下,實(shí)現(xiàn)數(shù)據(jù)庫的訪問和操作。SpringDataJPA中提供了如下幾個(gè)常用的接口。1.CrudRepository接口該接口的定義如下,總共提供了11個(gè)方法,基本上可以滿足簡單的CRUD操作以及批量操作2.PagingAndSortingRepository接口PagingAndSortingRepository接口繼承了CrudRepository接口。只要繼承了這個(gè)接口,SpringdataJPA就已經(jīng)為你提供了分頁和排序的功能了。4.3.1SpringDataJPA簡介
engineeringSoftware3.JpaRepository接口如果業(yè)務(wù)需要即提供CRUD操作,又需要提供分頁以及排序功能,那么就可以直接繼承這個(gè)接口。該接口繼承了PagingAndSortingRepository接口。4.Repository接口這個(gè)接口是最基礎(chǔ)的接口,只是一個(gè)標(biāo)志性的接口,沒有定義任何的方法,那這個(gè)接口有什么用了?既然SpringdataJPA提供了這個(gè)接口,自然是有它的用處,例如,我們有一部分方法是不想對(duì)外提供的,比如我們只想提供增加和修改方法,不提供刪除方法,那么前面的幾個(gè)接口都是做不到的,這個(gè)時(shí)候,我們就可以繼承這個(gè)接口,然后將CrudRepository接口里面相應(yīng)的方法拷貝到Repository接口就可以了4.3.1SpringDataJPA簡介
engineeringSoftware使用SpringDataJPA建立數(shù)據(jù)庫訪問層十分方便,只需要定義一個(gè)繼承JpaRepository接口的接口即可。因此,自定義的數(shù)據(jù)訪問接口完全繼承了JpaRepository的接口方法。但更重要的是,在自定義的數(shù)據(jù)訪問接口中可以根據(jù)查詢關(guān)鍵字定義查詢方法,這些查詢方法需要符合它的命名規(guī)則,一般是根據(jù)持久化實(shí)體類的屬性名來確定的。在查詢時(shí),通常需要同時(shí)根據(jù)多個(gè)屬性進(jìn)行查詢,且查詢的條件也格式各樣(大于某個(gè)值、在某個(gè)范圍等等),SpringDataJPA為此提供了一些表達(dá)條件查詢的關(guān)鍵字。4.3.2簡單條件查詢
engineeringSoftware
4.3.2簡單條件查詢
engineeringSoftware下面針對(duì)上述代碼用到的注解進(jìn)行簡要說明。@Entity@Entity標(biāo)注用于實(shí)體類聲明語句之前,指出該Java類為實(shí)體類,將映射到指定的數(shù)據(jù)庫表。默認(rèn)情況下,數(shù)據(jù)表的名稱就是首字母小寫的類名,如聲明一個(gè)實(shí)體類Customer,它將映射到數(shù)據(jù)庫中的customer表上。當(dāng)然,還可以使用name屬性指定映射的表名。4.3.2簡單條件查詢engineeringSoftware@Table①當(dāng)實(shí)體類與其映射的數(shù)據(jù)庫表名不同名時(shí)需要使用@Table標(biāo)注說明,該標(biāo)注與@Entity標(biāo)注并列使用,置于實(shí)體類聲明語句之前,可寫于單獨(dú)語句行,也可與聲明語句同行。②@Table標(biāo)注的常用選項(xiàng)是name,用于指明數(shù)據(jù)庫的表名@Id①@Id標(biāo)注用于聲明一個(gè)實(shí)體類的屬性映射為數(shù)據(jù)庫的主鍵列。該屬性通常置于屬性聲明語句之前,可與聲明語句同行,也可寫在單獨(dú)行上。②@Id標(biāo)注也可置于屬性的getter方法之前。4.3.2簡單條件查詢engineeringSoftware@GeneratedValue①@GeneratedValue用于標(biāo)注主鍵的生成策略,默認(rèn)情況下,JPA自動(dòng)選擇一個(gè)最適合底層數(shù)據(jù)庫的主鍵生成策略。②在javax.persistence.GenerationType中定義了以下幾種可供選擇的策略:1)IDENTITY:采用數(shù)據(jù)庫ID自增長的方式來自增主鍵字段;2)AUTO:JPA自動(dòng)選擇合適的策略,是默認(rèn)選項(xiàng);3)SEQUENCE:通過序列產(chǎn)生主鍵,通過@SequenceGenerator注解指定序列名,MySql不支持這種方式4)TABLE:通過表產(chǎn)生主鍵,框架借由表模擬序列產(chǎn)生主鍵,使用該策略可以使應(yīng)用更易于數(shù)據(jù)庫移植。4.3.2簡單條件查詢engineeringSoftware@Column①當(dāng)實(shí)體的屬性與其映射的數(shù)據(jù)庫表的列不同名時(shí)需要使用@Column標(biāo)注說明,該屬性通常置于實(shí)體的屬性聲明語句之前,還可與@Id標(biāo)注一起使用。②@Column標(biāo)注的常用屬性是name,用于設(shè)置映射數(shù)據(jù)庫表的列名。此外,該標(biāo)注還包含其它多個(gè)屬性,如:unique、nullable、length等。③@Column標(biāo)注也可置于屬性的getter方法之前。@Transient@Transient標(biāo)注表示這個(gè)屬性并非是數(shù)據(jù)庫表的映射字段,表示非持久化屬性。4.3.2簡單條件查詢engineeringSoftwareSpring工程中,創(chuàng)建實(shí)體對(duì)象時(shí),可以通過JPA的@Entity標(biāo)識(shí)實(shí)體與數(shù)據(jù)庫表的對(duì)應(yīng)關(guān)系,@Column標(biāo)識(shí)數(shù)據(jù)庫字段。其中還有標(biāo)識(shí)兩個(gè)實(shí)體間關(guān)系的注解:@OneToOne、@OneToMany、@ManyToOne和@ManyToMany,分別標(biāo)識(shí)一對(duì)一、一對(duì)多、多對(duì)一和多對(duì)多。在此,簡單記錄下@OneToOne和@OneToMany的使用。其中還會(huì)涉及注解@JoinColumn,其修飾的字段為關(guān)系維護(hù)字段。4.3.3關(guān)聯(lián)查詢
engineeringSoftware@Query注解查詢適用于所查詢的數(shù)據(jù)無法通過關(guān)鍵字查詢得到結(jié)果的查詢。這種查詢可以擺脫像關(guān)鍵字查詢那樣的約束,將查詢直接在相應(yīng)的接口方法中聲明,結(jié)構(gòu)更為清晰,這是SpringData的特有實(shí)現(xiàn)。@Query注解常用屬性:value
:取值,要么使用原生SQL,要么使用Java持久化查詢語言(JPQL:JavaPersistenceQueryLanguage)nativeQuery=true表示是本地查詢,就是使用原生的sql語句,直接查詢數(shù)據(jù)表名,而不是實(shí)體類對(duì)象進(jìn)行查詢數(shù)據(jù)庫的操作。4.3.4@Query和@Modifying注解
engineeringSoftware在@Query注解中編寫JPQL實(shí)現(xiàn)DELETE和UPDATE操作的時(shí)候必須加上@modifying注解和@Transactional注解,以通知SpringData這是一個(gè)DELETE或UPDATE操作。同時(shí)在執(zhí)行UPDATE或者DELETE操作時(shí),需要在Service層的方法上添加事務(wù)操作。SpringData提供了默認(rèn)的事務(wù)處理方式,即所有的查詢均聲明為只讀事務(wù)。對(duì)于自定義的方法,如需改變SpringData提供的事務(wù)默認(rèn)方式,可以在方法上注解@Transactional聲明。4.3.4@Query和@Modifying注解
engineeringSoftware分頁查詢必然伴隨著一定的排序規(guī)則,否則分頁數(shù)據(jù)的狀態(tài)很難控制,導(dǎo)致用戶可能在不同的頁看到同一條數(shù)據(jù)。那么,如何使用SpringDataJPA進(jìn)行分頁與排序呢?4.3.5排序和分頁查詢
engineeringSoftware我們知道一個(gè)程序的瓶頸在于數(shù)據(jù)庫,我們也知道內(nèi)存的速度是大大快于硬盤的速度的。當(dāng)我們需要重復(fù)地獲取相同的數(shù)據(jù)的時(shí)候,我們一次又一次的請(qǐng)求數(shù)據(jù)庫或者遠(yuǎn)程服務(wù),導(dǎo)致大量的時(shí)間耗費(fèi)在數(shù)據(jù)庫查詢或者遠(yuǎn)程方法調(diào)用上,導(dǎo)致程序性能的惡化,這便是數(shù)據(jù)緩存要解決的問題。Spring定義了org.springframework.cache.CacheManager和org.springframework.cache.Cache接
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年重慶考客運(yùn)資格證
- 2024成品采購合同范文
- 2024技術(shù)開發(fā)合同模板
- 2024物業(yè)保潔員工用工合同
- 2024工程裝飾合同范文
- 垃圾分類培訓(xùn)會(huì)議記錄三篇
- 2024標(biāo)準(zhǔn)產(chǎn)品買賣合同書
- 2024建行外匯借款合同范本
- 深圳大學(xué)《油料與谷物科學(xué)原理》2022-2023學(xué)年第一學(xué)期期末試卷
- 艾草委托代工合同范本(2篇)
- 《雙搖跳》教學(xué)課件
- 可疑值的取舍-Q檢驗(yàn)法
- 010-大遺址保護(hù)規(guī)劃規(guī)范-2015送審稿
- 大學(xué)輿論學(xué)教案
- 壓鑄模及零件結(jié)構(gòu)專業(yè)術(shù)語
- DBJ51-T 188-2022 預(yù)拌流態(tài)固化土工程應(yīng)用技術(shù)標(biāo)準(zhǔn)
- 電工安全培訓(xùn)課件
- 維修工程技術(shù)標(biāo)
- 完整解讀中華人民共和國政府信息公開條例課件
- 單元炮車施工方案
- DL-T 869-2021 火力發(fā)電廠焊接技術(shù)規(guī)程
評(píng)論
0/150
提交評(píng)論