Spring boot 实战:Spring data Jpa (一)

知识共享许可协议 版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons

  今天来讲一下讲一下,如何在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希望将该字段映射成日期、时间、还是日期时间撮格式。

猜你喜欢

转载自blog.csdn.net/qwfys200/article/details/92956298