@[TOC](Spring boot 实战:Spring data Jpa (一))
今天来讲一下讲一下,如何在Spring boot中集成Spring Data Jpa功能。
Maven配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.yml配置
server:
port: 7829
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/lwk?useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
username: lwk
password: 123456
validationQuery: SELECT 1 FROM DUAL
jpa:
database: default
hibernate:
ddl-auto: update
format_sql: true
dialect: storage_engine=innodb
use_sql_comments: true
show-sql: true
Domain配置
- BaseDomain
/*
* www.qwfys.com Inc.
* Copyright (c) 2004- 2019 All Rights Reserved.
*/
package com.qwfys.sample.sb.data.domain;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import javax.persistence.*;
import java.util.Date;
/**
* @author lwk
* @version BaseDomain, v 0.1 5/3/19 2:02 PM lwk
*/
@Data
@MappedSuperclass
public abstract class BaseDomain {
/**
* 每页多少条记录
*/
@Transient
private Integer pageSize;
/**
* 当前页码,页码从0开始
*/
@Transient
private Integer pageNo;
/**
* 起始时间
*/
@Transient
private Date beginTime;
/**
* 结束时间
*/
@Transient
private Date endTime;
/**
* 记录创建者
*/
@Column(nullable = false)
private Integer creator;
/**
* 记录创建时间
*/
@Temporal(TemporalType.TIMESTAMP)
@Column(nullable = false)
private Date createdTime;
/**
* 记录最新修改人
*/
@Column(nullable = false)
private Integer modifier;
/**
* 记录最新修改时间
*/
@Temporal(TemporalType.TIMESTAMP)
@Column(nullable = false)
private Date modifiedTime;
/**
* 是否已经删除,true-代表已经删除,false-代表没有删除,默认为false.
*/
private boolean deleted;
/**
* 备注
*/
private String memo;
}
- StudentDomain
package com.qwfys.sample.sb.data.domain;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import java.util.Date;
/**
* 学生
*
* @author lwk
* @version StudentDomain, v 0.1 6/20/19 8:22 AM lwk
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity(name="student")
public class StudentDomain extends BaseDomain {
@Id
private Integer id;
/**
* 学生姓名
*/
private String name;
/**
* 性别
*/
private boolean gender;
/**
* 出生年月日
*/
@Temporal(TemporalType.TIMESTAMP)
private Date birthday;
}
Table结果
项目启动后控制台输出日志,其中下面这段表示表已经创建成功。
Hibernate: create table student (id integer not null, created_time datetime(6) not null, creator integer not null, deleted bit not null, memo varchar(255), modified_time datetime(6) not null, modifier integer not null, birthday datetime(6), gender bit not null, name varchar(255), primary key (id)) engine=InnoDB
从数据库中,我们可以查看到表已经创建成功,创建表的SQL语句如下所示。
CREATE TABLE `student` (
`id` int(11) NOT NULL,
`created_time` datetime(6) NOT NULL,
`creator` int(11) NOT NULL,
`deleted` bit(1) NOT NULL,
`memo` varchar(255) DEFAULT NULL,
`modified_time` datetime(6) NOT NULL,
`modifier` int(11) NOT NULL,
`birthday` datetime(6) DEFAULT NULL,
`gender` bit(1) NOT NULL,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
小结
1、考虑到很多互联网项目都希望基于外部的ID生成器来生成表的ID,所以这里没有配置表的ID生策略,程序在做持久化的过程中,需要手动设置id值到程序中去。
2、修改人、修改时间两个字段,有的项目团队也会用更新人,更新时间来表达,这样的话,BaseDomain将会被更新为
/*
* www.qwfys.org Inc.
* Copyright (c) 2004- 2019 All Rights Reserved.
*/
package com.qwfys.sample.sb.data.domain;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import javax.persistence.*;
import java.util.Date;
/**
* @author lwk
* @version BaseDomain, v 0.1 5/3/19 2:02 PM lwk
*/
@Data
@MappedSuperclass
public abstract class BaseDomain {
/**
* 每页多少条记录
*/
@Transient
private Integer pageSize;
/**
* 当前页码,页码从0开始
*/
@Transient
private Integer pageNo;
/**
* 起始时间
*/
@Transient
private Date beginTime;
/**
* 结束时间
*/
@Transient
private Date endTime;
/**
* 记录创建者
*/
@Column(nullable = false)
private Integer creator;
/**
* 记录创建时间
*/
@Temporal(TemporalType.TIMESTAMP)
@Column(nullable = false)
private Date createdTime;
/**
* 记录最新修改人
*/
@Column(nullable = false)
private Integer updater;
/**
* 记录最新修改时间
*/
@Temporal(TemporalType.TIMESTAMP)
@Column(nullable = false)
private Date updatedTime;
/**
* 是否已经删除,true-代表已经删除,false-代表没有删除,默认为false.
*/
private boolean deleted;
/**
* 备注
*/
private String memo;
}
系统启动过程中,生成的建表日志如下:
create table student (id integer not null, created_time datetime(6) not null, creator integer not null, deleted bit not null, memo varchar(255), updated_time datetime(6) not null, updater integer not null, birthday datetime(6), gender bit not null, name varchar(255), primary key (id)) engine=InnoDB
这个是时候,我们再次查看数据库,发现表已经被更新过来,下面是从数据库中查到的建表语句
CREATE TABLE `student` (
`id` int(11) NOT NULL,
`created_time` datetime(6) NOT NULL,
`creator` int(11) NOT NULL,
`deleted` bit(1) NOT NULL,
`memo` varchar(255) DEFAULT NULL,
`updated_time` datetime(6) NOT NULL,
`updater` int(11) NOT NULL,
`birthday` datetime(6) DEFAULT NULL,
`gender` bit(1) NOT NULL,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
3、这里的数据库,我们用的是mysql8.0,当然了,大家也可以用mysql 5.7,也是可以的。
4、@Transient代表该字段不希望被持久化,追加了该注解的字段,被会被Jpa忽略掉。
5、@Temporal用于标注日期时间类型,用于告知Jpa希望将该字段映射成日期、时间、还是日期时间撮格式。