這個(gè)本人做的一個(gè)SpringBoot+JPA的示例項(xiàng)目,講解了一些自己搜集到的使用技巧。
Github地址是:https://github.com/unlucky-one/SpringBootAndJPA
項(xiàng)目框架圖

搭建了一套Spring Boot的微服務(wù),數(shù)據(jù)庫操作使用JPA。
主要是自定義了BaseRepository類,實(shí)現(xiàn)了一些自定義方法,盡量的縮減了重復(fù)代碼,歡迎愛好者共同學(xué)習(xí)。
前言
項(xiàng)目中使用到了Lombok插件,請沒安裝的朋友自行下載安裝。否則帶有@Data、@NoArgsConstructor、@AllArgsConstructor的類無法編譯。
一、基礎(chǔ)篇
Spring基礎(chǔ),有SpringMVC基礎(chǔ)的人略過。
??進(jìn)入項(xiàng)目首先你要打開application.properties文件,根據(jù)個(gè)人情況修改為你的數(shù)據(jù)庫配置。
??spring.jpa.hibernate.ddl-auto這個(gè)配置需要注意。這個(gè)配置的目的是控制jpa對數(shù)據(jù)庫如何操作。
當(dāng)值為create的時(shí)候每次啟動(dòng)項(xiàng)目Jpa會(huì)根據(jù)項(xiàng)目內(nèi)的實(shí)體映射生成表。建議表生成后或數(shù)據(jù)庫中的表已存在時(shí)將參數(shù)改成none或update。
??MyResponseAdvice類是一個(gè)全局的返回值控制器。用來統(tǒng)一返回?cái)?shù)據(jù)的格式。我這里返回的為map類型,數(shù)據(jù)包含status、message、data。
??MyAppConfig對項(xiàng)目對項(xiàng)目做了一些配置,修改攔截器攔截的請求在這個(gè)類中配置。
??MyFilter自定義過濾器,所有請求都會(huì)經(jīng)過這個(gè)類,可以加一些計(jì)數(shù)器操作。
??MyAppInterceptor未忽略的請求都會(huì)被此類攔截,用戶驗(yàn)證、權(quán)限驗(yàn)證都可以在這里做。
??MyHttpSessionListener自定義Session監(jiān)聽器,這里做了一個(gè)在線人數(shù)統(tǒng)計(jì)功能。
Jpa類說明
??I18nUtils國際化配置。
??BaseRepositoryFactoryBean為更換jpa處理類的工廠類,下一篇會(huì)詳細(xì)說明。
??BeanTransformerAdapterbean的適配器類。
??BaseRepository接口,定義了一些要自己實(shí)現(xiàn)的通用方法,目的是減少重復(fù)工作,還可以對jpa操作做一些擴(kuò)展,方便項(xiàng)目維護(hù)。BaseRepositoryImpl是對它的實(shí)現(xiàn)。
??其他的Repository類中列出了一些jpa使用技巧,在第三篇會(huì)說明,類中也有注釋。
??entity下的類中標(biāo)注了@Entity和@Table的類為要映射到表的實(shí)體類,其他為自定義的返回結(jié)果。
二、改造篇
??項(xiàng)目主要對Jpa的基本Repository(SimpleJpaRepository)又做了一次封裝。
??BaseRepositoryFactoryBean是一個(gè)工廠類,用來將jpa默認(rèn)的處理類換成自定義的BaseRepository。此類需要配置在程序的入口的@EnableJpaRepositories注解中的repositoryFactoryBeanClass屬性。
??BaseRepository接口上文已經(jīng)說明了作用。注意要在類頭加上@NoRepositoryBean注解,讓Spring不要注入此類,手動(dòng)使用BaseRepositoryFactoryBean的方式加入到Spring。
??在核心的BaseRepositoryImpl處理類中加入了一些自定義的方法。構(gòu)造函數(shù)中通過參數(shù)獲取實(shí)體的操作類。接下來實(shí)現(xiàn)了一些可以使用原生sql來查詢數(shù)據(jù)庫的方法。
??fakeDelete方法實(shí)現(xiàn)了一個(gè)偽刪除操作(既:當(dāng)表中存在state字段時(shí),將值改為-1,不存在則執(zhí)行刪除,可根據(jù)個(gè)人情況修改deleteWithState方法),該方法中操作數(shù)據(jù)的方式使用的是Criteria,有興趣的朋友可以深入研究。
??重寫了save方法,這個(gè)方法用于保存和修改(區(qū)別在于是否有id)。
重寫的目的是判斷標(biāo)注了@DynamicUpdate注解的實(shí)體中的字段字段是否為空值,修改的時(shí)候會(huì)忽略修改空值的字段,
所以實(shí)體中數(shù)字型的字段類型一定要用大寫的“類”型,如:Long、Integer。
三、技巧篇
??項(xiàng)目中的Service可繼承BaseService,用來減少一些重復(fù)性的代碼,如簡單的增刪改查。
??項(xiàng)目中的Repository都繼承了自定義的BaseRepository而不是默認(rèn)的JpaRepository。
??UserIdentifyRepository中列出三種Jpa的查詢方式。還有一種@NamedQuery方式因?yàn)橐薷膶?shí)體類,所以本項(xiàng)目沒有用到。
??UserRepository中展示類分頁查詢和返回自定義類的方法。