javascript
SpringBoot————JPA快速使用
本篇博客源碼地址:https://github.com/DragonWatcher/ease-run
概述
Hibernate與JPA
本篇博客中的web項(xiàng)目選用Hibernate作為持久層框架。在Spring Boot中,我們需要了解另一個(gè)概念:JPA
上一句話可能有些歧義,并不是說JPA就是Spring Boot中的概念。而是Java Persistence Api,中文譯名為:Java持久層Api。
JPA是一個(gè)基于ORM(或叫O/R mapping ,對(duì)象關(guān)系映射)的標(biāo)準(zhǔn)規(guī)范,在這個(gè)規(guī)范中,JPA只定義標(biāo)準(zhǔn)規(guī)則,不提供實(shí)現(xiàn)。
目前,JPA的主要實(shí)現(xiàn)有Hibernate,EclipseLink,OpenJPA等。
由于Hibernate在數(shù)據(jù)訪問解決技術(shù)領(lǐng)域的霸主地位,所以JPA標(biāo)準(zhǔn)基本由Hibernate主導(dǎo)。
SpringBoot這支自動(dòng)步槍
spring框架中提供Spring Data JPA作為開發(fā)者應(yīng)用Hibernate框架的接口工具。我們的Spring Boot則提供了一款全自動(dòng)的“自動(dòng)依賴模塊”:spring-boot-starter-data-jpa
在start.spring.io頁面中的依賴搜索框中去搜索jpa,即可獲得與jpa相關(guān)的全套服務(wù)。
快速實(shí)現(xiàn)數(shù)據(jù)操作
Pom依賴結(jié)構(gòu)
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId> </dependency>說明:mysql-connector-java提供了mysql驅(qū)動(dòng)等類庫,此處必須引入此依賴,否則將會(huì)提示:
Cannot load driver class: com.mysql.jdbc.Driver等錯(cuò)誤信息。
配置數(shù)據(jù)源信息
官方配置信息可以參考:Appendix A. Common application properties
?應(yīng)用案例如下:
#mysql spring.datasource.url=jdbc:mysql://localhost:3306/ease-run?useunicode=true&characterEncoding=utf8 spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.max-idle=10 spring.datasource.max-wait=10000 spring.datasource.min-idle=5 spring.datasource.initial-size=5 # Specify the DBMS spring.jpa.database = MYSQL # Show or not log for each sql query spring.jpa.show-sql = true # Hibernate ddl auto (create, create-drop, update) spring.jpa.hibernate.ddl-auto = update # Naming strategy spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy # stripped before adding them to the entity manager spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect上述配置信息保存在springboot的application.properties配置文件中。其中url信息的末尾追加了編碼等參數(shù),是為了解決中文數(shù)據(jù)的查詢問題(目前只注意到了查詢的時(shí)候在通過Hibernate的HQL進(jìn)行數(shù)據(jù)查詢時(shí),即便傳入的參數(shù)是正常的中文字符,且數(shù)據(jù)庫中也有對(duì)應(yīng)的中文數(shù)據(jù),在返回時(shí)也會(huì)為null的情況,修改刪除等操作一定也會(huì)出現(xiàn)類似問題)。
spring.jpa.hibernate.naming-strategy是定義HibernateO/R映射字段的命名策略,spring.jpa.properties.hibernate.dialect為Hibernate的數(shù)據(jù)庫方言。另外還有一些其他jpa配置信息,篇幅有限,可查閱jpa(hibernate)架構(gòu)基本配置相關(guān)。
添加啟動(dòng)類注解
@EnableJpaRepositories?
創(chuàng)建實(shí)體類
?
為了避免頻繁書寫部分注解,我們可以通過繼承的方式來書寫實(shí)體類:
基類:
import java.io.Serializable;import javax.persistence.Column; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.MappedSuperclass;@MappedSuperclass public class BaseEntity implements Serializable{@Id@GeneratedValue(strategy = GenerationType.AUTO)protected Long id;@Column(name = "name")protected String name;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;} }子類:
import javax.persistence.Entity; import javax.persistence.Table;@Entity @Table(name = "yyh_user") public class User extends BaseEntity{ }上述兩個(gè)類中,注解@MappedSuperclass和@Entity是必須的。
其中,@MappedSuperclass標(biāo)識(shí)基類,這個(gè)基類不會(huì)以一個(gè)實(shí)體記錄的形式映射到數(shù)據(jù)庫中,但繼承它的子類在映射數(shù)據(jù)庫的時(shí)候會(huì)自動(dòng)掃描該基類實(shí)體的映射屬性,不論是自動(dòng)建表、添加記錄、查詢等操作,都可以雖子類中的屬性一同映射到數(shù)據(jù)庫中。@Entity標(biāo)識(shí)一個(gè)實(shí)體類,任何Hibernate映射對(duì)象都要有這個(gè)注解。
使用方式:
1.@MappedSuperclass注解使用在一個(gè)實(shí)體類父類上,來標(biāo)識(shí)這個(gè)父類。
2.@MappedSuperclass標(biāo)識(shí)的類表示其不能映射到數(shù)據(jù)庫表,因?yàn)槠洳皇且粋€(gè)完整的實(shí)體類,但它所擁有的屬性能夠映射到其子類所在的表中。
3.@MappedSuperclass標(biāo)識(shí)的類不能再有@Entity和@Table注解。
定義數(shù)據(jù)庫操作接口
package com.mht.dao.repository;import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository;import com.mht.dao.entity.User;@Repository public interface UserRepository extends JpaRepository<User, Integer>{public User findById(Long id);public User save(User user);@Query(value = "SELECT u FROM User u WHERE name=:name")public User findName(@Param("name") String name);}數(shù)據(jù)庫操作接口繼承自JpaRepository泛型類,在繼承之時(shí),即獲得了其賜予開發(fā)者的神之力量:
我們可以直接調(diào)用這些方法,進(jìn)行數(shù)據(jù)庫操作,同時(shí)我們也可以通過自定義HQL來完成符合個(gè)性的其他操作,如:
@Query(value = "SELECT u FROM User u WHERE u.name=:name") public User findName(@Param("name") String name);這段代碼中,通過@Query注解,完成了HQL的書寫,其中“:name”與下方的@Param注解中參數(shù)保持一致。
注意:在HQL中的表名應(yīng)該是ORM映射的類名,而且HQL與傳統(tǒng)的SQL語句有一些出入,比如“*”的意義不盡相同等等。
如果不習(xí)慣使用HQL,也可以使用SQL語句:
@Query(value = "SELECT * FROM yyh_user WHERE name=?", nativeQuery = true) public User findName(String name);上述方法,在執(zhí)行時(shí)親測依然奏效,nativeQuery為true代表使用SQL語言。
完成Controller與Service實(shí)現(xiàn)
在Service中添加依賴對(duì)象:
@Autowired private UserRepository userRpy;controller類似,在此不再贅述。
啟動(dòng)項(xiàng)目
Hibernate會(huì)自動(dòng)將實(shí)體類映射到數(shù)據(jù)庫中,為我們建立相關(guān)的數(shù)據(jù)庫表,它會(huì)根據(jù)@Table、@Column、@Id、@GeneratedValue(strategy = GenerationType.AUTO)等注解實(shí)現(xiàn)數(shù)據(jù)庫表的自動(dòng)匹配。省去了大量建表的工作。
hibernate_sequence表是@GeneratedValue注解完成的id生成策略,GenerationType.AUTO代表自動(dòng)生成,前提是id屬性必須是int或者long類型的屬性,如果是String類型的id,那么添加此注解于id之上,會(huì)立即報(bào)錯(cuò)。因此,如果是針對(duì)于String類型的id,則不需要為id添加@GeneratedValue(strategy = GenerationType.AUTO)注解。
請(qǐng)求測試
分別通過get和post來完成數(shù)據(jù)的請(qǐng)求和數(shù)據(jù)的保存。
GET請(qǐng)求:
POST數(shù)據(jù)推送:
先來看一下數(shù)據(jù)庫
推送數(shù)據(jù):
數(shù)據(jù)庫:
GET再查詢:
?
以上就是springboot對(duì)hibernate框架的整合使用,如果喜歡,還望評(píng)論三言兩語!:-)
總結(jié)
以上是生活随笔為你收集整理的SpringBoot————JPA快速使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 教你如何一篇博客读懂设计模式之—--工厂
- 下一篇: Spring Boot —— YAML配