來(lái)源:北大青鳥(niǎo)總部 2023年02月07日 13:33
自從踏上了后端程序猿這條路,從此就和數(shù)據(jù)庫(kù)結(jié)下了不解之緣,每天都要CRUD
我們?cè)谑褂肧pring Boot的時(shí)候,有兩種常用的操作數(shù)據(jù)庫(kù)方案,一種是使用MyBatis框架,另一種就是Spring Data JPA,而且Spring Boot官方默認(rèn)支持的也是Spring Data JPA,從名字上也能看出來(lái),當(dāng)然是因?yàn)樗蚐pring是一家人了。
為什么這么說(shuō)呢?舉個(gè)例子:如果大家用過(guò)MyBatis的話(huà)應(yīng)該會(huì)發(fā)現(xiàn),MyBatis依賴(lài)的artifactId是mybatis-spring-boot-starter,而接下來(lái)我們要講的Spring Data JPA依賴(lài)的artifactId卻是spring-boot-starter-data-jpa,從這個(gè)名字關(guān)鍵字(mybatis、jpa)的順序上,就可以看出來(lái)誰(shuí)才是親生的。
通常情況下Spring Boot官方支持的技術(shù),在起名字的時(shí)候都是以spring-boot-starter-xxx來(lái)命名,而第三方主動(dòng)適配Spring Boot的技術(shù),通常名字都是xxx-spring-boot-starter的命名方式。
接下來(lái)我們就來(lái)一起看下這個(gè)親生的"兒子"為什么值得我們學(xué)習(xí)。
首先,來(lái)看下什么是Spring Data JPA,是Spring生態(tài)中,基于Spring Data框架實(shí)現(xiàn)JPA規(guī)范的一個(gè)持久層抽象,Spring Data JPA底層實(shí)現(xiàn)了Hibernate框架,所以在使用的過(guò)程中可以少寫(xiě)很多SQL,因?yàn)榇蟛糠只A(chǔ)的CRUD方法Spring Data JPA都已經(jīng)幫我們實(shí)現(xiàn)了,幾乎可以在不寫(xiě)具體實(shí)現(xiàn)代碼的情況下完成對(duì)數(shù)據(jù)庫(kù)的操作,除了基礎(chǔ)的CRUD操作外,Spring Data JPA還提供了諸如分頁(yè)、排序等常用功能,極大的提高了開(kāi)發(fā)效率。
接下來(lái),就開(kāi)始進(jìn)入實(shí)戰(zhàn)環(huán)節(jié),通過(guò)一個(gè)小案例,來(lái)體驗(yàn)Spring Data JPA的高效
常言道:"工欲善其事,必先利其器",這句話(huà)放在程序開(kāi)發(fā)中也是非常適合的。
在開(kāi)始之前呢我們要先準(zhǔn)備數(shù)據(jù),使用Navicat(可以自選)先創(chuàng)建一個(gè)數(shù)據(jù)庫(kù),命名為kgc。數(shù)據(jù)庫(kù)創(chuàng)建好之后,創(chuàng)建一張用戶(hù)表,表名為t_user ,添加三列數(shù)據(jù),列名分別是:
? id 唯一標(biāo)記
? username 用戶(hù)名稱(chēng)
? age 年齡
插入三條數(shù)據(jù),數(shù)據(jù)庫(kù)腳本如下:
# 數(shù)據(jù)庫(kù)腳本文件 SET NAMES utf8mb4; -- ---------------------------- -- Table structure for t_user -- ---------------------------- DROP TABLE IF EXISTS `t_user`; CREATE TABLE `t_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(255) NOT NULL, `age` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8; # 插入數(shù)據(jù) INSERT INTO `t_user`(username, age) VALUES ('張三', '18'); INSERT INTO `t_user`(username, age) VALUES ( '李四', '20'); INSERT INTO `t_user` (username, age) VALUES ('王五', '22'); |
數(shù)據(jù)準(zhǔn)備好之后,就可以開(kāi)始集成Spring Data JPA了,使用SpirngBoot Initializr 創(chuàng)建SpringBoot基礎(chǔ)工程,因?yàn)槲覀兪亲龀志脤娱_(kāi)發(fā),所以此時(shí)需要添加一些數(shù)據(jù)庫(kù)相關(guān)的依賴(lài)
數(shù)據(jù)庫(kù)驅(qū)動(dòng)依賴(lài)
這里如果不指定版本默認(rèn)是8.0的版本,當(dāng)然你也可以指定版本
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> |
添加Spring Data JPA依賴(lài)
<!-- Spring Data JPA依賴(lài) --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> |
如果你不想手動(dòng)添加依賴(lài),也可以在創(chuàng)建項(xiàng)目的時(shí)候通過(guò)工具選擇,如下圖:
在application.properties屬性配置文件中配置兩部分內(nèi)容:
數(shù)據(jù)源
jpa相關(guān)配置
#配置數(shù)據(jù)源信息 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/kgc?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai spring.datasource.username=root spring.datasource.password=root # 加載hibernate自動(dòng)更新數(shù)據(jù)庫(kù)結(jié)構(gòu) spring.jpa.hibernate.ddl-auto=update # 控制臺(tái)輸出sql語(yǔ)句 spring.jpa.show-sql=true |
創(chuàng)建User,并實(shí)現(xiàn)序列化接口Serializable,要注意實(shí)體類(lèi)上的這些注解的使用
@Table(name="t_user")//table指的是和哪個(gè)表映射 默認(rèn)是user @Entity(name = "t_user") //實(shí)體類(lèi)名和數(shù)據(jù)庫(kù)表名映射 public class User implements Serializable{ @Id @GeneratedValue(strategy= GenerationType.AUTO) private Integer id; // 用戶(hù)id @Column(name = "username") private String username; //用戶(hù)名 @Column(name = "age") private Integer age; // 年齡 // 省略 setter、getter方法 } |
@Entity:表示這是一個(gè)實(shí)體類(lèi),項(xiàng)目啟動(dòng)時(shí)會(huì)自動(dòng)針對(duì)該類(lèi)生成一張表,默認(rèn)的表名為類(lèi)名,name屬性表示自定義生成的表名。
? @Id:表示這個(gè)字段是一個(gè)id
? @GeneratedValue:表示主鍵的自增長(zhǎng)策略
? @Column:表示根據(jù)屬性名在表中生成相應(yīng)的字段,如果字段名和屬性名不相同,可以使用name屬性指定
要注意的是用戶(hù)模塊的UserRepository接口,這里暫時(shí)不需要寫(xiě)任何方法,因?yàn)镴paRepository已經(jīng)幫我們實(shí)現(xiàn)了很多常用的方法,如果需要使用特殊的方法可以自定義。
public interface UserRepository extends JpaRepository<User, Integer> { } |
默認(rèn)實(shí)現(xiàn)的方法,如下:
這些方方法,基本滿(mǎn)足了我們?nèi)粘5腃RUD操作,大家可以跟著這個(gè)案例,試一次其他的這些方法
接下來(lái)就可以編寫(xiě)測(cè)試程序進(jìn)行驗(yàn)證,查詢(xún)所有的用戶(hù)信息
@SpringBootTest @RunWith(SpringJUnit4ClassRunner.class) public class DemoApplicationTests { @Autowired private UserRepository userRepository; /** * 查詢(xún)所有用戶(hù) */ @Test public void testSpringDataJpa() { // 調(diào)用findAll方法,查詢(xún)所有用戶(hù) List<User> userList = userRepository.findAll(); for (User user : userList) { System.out.println(user); } }} |
可以看到控制臺(tái)輸入了如下數(shù)據(jù),成功查詢(xún)出了所有的用戶(hù)數(shù)據(jù),到此,大功告成,而我們一個(gè)SQL語(yǔ)句也沒(méi)有寫(xiě)。Spring Data JPA幫我們節(jié)省了很多陪女朋友的時(shí)間,是不是很贊呢,從此以后再也不用擔(dān)心寫(xiě)SQL了。