之前一篇博客写了如何搭建一个简单的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测试用例