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测试用例

原文地址:https://www.cnblogs.com/enhe/p/12141719.html