1. 程式人生 > >Spring Data的JPA詳細學習

Spring Data的JPA詳細學習

  1. jpa是什麼? 1)JPA是Java Persistence API的簡稱,中文名Java持久層API,是JDK 5.0註解或XML描述物件-關係表的對映關係,並將執行期的實體物件持久化到資料庫中。 2)Sun引入新的JPA ORM規範出於兩個原因:其一,簡化現有Java EE和Java SE應用開發工作;其二,Sun希望整合ORM技術,實現天下歸一。

  2. 為什麼要學習JPA? 1)個人認為,首先JPA 是 JCP 組織釋出的 Java EE 標準之一,我們對於JAVA的面向物件能有更加深刻的理解。心中有物件,資料庫表結構就會自動建立。 2)JPA已經作為一項物件持久化的標準,不但可以獲得Java EE應用伺服器的支援,還可以直接在Java SE中使用。開發者將無需在現有多種ORM框架中艱難地選擇。

  3. 開始學習JPA

    首先我使用的是Spring Boot整合JPA+Maven(提示:Spring Boot可以去看我上一期的Spring Boot 學習) 1)首先開始匯入依賴(這裡使用了Spring Data)

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

2)配置application.properties(這裡我使用資原始檔中的 .properties檔案 “基本夠用”,你們可以使用 .yml 檔案)

#datasource
spring.datasource.url=jdbc:mysql://localhost:3306/db_test?useUnicode=true&characterEncoding=UTF8
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=使用者名稱
spring.datasource.password=密碼
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

#jpa
#要操作的目標資料庫,預設自動檢測。也可以通過 databasePlatform 屬性進行設定。
spring.jpa.database=MYSQL

#建表模式( none 、 validate 、 update 、 create 和 create-drop )。
這是 hibernate. hbm2ddl.auto 屬性的一個快捷方式。在使用嵌入式資料庫時,預設為 create-drop , 
其他情況下預設為 none 。
(**提示:這個東西可不能亂弄,上次有個新人就把資料庫的資料全部給更新了,謹慎**)
spring.jpa.hibernate.ddl-auto=update
#顯示SQL(預設值: false 。)
#spring.jpa.showSql = true 或者如下: 
spring.jpa.show-sql=true

#格式化SQL
spring.jpa.properties.hibernate.format_sql=true

#命名規範(必須):Hibernate 命名策略的全限定類名。
spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.ImprovedNamingStrategy

#方言,如果不指定,將根據資料庫型別自動選擇
#spring.jpa.properties.hibernate.dialect = 方言

3)現在開始對類進行配置 1)在啟動類上標註 (1)@EntityScan(“實體類層的包名”)(掃描實體類) (2)@SpringBootApplication (3)@EnableJpaRepositories(“指定dao層”) (4)@EnableTransactionManagement(開啟事物管理)

@EntityScan("")
@SpringBootApplication
@EnableJpaRepositories("")
@EnableTransactionManagement
public class Appliaction {
	public static void main(String[] args) {
		SpringApplication.run(Appliaction.class,args);
	}
}

4)實體類配置(注意:導包時使用 javax 的包) (1)@MappedSuperclass (可以將超類的JPA註解傳遞給子類,使子類能夠繼承超類的JPA註解) (2)@Entity (標註是實體類) (3)@Table (name=“表名”,indexes = @Index (name=“索引名”,columnList=“列名”,unique:是否唯一索引 (true or false)))

@Entity
@Table(name = "user_account", indexes = @Index(name = "idx_user_account", columnList = "account", unique = true))
public class Account extends BaseEntity{
}

5)主鍵的生成策略 (1)@Id (主鍵的策略,具體的我就不一一列舉了)

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)//自增長
	protected Integer id;

(2)@Column

name:表列名,預設為Java實體類屬性名 unique:是否唯一值,如果是,自動建立唯一索引 nullable:是否允許為空,預設是 insertable:是否允許插入,預設是允許 updatable:是否可更新,預設是允許 columnDefinition:根據不同資料庫指定列定義,相當於本地SQL,例如寫欄位註釋 length:欄位長度,預設是255個字元 precision:浮點型別的長度 scale:浮點型別小數點後面的長度,注意 precision包含了這個長度。

(3)@Temporal

時間對映: value:時間型別,詳細選項: TemporalType.DATE 只存日期 TemporalType.TIME 只存時間 TemporalType.TIMESTAMP 包括日期時間

示例:

  @Temporal(TemporalType.TIMESTAMP)
  private Date created; 

(4)@Enumerated

列舉對映: value:對映型別,詳細如下: EnumType.ORDINAL :對映為整型,表裡存的是列舉順序號 EnumType.STRING:對映為字元型,表裡存的是列舉的元素名稱,因此還需要搭配@Column註解標註欄位長度

示例:

資料庫儲存列舉順序:
  @Enumerated(EnumType.ORDINAL)
  private Gender gender;
資料庫儲存列舉名稱:
  @Enumerated(EnumType.STRING)
  @Column(length = 6)
  private Gender gender;

(5)@Lob(大欄位 效率太低了,不建議使用,實在要使用還是分表吧。)

  • 大欄位
    • clob:text/longtext
  • blob:image/ 使用 @Basic(FetchType.LAZY)設定為懶載入

(6)@Transient

臨時欄位,不會對映到資料庫

下期我單獨分享主鍵策略,還有表關係,希望加關注。