使用 h2+flyway+druid+jpa 搭建demo

1,610 阅读3分钟

前言

使用h2和flyway快速搭建开发测试环境,自动建表。

1、环境搭建

1、新建springboot项目

2、pom.xml引入如下包:

<?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>

   <groupId>com.leahoop.h2-flyway-demo</groupId>
   <artifactId>h2-flyway-demo</artifactId>
   <version>1.0-SNAPSHOT</version>

   <properties>
       <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
       <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
       <java.version>1.8</java.version>
       <druid.version>1.1.10</druid.version>
       <flyway.version>5.2.4</flyway.version>
   </properties>

   <parent>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-parent</artifactId>
       <version>2.1.3.RELEASE</version>
       <relativePath/>
   </parent>

   <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-starter-test</artifactId>
           <scope>test</scope>
       </dependency>

       <!--lombok插件-->
       <dependency>
           <groupId>org.projectlombok</groupId>
           <artifactId>lombok</artifactId>
           <optional>true</optional>
       </dependency>

       <!--&lt;!&ndash;Mysql依赖包&ndash;&gt;-->
       <!--<dependency>-->
           <!--<groupId>mysql</groupId>-->
           <!--<artifactId>mysql-connector-java</artifactId>-->
           <!--<scope>runtime</scope>-->
       <!--</dependency>-->
       <!--H2依赖包(开发用)-->
       <dependency>
           <groupId>com.h2database</groupId>
           <artifactId>h2</artifactId>
       </dependency>
       <!-- druid数据源驱动 -->
       <dependency>
           <groupId>com.alibaba</groupId>
           <artifactId>druid-spring-boot-starter</artifactId>
           <version>${druid.version}</version>
       </dependency>
       <!-- flywaydb -->
       <dependency>
           <groupId>org.flywaydb</groupId>
           <artifactId>flyway-core</artifactId>
           <version>${flyway.version}</version>
       </dependency>

   </dependencies>

</project>


3、applicaiton.yml 配置文件如下:

server:
 port: 8080

spring:
 jpa:
   generate-ddl: false
   # 输出sql语句
   show-sql: true
   hibernate:
     ddl-auto: none

 datasource:
   url: jdbc:h2:mem:test
   username: sa
   password:
   type: com.alibaba.druid.pool.DruidDataSource    # 使用阿里druid连接池
   druid:
     min-idle: 2
     initial-size: 5
     max-active: 10
     max-wait: 5000
     validation-query: select '1' from dual

 h2:
   console:
     enabled: true
     # 映射h2
     path: /h2

 flyway:
   clean-on-validation-error: true # 仅限开发环境使用
   locations: classpath:/db/migration

4、

  • 在resources下新建db.migration目录,新建文件V1.0.1__first.sql;
  • migration目录下存放sql文件,命名格式为:V大写+序号,中间是两个下划线(__)+命名
SET FOREIGN_KEY_CHECKS = 0;

DROP TABLE IF EXISTS `dept`;
CREATE TABLE `dept` (
 `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`name` varchar(255) NOT NULL COMMENT '名称',
`pid` bigint(20) NOT NULL COMMENT '上级部门',
`create_time` datetime DEFAULT NULL,
`enabled` bit(1) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;

INSERT INTO `dept` VALUES ('1', 'ali', '0', '2019-03-25 09:14:05', '1');

2、代码

项目结构

  • 新建Dept实体
package com.leahoop.domain;

import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.CreationTimestamp;

import javax.persistence.*;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.sql.Timestamp;

@Entity
@Table(name = "dept")
@Data
@NoArgsConstructor
public class Dept implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @Column(name = "name", nullable = false)
    @NotBlank
    private String name;

    @NotNull
    private Boolean enabled;

    @Column(name = "pid", nullable = false)
    @NotNull
    private Long pid;

    @Column(name = "create_time")
    @CreationTimestamp
    private Timestamp createTime;

}
  • 新建repository
package com.leahoop.repository;

import com.leahoop.domain.Dept;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;

import java.util.List;

public interface DeptRepository extends JpaRepository<Dept, Long>, JpaSpecificationExecutor {

    List<Dept> findByPid(Long id);

}

  • 新建Service层
// 接口
package com.leahoop.service;

import com.leahoop.domain.Dept;
import java.util.Optional;

public interface DeptService {
    
    Optional<Dept> findById(Long id);

    void save(Dept dept);
    
}

// 实现

package com.leahoop.service.impl;

import com.leahoop.domain.Dept;
import com.leahoop.repository.DeptRepository;
import com.leahoop.service.DeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Optional;

@Service
public class DeptServiceImpl implements DeptService {

    @Autowired
    private DeptRepository deptRepository;

    @Override
    public Optional<Dept> findById(Long id) {
        return deptRepository.findById(id);
    }

    @Override
    public void save(Dept dept) {
        deptRepository.save(dept);
    }
}

  • 新建controller层
package com.leahoop.controller;

import com.leahoop.domain.Dept;
import com.leahoop.service.DeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping({"api"})
public class Api {

    @Autowired
    private DeptService deptService;

    @GetMapping({"/dept/find"})
    public ResponseEntity getDept(@RequestParam Long id) {
        return new ResponseEntity(deptService.findById(id), HttpStatus.OK);
    }

    @PostMapping({"/dept/save"})
    public ResponseEntity saveDept(@RequestBody Dept dept) {
        deptService.save(dept);
        return new ResponseEntity(HttpStatus.OK);
    }

}

3、测试

  • 接着用postman测试数据

    • 查询数据

  • 新增数据

最后附上完整代码: Github