javascript
SpringBoot————JPA快速使用
本篇博客源碼地址:https://github.com/DragonWatcher/ease-run
概述
Hibernate與JPA
本篇博客中的web項目選用Hibernate作為持久層框架。在Spring Boot中,我們需要了解另一個概念:JPA
上一句話可能有些歧義,并不是說JPA就是Spring Boot中的概念。而是Java Persistence Api,中文譯名為:Java持久層Api。
JPA是一個基于ORM(或叫O/R mapping ,對象關系映射)的標準規范,在這個規范中,JPA只定義標準規則,不提供實現。
目前,JPA的主要實現有Hibernate,EclipseLink,OpenJPA等。
由于Hibernate在數據訪問解決技術領域的霸主地位,所以JPA標準基本由Hibernate主導。
SpringBoot這支自動步槍
spring框架中提供Spring Data JPA作為開發者應用Hibernate框架的接口工具。我們的Spring Boot則提供了一款全自動的“自動依賴模塊”:spring-boot-starter-data-jpa
在start.spring.io頁面中的依賴搜索框中去搜索jpa,即可獲得與jpa相關的全套服務。
快速實現數據操作
Pom依賴結構
<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驅動等類庫,此處必須引入此依賴,否則將會提示:
Cannot load driver class: com.mysql.jdbc.Driver等錯誤信息。
配置數據源信息
官方配置信息可以參考:Appendix A. Common application properties
?應用案例如下:
#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信息的末尾追加了編碼等參數,是為了解決中文數據的查詢問題(目前只注意到了查詢的時候在通過Hibernate的HQL進行數據查詢時,即便傳入的參數是正常的中文字符,且數據庫中也有對應的中文數據,在返回時也會為null的情況,修改刪除等操作一定也會出現類似問題)。
spring.jpa.hibernate.naming-strategy是定義HibernateO/R映射字段的命名策略,spring.jpa.properties.hibernate.dialect為Hibernate的數據庫方言。另外還有一些其他jpa配置信息,篇幅有限,可查閱jpa(hibernate)架構基本配置相關。
添加啟動類注解
@EnableJpaRepositories?
創建實體類
?
為了避免頻繁書寫部分注解,我們可以通過繼承的方式來書寫實體類:
基類:
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{ }上述兩個類中,注解@MappedSuperclass和@Entity是必須的。
其中,@MappedSuperclass標識基類,這個基類不會以一個實體記錄的形式映射到數據庫中,但繼承它的子類在映射數據庫的時候會自動掃描該基類實體的映射屬性,不論是自動建表、添加記錄、查詢等操作,都可以雖子類中的屬性一同映射到數據庫中。@Entity標識一個實體類,任何Hibernate映射對象都要有這個注解。
使用方式:
1.@MappedSuperclass注解使用在一個實體類父類上,來標識這個父類。
2.@MappedSuperclass標識的類表示其不能映射到數據庫表,因為其不是一個完整的實體類,但它所擁有的屬性能夠映射到其子類所在的表中。
3.@MappedSuperclass標識的類不能再有@Entity和@Table注解。
定義數據庫操作接口
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);}數據庫操作接口繼承自JpaRepository泛型類,在繼承之時,即獲得了其賜予開發者的神之力量:
我們可以直接調用這些方法,進行數據庫操作,同時我們也可以通過自定義HQL來完成符合個性的其他操作,如:
@Query(value = "SELECT u FROM User u WHERE u.name=:name") public User findName(@Param("name") String name);這段代碼中,通過@Query注解,完成了HQL的書寫,其中“:name”與下方的@Param注解中參數保持一致。
注意:在HQL中的表名應該是ORM映射的類名,而且HQL與傳統的SQL語句有一些出入,比如“*”的意義不盡相同等等。
如果不習慣使用HQL,也可以使用SQL語句:
@Query(value = "SELECT * FROM yyh_user WHERE name=?", nativeQuery = true) public User findName(String name);上述方法,在執行時親測依然奏效,nativeQuery為true代表使用SQL語言。
完成Controller與Service實現
在Service中添加依賴對象:
@Autowired private UserRepository userRpy;controller類似,在此不再贅述。
啟動項目
Hibernate會自動將實體類映射到數據庫中,為我們建立相關的數據庫表,它會根據@Table、@Column、@Id、@GeneratedValue(strategy = GenerationType.AUTO)等注解實現數據庫表的自動匹配。省去了大量建表的工作。
hibernate_sequence表是@GeneratedValue注解完成的id生成策略,GenerationType.AUTO代表自動生成,前提是id屬性必須是int或者long類型的屬性,如果是String類型的id,那么添加此注解于id之上,會立即報錯。因此,如果是針對于String類型的id,則不需要為id添加@GeneratedValue(strategy = GenerationType.AUTO)注解。
請求測試
分別通過get和post來完成數據的請求和數據的保存。
GET請求:
POST數據推送:
先來看一下數據庫
推送數據:
數據庫:
GET再查詢:
?
以上就是springboot對hibernate框架的整合使用,如果喜歡,還望評論三言兩語!:-)
總結
以上是生活随笔為你收集整理的SpringBoot————JPA快速使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 教你如何一篇博客读懂设计模式之—--工厂
- 下一篇: Spring Boot —— YAML配