SpringBoot(二)——使用Mysql和JPA
阿新 • • 發佈:2019-01-10
之前一篇部落格寫了如何搭建一個簡單的SpringBoot程式,搭建好了之後,就已經有了一個簡單的WEB程式。不過這是一個沒有資料來源的程式,就相當與一本沒有內容的書,這裡就通過一個簡單的Mysql資料庫和JPA來完成一些基本的CIUD操作。
新增需要的依賴項
<!-- JPA依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId >
</dependency>
<!-- Mysql依賴 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
配置SpringBoot的資料來源和JPA
通過SpringBoot的核心配置檔案,放置在resources根目錄下的application.yml 或application.properties來進行配置。相對來說,application.yml 的樹狀結構看起來層次感更清楚,所以這裡用application.yml 來配置,配置如下。
spring:
datasource:
url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8
username: root
password: "********"
jpa:
database: MYSQL
show-sql: true
#Hibernate ddl auto
hibernate:
ddl-auto: update
naming-strategy: org.hibernate .cfg.ImprovedNamingStrategy
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL5Dialect
- datasource定義了資料來源的連線url、使用者和密碼。
- jpa中定義了有關JPA的配置。ddl-auto設定為update,是使用Hibernate來自動更新表結構,表不存在則自動建表;或在修改表結構後,程式啟動時執行表結構的同步更新。dialect配置Hibernate的資料庫方言,這裡用預設的MySQL5Dialect,也可以根據需要,繼承MySQL5Dialect做一些修改。
實體類
首先建立一些實體類,來與資料庫中的表建立對映關係,假設一個NBA中,有球員、球隊和所處位置三個實體,並且一個球員可以承擔多種位置,則有如下實體類。
/**
* 球員實體類
*/
@Entity
@Table(name = "player")
public class Player implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createdate;
@ManyToOne
@JoinColumn(name = "did")
@JsonBackReference
private Team team;
@ManyToMany(cascade = {}, fetch = FetchType.EAGER)
@JoinTable(name = "player_position",
joinColumns = {@JoinColumn(name = "player_id")},
inverseJoinColumns = {@JoinColumn(name = "position_id")})
private List<Position> positions;
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;
}
public Date getCreatedate() {
return createdate;
}
public void setCreatedate(Date createdate) {
this.createdate = createdate;
}
public Team getTeam() {
return team;
}
public void setTeam(Team team) {
this.team = team;
}
public List<Position> getPositions() {
return positions;
}
public void setPosition(List<Position> positions) {
this.positions = positions;
}
}
/**
* 球隊實體類
*/
@Entity
@Table(name = "team")
public class Team implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private 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;
}
}
/**
* 位置實體類
*/
@Entity
@Table(name = "position")
public class Position implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private 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;
}
}
使用JPA持久化實體
定義一個介面並且繼承於JPA資源庫的JpaRepository介面,同時通過@Repository註解將這個介面也定義為資源庫,使其可以被其他程式引用並且提供資料庫的存取功能。球員實體的Repository介面如下,另外兩個同理。
@Repository
public interface PlayerRepository extends JpaRepository<Player, Long> {
}
這樣,一個大致的配置資料來源和JPA來連線資料庫就完成了,接下來就可以編寫測試用例來驗證一下以上配置的正確性。
JPA測試用例