1. 程式人生 > >SpringBoot(二)——使用Mysql和JPA

SpringBoot(二)——使用Mysql和JPA

之前一篇部落格寫了如何搭建一個簡單的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測試用例