基于spring-data-jpa的基本数据结构的代码自动生成

创建springboot项目添加基本依赖

上代码

<?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 https://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.3.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.smz</groupId>
    <artifactId>smz-user-jpa</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>smz-user-jpa</name>
    <description>smz-user-jpa</description>
    <properties>
        <java.version>1.8</java.version>
        <mapstruct.version>1.3.0.Final</mapstruct.version>
        <sonar-maven-plugin.version>3.2</sonar-maven-plugin.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>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.6</version>
            <scope>compile</scope>
        </dependency>
        <!--   mysql驱动     -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.26</version>
        </dependency>
        <!--        工具-->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.10</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.jetbrains</groupId>
            <artifactId>annotations</artifactId>
            <version>RELEASE</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.google.code.findbugs</groupId>
            <artifactId>jsr305</artifactId>
            <version>3.0.2</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.hk2.external</groupId>
            <artifactId>javax.inject</artifactId>
            <version>2.5.0-b42</version>
        </dependency>

        <!--swagger-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.7.0</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.7.0</version>
        </dependency>
        <!--swagger-->
        <!--     mapstruct   -->
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-jdk8</artifactId>
            <version>${mapstruct.version}</version>
        </dependency>
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-processor</artifactId>
            <version>${mapstruct.version}</version>
        </dependency>
        <!--     mapstruct   -->
        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>1.1.0.Final</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>5.4.1.Final</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.6.0</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                            <version>${lombok.version}</version>
                        </path>
                        <path>
                            <groupId>org.mapstruct</groupId>
                            <artifactId>mapstruct-processor</artifactId>
                            <version>${mapstruct.version}</version>
                        </path>
                    </annotationProcessorPaths>
                    <compilerArgs>
                        <compilerArg>-Amapstruct.defaultComponentModel=spring</compilerArg>
                        <compilerArg>-Amapstruct.suppressGeneratorTimestamp=true</compilerArg>
                        <compilerArg>-Amapstruct.suppressGeneratorVersionInfoComment=true</compilerArg>
                    </compilerArgs>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <profiles>
        <profile>
            <!--
                Profile for applying IDE-specific configuration.
                At the moment it only configures MapStruct, which you need when working
                with DTOs.
            -->
            <id>IDE</id>
            <dependencies>
                <dependency>
                    <groupId>org.mapstruct</groupId>
                    <artifactId>mapstruct-processor</artifactId>
                    <version>${mapstruct.version}</version>
                </dependency>
            </dependencies>
        </profile>
    </profiles>

</project>

环境配置文件及数据库连接基本配置

在这里插入图片描述
代码
application.yml

server:
  port: 7080
spring:
  application:
    name: smz-user-jpa
  profiles:
    # The commented value for `active` can be replaced with valid Spring profiles to load.
    # Otherwise, it will be filled in by maven when building the WAR file
    # Either way, it can be overridden by `--spring.profiles.active` value passed in the commandline or `-Dspring.profiles.active` set in `JAVA_OPTS`
    active: dev

application-dev.yml

spring:
  config:
    profiles: dev

    ## 配置数据源
  datasource:
    url: jdbc:mysql://ip:端口/数据库名?createDatabaseIfNotExist=true&serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
    username: 账号
    password: 密码
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    properties:
      hibernate:
        hbm2ddl:
          auto: update  # create每次运行都删除原有表创建新表,update不用每次创建新表
    database-platform: org.hibernate.dialect.MySQL8Dialect
    show-sql: true # 打印SQL语句

application-prod.yml


spring:
  config:
    profiles: prod
  ## 配置数据源
  datasource:
    url: jdbc:mysql://ip:端口/数据库名?createDatabaseIfNotExist=true&serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
    username: 账号
    password: 密码
  jpa:
    properties:
      hibernate:
        hbm2ddl:
          auto: update  # create每次运行都删除原有表创建新表,update不用每次创建新表
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    show-sql: true # 打印SQL语句

注:此处使用环境区分在启动时可配置选择环境
在这里插入图片描述
在这里插入图片描述

启动类配置

package com.smz.smzuserjpa;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.core.env.Environment;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;

import javax.inject.Inject;
import java.net.InetAddress;
import java.net.UnknownHostException;

@SpringBootApplication
// 配置仓库位置
@EnableJpaRepositories(basePackages = "com.smz.smzuserjpa.dal")
// 自动填充或更新实体中的CreateDate、CreatedBy
@EnableJpaAuditing
public class SmzUserJpaApplication {

  private static final Logger log = LoggerFactory.getLogger(SmzUserJpaApplication.class);

  @Inject private Environment env;

  public static void main(String[] args) throws UnknownHostException {
    SpringApplication app = new SpringApplication(SmzUserJpaApplication.class);

    Environment env = app.run(args).getEnvironment();
    log.info(
        "\n----------------------------------------------------------\n\t"
            + "Application '{}' is running! Access URLs:\n\t"
            + "Local: \t\thttp://127.0.0.1:{}\n\t"
            + "Swagger: \t\thttp://127.0.0.1:{}/swagger-ui.html\n\t"
            + "External: \thttp://{}:{}\n----------------------------------------------------------",
        env.getProperty("spring.application.name"),
        env.getProperty("server.port"),
        env.getProperty("server.port"),
        InetAddress.getLocalHost().getHostAddress(),
        env.getProperty("server.port"));

    String configServerStatus = env.getProperty("configserver.status");
    log.info(
        "\n----------------------------------------------------------\n\t"
            + "Config Server: \t{}\n----------------------------------------------------------",
        configServerStatus == null
            ? "Not found or not setup for this application"
            : configServerStatus);
  }
}

创建基础类

DefaultEntity

package com.smz.smzuserjpa.entity.common;

import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import org.hibernate.annotations.GenericGenerator;
import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedBy;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.domain.Auditable;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import javax.persistence.*;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Optional;

/** 基础实体类 */
@Data
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class DefaultEntity implements Auditable<String, String, LocalDateTime>, Serializable {
  @Id
  @GenericGenerator(name = "idGenerator", strategy = "uuid")
  @GeneratedValue(generator = "idGenerator")
  @Column(name = "id", columnDefinition = "char(32) COMMENT '主键,id'")
  private String id;

  // 删除标识 (0 未删除 , 1 已删除 默认为0 不删除)
  public static final int NOT_DELETED_FLAG = 0;
  public static final int DELETED_FLAG = 1;

  @JsonIgnore
  @Column(
      name = "deleted_flag",
      columnDefinition = "tinyint(2) default '0' COMMENT '是否删除:0:未删除,1:删除,默认0'")
  private int deletedFlag = NOT_DELETED_FLAG;

  /** 创建者ID */
  @CreatedBy
  @Column(name = "create_user_id", columnDefinition = "varchar(50) COMMENT '创建者ID'")
  private String createUserId;

  /** 更新者ID */
  @LastModifiedBy
  @Column(name = "update_user_id", columnDefinition = "varchar(50) COMMENT '更新者ID'")
  private String updateUserId;

  /** 创建时间 */
  @CreatedDate
  @Column(name = "create_time", columnDefinition = "timestamp COMMENT '创建时间'")
  private LocalDateTime createTime;

  /** 更新时间 */
  @LastModifiedDate
  @Column(name = "update_time", columnDefinition = "timestamp COMMENT '更新时间'")
  private LocalDateTime updateTime;

  @Override
  public Optional<String> getCreatedBy() {
    return Optional.ofNullable(this.getCreateUserId());
  }

  @Override
  public void setCreatedBy(String createdBy) {
    // 如果传了createUserId,则使用;否则使用token中的userId,即这里的s
    setCreateUserId(StringUtils.isNotBlank(getCreateUserId()) ? getCreateUserId() : createdBy);
  }

  @Override
  public Optional<LocalDateTime> getCreatedDate() {
    return Optional.ofNullable(this.getCreateTime());
  }
  //
  @Override
  public void setCreatedDate(LocalDateTime dateTime) {
    setCreateTime(dateTime);
  }

  @Override
  public void setLastModifiedDate(LocalDateTime lastModifiedDate) {
    setUpdateTime(lastModifiedDate);
  }

  @Override
  public Optional<String> getLastModifiedBy() {
    return Optional.ofNullable(this.getUpdateUserId());
  }

  @Override
  public void setLastModifiedBy(String s) {
    // 如果传了updateUserId,则使用;否则使用token中的userId,即这里的s
    setUpdateUserId(StringUtils.isNotBlank(getUpdateUserId()) ? getUpdateUserId() : s);
  }

  @Override
  public Optional<LocalDateTime> getLastModifiedDate() {
    return Optional.ofNullable(this.getUpdateTime());
  }

  @Override
  public boolean isNew() {
    return StringUtils.isBlank(this.id);
  }
}

DefaultDatabaseRepository

package com.smz.smzuserjpa.dal.common;

import com.smz.smzuserjpa.entity.common.DefaultEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;

public interface DefaultDatabaseRepository<T extends DefaultEntity>
    extends JpaRepository<T, String>, JpaSpecificationExecutor<T> {}

DefaultBo

package com.smz.smzuserjpa.domain.bo.common;

import lombok.Data;

import java.time.LocalDateTime;

/** 基础业务模型 */
@Data
public class DefaultBo {
  private String id;

  /** 创建者ID */
  private String createUserId;

  /** 更新者ID */
  private String updateUserId;

  /** 创建时间 */
  private LocalDateTime createTime;

  /** 更新时间 */
  private LocalDateTime updateTime;
}

DefaultVo

package com.smz.smzuserjpa.domain.vo.common;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

/** 基础业务模型 */
@Data
public class DefaultVo {
  @ApiModelProperty("数据id")
  private String id;

  /** 创建者ID */
  @ApiModelProperty("创建者ID")
  private String createUserId;

  /** 更新者ID */
  @ApiModelProperty("更新者ID")
  private String updateUserId;

  /** 创建时间 */
  @ApiModelProperty("创建时间")
  private String createTime;

  /** 更新时间 */
  @ApiModelProperty("更新时间")
  private String updateTime;
}

DefaultModelService

package com.smz.smzuserjpa.service.common;

import com.smz.smzuserjpa.dal.common.DefaultDatabaseRepository;
import com.smz.smzuserjpa.entity.common.DefaultEntity;
import com.smz.smzuserjpa.service.mapper.common.DefaultMapper;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;

import java.util.List;
import java.util.Optional;

public abstract class DefaultModelService<BO, E extends DefaultEntity> {

  //    protected DataRenovatorSupport dataRenovatorSupport;

  public DefaultModelService() {}

  protected abstract <T extends DefaultDatabaseRepository<E>> T getDatabaseRepository();

  protected abstract <T extends DefaultMapper<BO, E>> T getBeanMapper();

  public Optional<BO> findOne(String id) {
    return this.getDatabaseRepository()
        .findOne((root, query, builder) -> builder.equal(root.get("id"), id))
        .map(entity -> this.getBeanMapper().entity2bo(entity));
  }

  public Optional<BO> findOne(Specification<E> var1) {
    return this.getDatabaseRepository()
        .findOne(var1)
        .map(entity -> this.getBeanMapper().entity2bo(entity));
  }

  public Page<E> findAll(Specification<E> var1, Pageable var2) {
    return this.getDatabaseRepository().findAll(var1, var2);
  }

  public List<BO> findAll(Specification<E> var1, Sort sort) {
    return this.getBeanMapper().entities2bos(this.getDatabaseRepository().findAll(var1, sort));
  }

  public List<BO> findAll(Specification<E> var1) {
    return this.getBeanMapper().entities2bos(this.getDatabaseRepository().findAll(var1));
  }

  public BO insert(BO bo) {
    E entity = this.getBeanMapper().bo2entity(bo);
    entity = this.getDatabaseRepository().save(entity);
    bo = this.getBeanMapper().entity2bo(entity);
    return bo;
  }

  public void delete(String id) {
    this.getDatabaseRepository()
        .findOne((root, query, builder) -> builder.equal(root.get("id"), id))
        .map(
            e -> {
              e.setDeletedFlag(1);
              return this.getDatabaseRepository().save(e);
            });
  }

  public List<BO> batchInsert(List<BO> dtos) {
    List<E> entities = this.getBeanMapper().bos2entities(dtos);
    entities = this.getDatabaseRepository().saveAll(entities);
    dtos = this.getBeanMapper().entities2bos(entities);
    return dtos;
  }

  public BO update(BO bo) {
    E entity = this.getBeanMapper().bo2entity(bo);
    entity = this.getDatabaseRepository().save(entity);
    bo = this.getBeanMapper().entity2bo(entity);
    return bo;
  }
}

DefaultMapper

package com.smz.smzuserjpa.service.mapper.common;

import java.util.List;

public interface DefaultMapper<BO, E> {
  E bo2entity(BO bo);

  BO entity2bo(E e);

  List<BO> entities2bos(List<E> var1);

  List<E> bos2entities(List<BO> var1);
}

BO2VOMapper

package com.smz.smzuserjpa.web.mapper.common;

import java.util.List;

public interface BO2VOMapper<BO, VO> {
  VO bo2vo(BO bo);

  List<VO> bo2vo(List<BO> bo);
}

DefaultWebMapper

package com.smz.smzuserjpa.web.mapper.common;

public interface DefaultWebMapper<FO, BO, VO, Entity>
    extends FO2BOMapper<FO, BO>, BO2VOMapper<BO, VO>, Entity2VOMapper<Entity, VO> {}

Entity2VOMapper

package com.smz.smzuserjpa.web.mapper.common;

import java.util.List;

public interface Entity2VOMapper<Entity, VO> {
  VO entity2vo(Entity bo);

  List<VO> entitys2vos(List<Entity> bo);
}

FO2BOMapper

package com.smz.smzuserjpa.web.mapper.common;

public interface FO2BOMapper<FO, BO> {
  BO fo2bo(FO fo);
}

配置数据库与实体类字段映射处理

没有会导致反序列化异常
Jsr310JpaConverters

package com.smz.smzuserjpa.config;
// 参考 Jsr310JpaConverters

import org.springframework.data.convert.Jsr310Converters.*;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;

import javax.annotation.Nullable;
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
import java.time.*;
import java.util.Date;

/**
 * JPA 2.1 converters to turn JSR-310 types into legacy {@link Date}s. To activate these converters
 * make sure your persistence provider detects them by including this class in the list of mapped
 * classes. In Spring environments, you can simply register the package of this class (i.e. {@code
 * org.springframework.data.jpa.convert.threeten}) as package to be scanned on e.g. the {@link
 * LocalContainerEntityManagerFactoryBean}.
 *
 * @author Oliver Gierke
 * @author Kevin Peters
 */
public class Jsr310JpaConverters {

  @Converter(autoApply = true)
  public static class LocalDateConverter implements AttributeConverter<LocalDate, Date> {

    @Nullable
    @Override
    public Date convertToDatabaseColumn(LocalDate date) {
      return date == null ? null : LocalDateToDateConverter.INSTANCE.convert(date);
    }

    @Nullable
    @Override
    public LocalDate convertToEntityAttribute(Date date) {
      return date == null ? null : DateToLocalDateConverter.INSTANCE.convert(date);
    }
  }

  @Converter(autoApply = true)
  public static class LocalTimeConverter implements AttributeConverter<LocalTime, Date> {

    @Nullable
    @Override
    public Date convertToDatabaseColumn(LocalTime time) {
      return time == null ? null : LocalTimeToDateConverter.INSTANCE.convert(time);
    }

    @Nullable
    @Override
    public LocalTime convertToEntityAttribute(Date date) {
      return date == null ? null : DateToLocalTimeConverter.INSTANCE.convert(date);
    }
  }

  @Converter(autoApply = true)
  public static class LocalDateTimeConverter implements AttributeConverter<LocalDateTime, Date> {

    @Nullable
    @Override
    public Date convertToDatabaseColumn(LocalDateTime date) {
      return date == null ? null : LocalDateTimeToDateConverter.INSTANCE.convert(date);
    }

    @Nullable
    @Override
    public LocalDateTime convertToEntityAttribute(Date date) {
      return date == null ? null : DateToLocalDateTimeConverter.INSTANCE.convert(date);
    }
  }

  @Converter(autoApply = true)
  public static class InstantConverter implements AttributeConverter<Instant, Date> {

    @Nullable
    @Override
    public Date convertToDatabaseColumn(Instant instant) {
      return instant == null ? null : InstantToDateConverter.INSTANCE.convert(instant);
    }

    @Nullable
    @Override
    public Instant convertToEntityAttribute(Date date) {
      return date == null ? null : DateToInstantConverter.INSTANCE.convert(date);
    }
  }

  @Converter(autoApply = true)
  public static class ZoneIdConverter implements AttributeConverter<ZoneId, String> {

    @Nullable
    @Override
    public String convertToDatabaseColumn(ZoneId zoneId) {
      return zoneId == null ? null : ZoneIdToStringConverter.INSTANCE.convert(zoneId);
    }

    @Nullable
    @Override
    public ZoneId convertToEntityAttribute(String zoneId) {
      return zoneId == null ? null : StringToZoneIdConverter.INSTANCE.convert(zoneId);
    }
  }
}

配置swagger

package com.smz.smzuserjpa.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2
public class SwaggerConfig {

  /**
   * 创建API应用 apiInfo() 增加API相关信息 通过select()函数返回一个ApiSelectorBuilder实例,用来控制哪些接口暴露给Swagger来展现,
   * 本例采用指定扫描的包路径来定义指定要建立API的目录。
   *
   * @return
   */
  @Bean
  public Docket restApi() {
    return new Docket(DocumentationType.SWAGGER_2)
        .groupName("标准接口")
        .apiInfo(apiInfo("Spring Boot中使用Swagger2构建RESTful APIs", "1.0"))
        .useDefaultResponseMessages(true)
        .forCodeGeneration(false)
        .select()
        .apis(RequestHandlerSelectors.basePackage("com.smz.smzuserjpa.web.rest"))
        .paths(PathSelectors.any())
        .build();
  }

  /**
   * 创建该API的基本信息(这些基本信息会展现在文档页面中) 访问地址:http://ip:port/swagger-ui.html
   *
   * @return
   */
  private ApiInfo apiInfo(String title, String version) {
    return new ApiInfoBuilder()
        .title(title)
        .description("更多请关注: https://blog.csdn.net/qq_45000856")
        .termsOfServiceUrl("https://blog.csdn.net/qq_45000856")
        .contact(new Contact("smz", "https://blog.csdn.net/qq_45000856", "sun_ming_ze163@163.com"))
        .version(version)
        .build();
  }
}

时间转换工具类

DateFormatUtil

package com.smz.smzuserjpa.utils;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;

/**
 * @author: smz
 * @date: Created in 10:14 2023/2/24
 * @description: 时间格式转换类
 */
@Slf4j
public class DateFormatUtil {
 
  /**
   * 格式日期
   *
   * @param localDate
   * @param format
   * @return
   */
  public static String formatDate(LocalDate localDate, String format) {
    if (Objects.isNull(localDate)) {
      return null;
    }
    DateTimeFormatter fa = DateTimeFormatter.ofPattern(format);
    return localDate.format(fa);
  }

  public static String formatDateTime(LocalDateTime localDateTime, String format) {
    if (Objects.isNull(localDateTime)) {
      return null;
    }
    DateTimeFormatter fa = DateTimeFormatter.ofPattern(format);
    return localDateTime.format(fa);
  }
  /**
   * 格式日期
   *
   * @param date
   * @return
   */
  public static LocalDate formatDate(String date, String format) {
    if (StringUtils.isBlank(date)) {
      return null;
    }
    LocalDate parse = null;
    try {
      parse = LocalDate.parse(date, DateTimeFormatter.ofPattern(format));
    } catch (Exception e) {
      log.error("时间格式化异常={}", e.getMessage());
    }
    return parse;
  }
  /**
   * 格式日期
   *
   * @param dateTime
   * @return
   */
  public static LocalDateTime formatDateTime(String dateTime, String format) {
    if (StringUtils.isBlank(dateTime)) {
      return null;
    }
    LocalDateTime parse = null;
    try {
      parse = LocalDateTime.parse(dateTime, DateTimeFormatter.ofPattern(format));
    } catch (Exception e) {
      log.error("时间格式化异常={}", e.getMessage());
    }
    return parse;
  }
  /**
   * 格式日期
   *
   * @param dateTime
   * @return
   */
  public static LocalDateTime formatDateTime(String dateTime) {
    if (StringUtils.isBlank(dateTime)) {
      return null;
    }
    LocalDateTime parse = null;
    try {
      parse = LocalDateTime.parse(dateTime);
    } catch (Exception e) {
      log.error("时间格式化异常={}", e.getMessage());
    }
    return parse;
  }

  public static String formatDateTimeToString(String dateTime, String oldFormat, String newFormat) {

    return DateFormatUtil.formatDateTime(formatDateTime(dateTime, oldFormat), newFormat);
  }

  public static String formatDateToString(String date, String oldFormat, String newFormat) {

    return DateFormatUtil.formatDate(formatDate(date, oldFormat), newFormat);
  }
}

分页实用工具

package com.smz.smzuserjpa.utils;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.http.HttpHeaders;
import org.springframework.web.util.UriComponentsBuilder;

/**
 * Utility class for handling pagination.
 *
 * <p>Pagination uses the same principles as the <a
 * href="https://developer.github.com/v3/#pagination">Github API</a>, and follow <a
 * href="http://tools.ietf.org/html/rfc5988">RFC 5988 (Link header)</a>. *
 * Pagination:{"totalNumber":1541,"page":0,"totalPages":78,"size":20,"next":"/api/report/dashidai?page=1&size=20","hasNext":true,"prev":null,"hasPrev":false,"last":"/api/report/dashidai?page=77&size=20","first":"/api/report/dashidai?page=0&size=20"}
 */

/**
 * Utility class for handling pagination.
 *
 * <p>Pagination uses the same principles as the <a
 * href="https://developer.github.com/v3/#pagination">Github API</a>, and follow <a
 * href="http://tools.ietf.org/html/rfc5988">RFC 5988 (Link header)</a>.
 */
public final class PaginationUtil {
  public static final ObjectMapper PAGINATION_OBJECT_MAPPER = new ObjectMapper();

  private PaginationUtil() {}

  public static HttpHeaders generatePaginationHttpHeaders(Page page, String baseUrl) {
    Pagination pagination = new Pagination(page);
    return generatePaginationHttpHeaders(pagination, baseUrl);
  }

  public static HttpHeaders generatePaginationHttpHeaders(Pagination paging, String baseUrl) {
    HttpHeaders headers = new HttpHeaders();
    Pagination pagination = new Pagination(paging);
    if (paging.getCurrentPage() + 1 < paging.getTotalPages()) {
      pagination.setNext(generateUri(baseUrl, paging.getCurrentPage() + 1, paging.getSize()));
    } else {
      pagination.setHasNext(false);
    }

    if (paging.getCurrentPage() > 0) {
      pagination.setPrev(generateUri(baseUrl, paging.getCurrentPage() - 1, paging.getSize()));
    } else {
      pagination.setHasPrev(false);
    }

    int lastPage = 0;
    if (paging.getTotalPages() > 0) {
      lastPage = paging.getTotalPages() - 1;
    }

    pagination.setLast(generateUri(baseUrl, lastPage, paging.getSize()));
    pagination.setFirst(generateUri(baseUrl, 0, paging.getSize()));

    try {
      headers.add("Pagination", PAGINATION_OBJECT_MAPPER.writeValueAsString(pagination));
      return headers;
    } catch (Exception var6) {
      throw new RuntimeException(var6);
    }
  }

  public static Pageable getDefaultSortForOrders(Pageable pageable, Sort.Order... orders) {
    if (pageable.getSort() == null) {
      Sort sort = Sort.by(orders);
      return PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), sort);
    } else {
      return pageable;
    }
  }

  private static String generateUri(String baseUrl, int page, int size) {
    return UriComponentsBuilder.fromUriString(baseUrl)
        .queryParam("page", new Object[] {Integer.valueOf(page)})
        .queryParam("size", new Object[] {Integer.valueOf(size)})
        .toUriString();
  }

  static class Pagination {
    private long totalNumber;
    private int currentPage;
    private int totalPages;
    private int size;
    private String next;
    private boolean hasNext = true;
    private String prev;
    private boolean hasPrev = true;
    private String last;
    private String first;

    public Pagination() {}

    public Pagination(Page page) {
      this.totalNumber = page.getTotalElements();
      this.currentPage = page.getNumber();
      this.size = page.getSize();
      this.totalPages = page.getTotalPages();
    }

    public Pagination(Pagination paging) {
      this.totalNumber = paging.getTotalNumber();
      this.currentPage = paging.getCurrentPage();
      this.size = paging.getSize();
      this.totalPages = paging.getTotalPages();
    }

    public String getNext() {
      return this.next;
    }

    public void setNext(String next) {
      this.next = next;
    }

    public String getPrev() {
      return this.prev;
    }

    public void setPrev(String prev) {
      this.prev = prev;
    }

    public String getLast() {
      return this.last;
    }

    public void setLast(String last) {
      this.last = last;
    }

    public String getFirst() {
      return this.first;
    }

    public void setFirst(String first) {
      this.first = first;
    }

    public long getTotalNumber() {
      return this.totalNumber;
    }

    public int getCurrentPage() {
      return this.currentPage;
    }

    public int getTotalPages() {
      return this.totalPages;
    }

    public int getSize() {
      return this.size;
    }

    public boolean isHasNext() {
      return this.hasNext;
    }

    public void setHasNext(boolean hasNext) {
      this.hasNext = hasNext;
    }

    public boolean isHasPrev() {
      return this.hasPrev;
    }

    public void setHasPrev(boolean hasPrev) {
      this.hasPrev = hasPrev;
    }

    public Pagination setTotalNumber(long totalNumber) {
      this.totalNumber = totalNumber;
      return this;
    }

    public Pagination setCurrentPage(int currentPage) {
      this.currentPage = currentPage;
      return this;
    }

    public Pagination setTotalPages(int totalPages) {
      this.totalPages = totalPages;
      return this;
    }

    public Pagination setSize(int size) {
      this.size = size;
      return this;
    }
  }
}

创建实体类entity

TestDemo

package com.smz.smzuserjpa.entity;

import com.smz.smzuserjpa.entity.common.DefaultEntity;
import lombok.Data;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;

@Data
@Entity
@Table(name = "test_demo")
public class TestDemo extends DefaultEntity {
  @Column(name = "user_name", columnDefinition = "varchar(50) COMMENT '用户名'")
  private String userName;

  @Column(name = "phone_number", columnDefinition = "varchar(50) COMMENT '用户手机号'")
  private String phoneNumber;

  @Column(name = "user_password", columnDefinition = "varchar(50) COMMENT '用户密码'")
  private String userPassword;

  @Column(
      name = "account_status",
      columnDefinition = "tinyint(2) default '0' COMMENT '账号状态:0:正常,1:禁用,默认0'")
  private int accountStatus;
}

代码自动生成工具类

CodeAutomation

package com.smz.smzuserjpa.utils;

import com.smz.smzuserjpa.entity.TestDemo;
import org.apache.commons.lang3.StringUtils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.stream.Collectors;

public class CodeAutomation {

  public static void main(String[] args) {
    generateAllBeans(TestDemo.class, "com.smz.smzuserjpa", "测试");
  }
  /** 时间格式化 */
  private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
  /** 预设目录 */
  private static String[] dirs = {
    "/dal",
    "/domain/bo",
    "/domain/fo",
    "/domain/query",
    "/domain/vo",
    "/service/impl",
    "/service/mapper",
    "/web/mapper",
    "/web/rest"
  };
  /** 自动创建不存在的目录 */
  private static void initDir(String basePackage) {
    for (String dir : dirs) {
      String path =
          System.getProperty("user.dir")
              + "/src/main/java/"
              + getBasePathByPackage(basePackage)
              + dir;
      File f = new File(path);
      if (!f.exists()) {
        f.mkdir();
      }
    }
  }

  /**
   * 替换@Column2fovoentity
   *
   * @param split
   * @return
   */
  private static String getBasePathByPackage2FVQ(String[] split) {

    return Arrays.stream(split)
        .filter(f -> StringUtils.isNotBlank(f))
        .map(
            e -> {
              String substring = e.substring(e.indexOf("COMMENT '"));
              String replaceAll =
                  substring.replaceAll("COMMENT '", "@ApiModelProperty(\"").replaceAll("'\"", "\"");
              return replaceAll;
            })
        .collect(Collectors.toList())
        .toString()
        .replaceAll("\\[", "")
        .replaceAll(",", "")
        .replaceAll("\\]", "");
  }
  /**
   * 替换@Column2bo
   *
   * @param split
   * @return
   */
  private static String getBasePathByPackage2Bo(String[] split) {
    return Arrays.stream(split)
        .filter(f -> StringUtils.isNotBlank(f))
        .map(
            e -> {
              String substring = e.substring(e.indexOf("COMMENT '"));
              String replaceAll =
                  substring.replaceAll("COMMENT '", "/** ").replaceAll("'\"\\)", " */");
              return replaceAll;
            })
        .collect(Collectors.toList())
        .toString()
        .replaceAll("\\[", "")
        .replaceAll(",", "")
        .replaceAll("\\]", "");
  }

  /**
   * 替换点
   *
   * @param basePackage
   * @return
   */
  private static String getBasePathByPackage(String basePackage) {
    return basePackage.replaceAll("\\.", "/");
  }

  private static String getClassPath(Class clazz) {
    return System.getProperty("user.dir")
        + "/src/main/java/"
        + getBasePathByPackage(clazz.getName().replace(".java", ""))
        + ".java";
  }
  /**
   * * 把第一个字母变为小写<br>
   * * 如:<br>
   * * <code>str = "UserDao";</code><br>
   * * <code>return "userDao";</code> 168 * @param str 169 * @return 170
   */
  private static String getLowercaseChar(String str) {
    return str.substring(0, 1).toLowerCase() + str.substring(1);
  }
  /**
   * 显示信息
   *
   * @param info
   */
  private static void showInfo(String info) {
    System.out.println("创建文件:【" + info + "】成功!");
  }
  /**
   * 获取系统时间
   *
   * @return
   */
  public static String getDate() {

    return simpleDateFormat.format(new Date());
  }
  /**
   * 获取entity类中的属性
   *
   * @param entity
   * @return
   */
  private static String getEntityProperties(Class entity) {
    File entityFile = new File(getClassPath(entity));
    StringBuffer sb = new StringBuffer();
    FileInputStream fis = null;
    try {
      fis = new FileInputStream(entityFile);
      byte[] bytes = new byte[512];
      int len = 0; // 每次读取到的数据的长度
      while ((len = fis.read(bytes)) != -1) { // len值为-1时,表示没有数据了
        // append方法往sb对象里面添加数据
        sb.append(new String(bytes, 0, len, "utf-8"));
      }
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      try {
        fis.close();
      } catch (IOException e) {
        System.out.println("关闭流失败");
      }
    }
    String s = sb.toString();
    return s.substring(s.indexOf("{") + 1, s.indexOf("}"));
  }
  /**
   * 生成 Repository类
   *
   * @param clazz User
   * @param basePackage com.demo.test -> com.demo.test.dal.UserRepository.java
   * @throws Exception
   */
  private static void generateRepository(Class clazz, String basePackage) throws Exception {
    String fileName =
        System.getProperty("user.dir")
            + "/src/main/java/"
            + getBasePathByPackage(basePackage)
            + "/dal/"
            + clazz.getSimpleName()
            + "Repository.java"; // 如:UserDao
    File f = new File(fileName);
    FileWriter fw = new FileWriter(f);
    fw.write(
        "package "
            + basePackage
            + ".dal;\n"
            + "\n"
            + "import "
            + basePackage
            + ".dal.common.DefaultDatabaseRepository;\n"
            + "import "
            + basePackage
            + ".entity."
            + clazz.getSimpleName()
            + ";\n"
            + "import org.springframework.stereotype.Repository;\n"
            + "\n"
            + "/**\n"
            + " * @Author 自动 @Date "
            + getDate()
            + "\n"
            + " */"
            + "@Repository\n"
            + "public interface "
            + clazz.getSimpleName()
            + "Repository extends DefaultDatabaseRepository<"
            + clazz.getSimpleName()
            + "> {}");
    fw.flush();
    fw.close();
    showInfo(fileName);
  }
  /**
   * 生成 BO 类
   *
   * @param clazz User
   * @param basePackage com.demo.test -> com.demo.test.domain.bo.UserBo.java
   * @throws Exception
   */
  private static void generateBo(Class clazz, String basePackage) throws Exception {
    String fileName =
        System.getProperty("user.dir")
            + "/src/main/java/"
            + getBasePathByPackage(basePackage)
            + "/domain/bo/"
            + clazz.getSimpleName()
            + "Bo.java"; // 如:UserBo
    File f = new File(fileName);
    FileWriter fw = new FileWriter(f);
    fw.write(
        "package "
            + basePackage
            + ".domain.bo;\n"
            + "\n"
            + "import "
            + basePackage
            + ".domain.bo.common.DefaultBo;\n"
            + "import lombok.Data;\n"
            + "\n"
            + "/**\n"
            + " * @Author 自动 @Date "
            + getDate()
            + "\n"
            + " */"
            + "@Data\n"
            + "public class "
            + clazz.getSimpleName()
            + "Bo extends DefaultBo {\n"
            + getBasePathByPackage2Bo(
                getEntityProperties(clazz).trim().split("@Column")) // 获取entity中的属性,并复制到到Bo中
            + "}");
    fw.flush();
    fw.close();
    showInfo(fileName);
  }
  /**
   * 生成 FO 类
   *
   * @param clazz User
   * @param basePackage com.demo.test -> com.demo.test.domain.fo.UserFo.java
   * @throws Exception
   */
  private static void generateFo(Class clazz, String basePackage, String cnName) throws Exception {
    String fileName =
        System.getProperty("user.dir")
            + "/src/main/java/"
            + getBasePathByPackage(basePackage)
            + "/domain/fo/"
            + clazz.getSimpleName()
            + "Fo.java"; // 如:UserBo
    File f = new File(fileName);
    FileWriter fw = new FileWriter(f);
    fw.write(
        "package "
            + basePackage
            + ".domain.fo;\n"
            + "\n"
            + "import io.swagger.annotations.ApiModel;\n"
            + "import io.swagger.annotations.ApiModelProperty;\n"
            + "import lombok.Data;\n"
            + "\n"
            + "/**\n"
            + " * @Author 自动 @Date "
            + getDate()
            + "\n"
            + " */\n"
            + "@ApiModel(\""
            + cnName
            + "入参模型\")\n"
            + "@Data\n"
            + "public class "
            + clazz.getSimpleName()
            + "Fo{\n"
            + getBasePathByPackage2FVQ(
                getEntityProperties(clazz).trim().split("@Column")) // 获取entity中的属性,并复制到到fo中
            + "}");
    fw.flush();
    fw.close();
    showInfo(fileName);
  }
  /**
   * 生成 VO 类
   *
   * @param clazz User
   * @param basePackage com.demo.test -> com.demo.test.domain.vo.UserVo.java
   * @throws Exception
   */
  private static void generateVO(Class clazz, String basePackage, String cnName) throws Exception {
    String fileName =
        System.getProperty("user.dir")
            + "/src/main/java/"
            + getBasePathByPackage(basePackage)
            + "/domain/vo/"
            + clazz.getSimpleName()
            + "Vo.java"; // 如:UserBo
    File f = new File(fileName);
    FileWriter fw = new FileWriter(f);
    fw.write(
        "package "
            + basePackage
            + ".domain.vo;\n"
            + "import "
            + basePackage
            + ".domain.vo.common.DefaultVo;\n"
            + "import io.swagger.annotations.ApiModel;\n"
            + "import io.swagger.annotations.ApiModelProperty;\n"
            + "import lombok.Data;\n"
            + "\n"
            + "/**\n"
            + " * @Author 自动 @Date "
            + getDate()
            + "\n"
            + " */\n"
            + "@ApiModel(\""
            + cnName
            + "出参模型\")\n"
            + "@Data\n"
            + "public class "
            + clazz.getSimpleName()
            + "Vo extends DefaultVo {\n"
            + getBasePathByPackage2FVQ(
                getEntityProperties(clazz).trim().split("@Column")) // 获取entity中的属性,并复制到到Vo中
            + "}");
    fw.flush();
    fw.close();
    showInfo(fileName);
  }
  /**
   * 生成 Query 类
   *
   * @param clazz User
   * @param basePackage com.demo.test -> com.demo.test.domain.bo.UserQuery.java
   * @throws Exception
   */
  private static void generateQuery(Class clazz, String basePackage, String cnName)
      throws Exception {
    String fileName =
        System.getProperty("user.dir")
            + "/src/main/java/"
            + getBasePathByPackage(basePackage)
            + "/domain/query/"
            + clazz.getSimpleName()
            + "Query.java"; // 如:UserBo
    File f = new File(fileName);
    FileWriter fw = new FileWriter(f);
    fw.write(
        "package "
            + basePackage
            + ".domain.query;\n"
            + "\n"
            + "import io.swagger.annotations.ApiModel;\n"
            + "import io.swagger.annotations.ApiModelProperty;\n"
            + "import lombok.Data;\n"
            + "\n"
            + "/**\n"
            + " * @Author 自动 @Date "
            + getDate()
            + "\n"
            + " */\n"
            + "@ApiModel(\""
            + cnName
            + "查询模型\")\n"
            + "@Data\n"
            + "public class "
            + clazz.getSimpleName()
            + "Query {\n"
            + " /** 数据id */\n"
            + "  @ApiModelProperty(\"数据id\")\n"
            + "  private String id;\n"
            + "\n"
            + getBasePathByPackage2FVQ(
                getEntityProperties(clazz).trim().split("@Column")) // 获取entity中的属性,并复制到到Query中
            + "\n"
            + "  @ApiModelProperty(\"创建者ID\")\n"
            + "  private String createUserId;\n"
            + "\n"
            + "  @ApiModelProperty(\"更新者ID\")\n"
            + "  private String updateUserId;\n"
            + "\n"
            + "  @ApiModelProperty(\"创建时间开始\")\n"
            + "  private String startCreateTime;\n"
            + "\n"
            + "  @ApiModelProperty(\"创建时间结束\")\n"
            + "  private String endCreateTime;\n"
            + "\n"
            + "  @ApiModelProperty(\"更新时间开始\")\n"
            + "  private String startUpdateTime;\n"
            + "\n"
            + "  @ApiModelProperty(\"更新时间结束\")\n"
            + "  private String endUpdateTime;"
            + "}");
    fw.flush();
    fw.close();
    showInfo(fileName);
  }
  /**
   * 生成Bo和entity的mapper类
   *
   * @param clazz User
   * @param basePackage com.demo.test -> com.demo.test.mapper.UserMapper.java
   * @throws Exception
   */
  private static void generateServiceMapper(Class clazz, String basePackage) throws Exception {
    String fileName =
        System.getProperty("user.dir")
            + "/src/main/java/"
            + getBasePathByPackage(basePackage)
            + "/service/mapper/"
            + clazz.getSimpleName()
            + "Mapper.java"; // 如:UserTransform
    File f = new File(fileName);
    FileWriter fw = new FileWriter(f);
    fw.write(
        "package "
            + basePackage
            + ".service.mapper;\n"
            + "\n"
            + "import "
            + basePackage
            + ".domain.bo."
            + clazz.getSimpleName()
            + "Bo;\n"
            + "import "
            + basePackage
            + ".entity."
            + clazz.getSimpleName()
            + ";\n"
            + "import "
            + basePackage
            + ".service.mapper.common.DefaultMapper;\n"
            + "import lombok.extern.slf4j.Slf4j;\n"
            + "import org.mapstruct.Mapper;\n"
            + "\n"
            + "/**\n"
            + " * @Author 自动 @Date "
            + getDate()
            + "\n"
            + " */"
            + "@Slf4j\n"
            + "@Mapper(componentModel = \"spring\")\n"
            + "public abstract class "
            + clazz.getSimpleName()
            + "Mapper implements DefaultMapper<"
            + clazz.getSimpleName()
            + "Bo, "
            + clazz.getSimpleName()
            + "> {}");
    fw.flush();
    fw.close();
    showInfo(fileName);
  }
  /**
   * 生成web mapper类
   *
   * @param clazz User
   * @param basePackage com.demo.test -> com.demo.test.mapper.UserWebMapper.java
   * @throws Exception
   */
  private static void generateWebMapper(Class clazz, String basePackage) throws Exception {
    String fileName =
        System.getProperty("user.dir")
            + "/src/main/java/"
            + getBasePathByPackage(basePackage)
            + "/web/mapper/"
            + clazz.getSimpleName()
            + "WebMapper.java"; // 如:UserMapper
    File f = new File(fileName);
    FileWriter fw = new FileWriter(f);
    fw.write(
        "package "
            + basePackage
            + ".web.mapper;\n"
            + "\n"
            + "import "
            + basePackage
            + ".domain.bo."
            + clazz.getSimpleName()
            + "Bo;\n"
            + "import "
            + basePackage
            + ".domain.fo."
            + clazz.getSimpleName()
            + "Fo;\n"
            + "import "
            + basePackage
            + ".domain.vo."
            + clazz.getSimpleName()
            + "Vo;\n"
            + "import "
            + basePackage
            + ".entity."
            + clazz.getSimpleName()
            + ";\n"
            + "import "
            + basePackage
            + ".web.mapper.common.DefaultWebMapper;\n"
            + "import lombok.extern.slf4j.Slf4j;\n"
            + "import org.mapstruct.Mapper;\n"
            + "import org.mapstruct.Mapping;\n"
            + "import org.springframework.stereotype.Repository;\n"
            + "\n"
            + "/**\n"
            + " * @Author 自动 @Date "
            + getDate()
            + "\n"
            + " */"
            + "@Slf4j\n"
            + "@Repository\n"
            + "@Mapper(componentModel = \"spring\")\n"
            + "public abstract class "
            + clazz.getSimpleName()
            + "WebMapper\n"
            + "    implements DefaultWebMapper<"
            + clazz.getSimpleName()
            + "Fo, "
            + clazz.getSimpleName()
            + "Bo, "
            + clazz.getSimpleName()
            + "Vo, "
            + clazz.getSimpleName()
            + "> {\n"
            + "  @Override\n"
            + "  @Mapping(target = \"updateTime\", source = \"updateTime\", dateFormat = \"yyyy-MM-dd HH:mm:ss\")\n"
            + "  @Mapping(target = \"createTime\", source = \"createTime\", dateFormat = \"yyyy-MM-dd HH:mm:ss\")\n"
            + "  public abstract "
            + clazz.getSimpleName()
            + "Vo bo2vo("
            + clazz.getSimpleName()
            + "Bo bo);\n"
            + "\n"
            + "  @Override\n"
            + "  @Mapping(target = \"updateTime\", source = \"updateTime\", dateFormat = \"yyyy-MM-dd HH:mm:ss\")\n"
            + "  @Mapping(target = \"createTime\", source = \"createTime\", dateFormat = \"yyyy-MM-dd HH:mm:ss\")\n"
            + "  public abstract "
            + clazz.getSimpleName()
            + "Vo entity2vo("
            + clazz.getSimpleName()
            + " entity);\n"
            + "}");
    fw.flush();
    fw.close();
    showInfo(fileName);
  }
  /**
   * 生成Service类
   *
   * @param clazz User
   * @param basePackage com.demo.test -> com.demo.test.service.UserRepository.java
   * @throws Exception
   */
  private static void generateService(Class clazz, String basePackage) throws Exception {
    String fileName =
        System.getProperty("user.dir")
            + "/src/main/java/"
            + getBasePathByPackage(basePackage)
            + "/service/"
            + clazz.getSimpleName()
            + "Service.java"; // 如:UserService
    File f = new File(fileName);
    FileWriter fw = new FileWriter(f);
    fw.write(
        "package "
            + basePackage
            + ".service;\n"
            + "\n"
            + "import "
            + basePackage
            + ".domain.bo."
            + clazz.getSimpleName()
            + "Bo;\n"
            + "import "
            + basePackage
            + ".domain.query."
            + clazz.getSimpleName()
            + "Query;\n"
            + "import "
            + basePackage
            + ".entity."
            + clazz.getSimpleName()
            + ";\n"
            + "import org.springframework.data.domain.Page;\n"
            + "import org.springframework.data.domain.Pageable;\n"
            + "import org.springframework.data.domain.Sort;\n"
            + "\n"
            + "import java.util.List;\n"
            + "import java.util.Optional;\n"
            + "\n"
            + "/**\n"
            + " * @Author 自动 @Date "
            + getDate()
            + "\n"
            + " */"
            + "public interface "
            + clazz.getSimpleName()
            + "Service {\n"
            + "\n"
            + "  "
            + clazz.getSimpleName()
            + "Bo findOne("
            + clazz.getSimpleName()
            + "Query "
            + getLowercaseChar(clazz.getSimpleName())
            + "Query);\n"
            + "\n"
            + "  Optional<"
            + clazz.getSimpleName()
            + "Bo> findOne(String id);\n"
            + "\n"
            + "  "
            + clazz.getSimpleName()
            + "Bo add("
            + clazz.getSimpleName()
            + "Bo "
            + getLowercaseChar(clazz.getSimpleName())
            + "Bo);\n"
            + "\n"
            + "  "
            + clazz.getSimpleName()
            + "Bo edit("
            + clazz.getSimpleName()
            + "Bo "
            + getLowercaseChar(clazz.getSimpleName())
            + "Bo);\n"
            + "\n"
            + "  void delete(String id);\n"
            + "\n"
            + "  Page<"
            + clazz.getSimpleName()
            + "> findAll("
            + clazz.getSimpleName()
            + "Query "
            + getLowercaseChar(clazz.getSimpleName())
            + "Query, Pageable pageable);\n"
            + "\n"
            + "  List<"
            + clazz.getSimpleName()
            + "Bo> findAll("
            + clazz.getSimpleName()
            + "Query "
            + getLowercaseChar(clazz.getSimpleName())
            + "Query, Sort sort);\n"
            + "\n"
            + "  List<"
            + clazz.getSimpleName()
            + "Bo> findAll("
            + clazz.getSimpleName()
            + "Query "
            + getLowercaseChar(clazz.getSimpleName())
            + "Query);\n"
            + "}");
    fw.flush();
    fw.close();
    showInfo(fileName);
  }
  /**
   * 生成ServiceImpl类
   *
   * @param clazz User
   * @param basePackage com.demo.test -> com.demo.test.service.impl.UserServiceImpl.java
   * @throws Exception
   */
  private static void generateServiceImpl(Class clazz, String basePackage) throws Exception {
    String fileName =
        System.getProperty("user.dir")
            + "/src/main/java/"
            + getBasePathByPackage(basePackage)
            + "/service/impl/"
            + clazz.getSimpleName()
            + "ServiceImpl.java"; // 如:UserServiceImpl
    File f = new File(fileName);
    FileWriter fw = new FileWriter(f);
    fw.write(
        "package "
            + basePackage
            + ".service.impl;\n"
            + "import "
            + basePackage
            + ".dal."
            + clazz.getSimpleName()
            + "Repository;\n"
            + "import "
            + basePackage
            + ".domain.bo."
            + clazz.getSimpleName()
            + "Bo;\n"
            + "import "
            + basePackage
            + ".domain.query."
            + clazz.getSimpleName()
            + "Query;\n"
            + "import "
            + basePackage
            + ".entity."
            + clazz.getSimpleName()
            + ";\n"
            + "import "
            + basePackage
            + ".service."
            + clazz.getSimpleName()
            + "Service;\n"
            + "import "
            + basePackage
            + ".service.common.DefaultModelService;\n"
            + "import "
            + basePackage
            + ".service.mapper."
            + clazz.getSimpleName()
            + "Mapper;\n"
            + "import "
            + basePackage
            + ".utils.DateFormatUtil;\n"
            + "import org.apache.commons.lang3.StringUtils;\n"
            + "import org.springframework.beans.factory.annotation.Autowired;\n"
            + "import org.springframework.data.domain.Page;\n"
            + "import org.springframework.data.domain.Pageable;\n"
            + "import org.springframework.data.domain.Sort;\n"
            + "import org.springframework.data.jpa.domain.Specification;\n"
            + "import org.springframework.stereotype.Service;\n"
            + "\n"
            + "import javax.persistence.criteria.Predicate;\n"
            + "import java.util.List;\n"
            + "\n"
            + "/**\n"
            + " * @Author 自动 @Date "
            + getDate()
            + "\n"
            + " */"
            + "@Service\n"
            + "public class "
            + clazz.getSimpleName()
            + "ServiceImpl extends DefaultModelService<"
            + clazz.getSimpleName()
            + "Bo, "
            + clazz.getSimpleName()
            + ">\n"
            + "    implements "
            + clazz.getSimpleName()
            + "Service {\n"
            + "  @Autowired private "
            + clazz.getSimpleName()
            + "Repository "
            + getLowercaseChar(clazz.getSimpleName())
            + "Repository;\n"
            + "  @Autowired private "
            + clazz.getSimpleName()
            + "Mapper "
            + getLowercaseChar(clazz.getSimpleName())
            + "Mapper;\n"
            + "\n"
            + "  @Override\n"
            + "  protected "
            + clazz.getSimpleName()
            + "Repository getDatabaseRepository() {\n"
            + "    return "
            + getLowercaseChar(clazz.getSimpleName())
            + "Repository;\n"
            + "  }\n"
            + "\n"
            + "  @Override\n"
            + "  protected "
            + clazz.getSimpleName()
            + "Mapper getBeanMapper() {\n"
            + "    return "
            + getLowercaseChar(clazz.getSimpleName())
            + "Mapper;\n"
            + "  }\n"
            + "\n"
            + "  @Override\n"
            + "  public "
            + clazz.getSimpleName()
            + "Bo findOne("
            + clazz.getSimpleName()
            + "Query "
            + getLowercaseChar(clazz.getSimpleName())
            + "Query) {\n"
            + "\n"
            + "    return findOne(\n"
            + "            (root, query, builder) -> {\n"
            + "              Predicate and = builder.and();\n"
            + "              if (StringUtils.isNotBlank("
            + getLowercaseChar(clazz.getSimpleName())
            + "Query.getId())) {\n"
            + "                and = builder.and(builder.equal(root.get(\"id\"), "
            + getLowercaseChar(clazz.getSimpleName())
            + "Query.getId()));\n"
            + "              }\n"
            + "              return and;\n"
            + "            })\n"
            + "        .orElseGet(() -> null);\n"
            + "  }\n"
            + "\n"
            + "  @Override\n"
            + "  public "
            + clazz.getSimpleName()
            + "Bo add("
            + clazz.getSimpleName()
            + "Bo "
            + getLowercaseChar(clazz.getSimpleName())
            + "Bo) {\n"
            + "    return insert("
            + getLowercaseChar(clazz.getSimpleName())
            + "Bo);\n"
            + "  }\n"
            + "\n"
            + "  @Override\n"
            + "  public "
            + clazz.getSimpleName()
            + "Bo edit("
            + clazz.getSimpleName()
            + "Bo "
            + getLowercaseChar(clazz.getSimpleName())
            + "Bo) {\n"
            + "    return update("
            + getLowercaseChar(clazz.getSimpleName())
            + "Bo);\n"
            + "  }\n"
            + "\n"
            + "  @Override\n"
            + "  public Page<"
            + clazz.getSimpleName()
            + "> findAll("
            + clazz.getSimpleName()
            + "Query "
            + getLowercaseChar(clazz.getSimpleName())
            + "Query, Pageable pageable) {\n"
            + "\n"
            + "    return findAll(getDefaultSpecification("
            + getLowercaseChar(clazz.getSimpleName())
            + "Query), pageable);\n"
            + "  }\n"
            + "\n"
            + "  @Override\n"
            + "  public List<"
            + clazz.getSimpleName()
            + "Bo> findAll("
            + clazz.getSimpleName()
            + "Query "
            + getLowercaseChar(clazz.getSimpleName())
            + "Query, Sort sort) {\n"
            + "    return findAll(getDefaultSpecification("
            + getLowercaseChar(clazz.getSimpleName())
            + "Query), sort);\n"
            + "  }\n"
            + "\n"
            + "  @Override\n"
            + "  public List<"
            + clazz.getSimpleName()
            + "Bo> findAll("
            + clazz.getSimpleName()
            + "Query "
            + getLowercaseChar(clazz.getSimpleName())
            + "Query) {\n"
            + "    return findAll(getDefaultSpecification("
            + getLowercaseChar(clazz.getSimpleName())
            + "Query));\n"
            + "  }\n"
            + "\n"
            + "  protected Specification<"
            + clazz.getSimpleName()
            + "> getDefaultSpecification("
            + clazz.getSimpleName()
            + "Query "
            + getLowercaseChar(clazz.getSimpleName())
            + "Query) {\n"
            + "    return (root, query, builder) -> {\n"
            + "      Predicate and = builder.equal(root.get(\"deletedFlag\"), 0);\n"
            + "      if (StringUtils.isNotBlank("
            + getLowercaseChar(clazz.getSimpleName())
            + "Query.getId())) {\n"
            + "        and = builder.and(and, builder.equal(root.get(\"id\"), "
            + getLowercaseChar(clazz.getSimpleName())
            + "Query.getId()));\n"
            + "      }\n"
            + "      if (StringUtils.isNotBlank("
            + getLowercaseChar(clazz.getSimpleName())
            + "Query.getId())) {\n"
            + "        and =\n"
            + "            builder.and(\n"
            + "                and, builder.equal(root.get(\"createUserId\"), "
            + getLowercaseChar(clazz.getSimpleName())
            + "Query.getCreateUserId()));\n"
            + "      }\n"
            + "      if (StringUtils.isNotBlank("
            + getLowercaseChar(clazz.getSimpleName())
            + "Query.getId())) {\n"
            + "        and =\n"
            + "            builder.and(\n"
            + "                and, builder.equal(root.get(\"updateUserId\"), "
            + getLowercaseChar(clazz.getSimpleName())
            + "Query.getUpdateUserId()));\n"
            + "      }\n"
            + "      if (StringUtils.isNotBlank("
            + getLowercaseChar(clazz.getSimpleName())
            + "Query.getStartCreateTime())) {\n"
            + "        Predicate operatingTime =\n"
            + "            builder.lessThanOrEqualTo(\n"
            + "                root.get(\"createTime\"),\n"
            + "                DateFormatUtil.formatDateTime(\n"
            + "                    "
            + getLowercaseChar(clazz.getSimpleName())
            + "Query.getStartCreateTime() + \" 00:00:00\", \"yyyy-MM-dd HH:mm:ss\"));\n"
            + "        and = builder.and(and, operatingTime);\n"
            + "      }\n"
            + "      if (StringUtils.isNotBlank("
            + getLowercaseChar(clazz.getSimpleName())
            + "Query.getEndCreateTime())) {\n"
            + "        Predicate operatingTime =\n"
            + "            builder.lessThanOrEqualTo(\n"
            + "                root.get(\"createTime\"),\n"
            + "                DateFormatUtil.formatDateTime(\n"
            + "                    "
            + getLowercaseChar(clazz.getSimpleName())
            + "Query.getEndCreateTime() + \" 23:59:59\", \"yyyy-MM-dd HH:mm:ss\"));\n"
            + "        and = builder.and(and, operatingTime);\n"
            + "      }\n"
            + "      if (StringUtils.isNotBlank("
            + getLowercaseChar(clazz.getSimpleName())
            + "Query.getStartUpdateTime())) {\n"
            + "        Predicate operatingTime =\n"
            + "            builder.lessThanOrEqualTo(\n"
            + "                root.get(\"updateTime\"),\n"
            + "                DateFormatUtil.formatDateTime(\n"
            + "                    "
            + getLowercaseChar(clazz.getSimpleName())
            + "Query.getStartUpdateTime() + \" 00:00:00\", \"yyyy-MM-dd HH:mm:ss\"));\n"
            + "        and = builder.and(and, operatingTime);\n"
            + "      }\n"
            + "      if (StringUtils.isNotBlank("
            + getLowercaseChar(clazz.getSimpleName())
            + "Query.getEndUpdateTime())) {\n"
            + "        Predicate operatingTime =\n"
            + "            builder.lessThanOrEqualTo(\n"
            + "                root.get(\"updateTime\"),\n"
            + "                DateFormatUtil.formatDateTime(\n"
            + "                    "
            + getLowercaseChar(clazz.getSimpleName())
            + "Query.getEndUpdateTime() + \" 23:59:59\", \"yyyy-MM-dd HH:mm:ss\"));\n"
            + "        and = builder.and(and, operatingTime);\n"
            + "      }\n"
            + "      return and;\n"
            + "    };\n"
            + "  }\n"
            + "}\n");
    fw.flush();
    fw.close();
    showInfo(fileName);
  }

  /**
   * 生成resource前台服务
   *
   * @param clazz User
   * @param basePackage com.demo.test -> com.demo.test.dal.UserController.java
   * @throws Exception
   */
  private static void generateResource(Class clazz, String basePackage, String cnName)
      throws Exception {
    String fileName =
        System.getProperty("user.dir")
            + "/src/main/java/"
            + getBasePathByPackage(basePackage)
            + "/web/rest/"
            + clazz.getSimpleName()
            + "Controller.java"; // 如:UserResource
    File f = new File(fileName);
    FileWriter fw = new FileWriter(f);
    fw.write(
        "package "
            + basePackage
            + ".web.rest;\n"
            + "\n"
            + "import "
            + basePackage
            + ".domain.SmzReaponse;\n"
            + "import "
            + basePackage
            + ".domain.fo."
            + clazz.getSimpleName()
            + "Fo;\n"
            + "import "
            + basePackage
            + ".domain.query."
            + clazz.getSimpleName()
            + "Query;\n"
            + "import "
            + basePackage
            + ".domain.vo."
            + clazz.getSimpleName()
            + "Vo;\n"
            + "import "
            + basePackage
            + ".entity."
            + clazz.getSimpleName()
            + ";\n"
            + "import "
            + basePackage
            + ".service."
            + clazz.getSimpleName()
            + "Service;\n"
            + "import "
            + basePackage
            + ".utils.PaginationUtil;\n"
            + "import "
            + basePackage
            + ".web.mapper."
            + clazz.getSimpleName()
            + "WebMapper;\n"
            + "import io.swagger.annotations.Api;\n"
            + "import io.swagger.annotations.ApiOperation;\n"
            + "import io.swagger.annotations.ApiParam;\n"
            + "import lombok.extern.slf4j.Slf4j;\n"
            + "import org.springframework.beans.factory.annotation.Autowired;\n"
            + "import org.springframework.data.domain.Page;\n"
            + "import org.springframework.data.domain.Pageable;\n"
            + "import org.springframework.data.web.PageableDefault;\n"
            + "import org.springframework.http.HttpHeaders;\n"
            + "import org.springframework.http.HttpStatus;\n"
            + "import org.springframework.http.MediaType;\n"
            + "import org.springframework.http.ResponseEntity;\n"
            + "import org.springframework.web.bind.annotation.*;\n"
            + "\n"
            + "import javax.inject.Inject;\n"
            + "import javax.validation.Valid;\n"
            + "import java.util.List;\n"
            + "\n"
            + "/**\n"
            + " * @Author 自动 @Date "
            + getDate()
            + "\n"
            + " */"
            + "@Api(tags = {\""
            + cnName
            + "服务API\"})\n"
            + "@Slf4j\n"
            + "@RestController\n"
            + "@RequestMapping(\"/api\")\n"
            + "public class "
            + clazz.getSimpleName()
            + "Controller {\n"
            + "  @Inject private "
            + clazz.getSimpleName()
            + "WebMapper "
            + getLowercaseChar(clazz.getSimpleName())
            + "WebMapper;\n"
            + "  @Autowired private "
            + clazz.getSimpleName()
            + "Service "
            + getLowercaseChar(clazz.getSimpleName())
            + "Service;\n"
            + "\n"
            + "  @ApiOperation(\n"
            + "      value = \"查询所有\",\n"
            + "      httpMethod = \"GET\",\n"
            + "      nickname = \"findAll\",\n"
            + "      consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)\n"
            + "  @GetMapping(\"/"
            + getLowercaseChar(clazz.getSimpleName())
            + "\")\n"
            + "  public ResponseEntity<SmzReaponse<List<"
            + clazz.getSimpleName()
            + "Vo>>> findAll(\n"
            + "      "
            + clazz.getSimpleName()
            + "Query "
            + getLowercaseChar(clazz.getSimpleName())
            + "Query, @PageableDefault Pageable pageable) {\n"
            + "    Page<"
            + clazz.getSimpleName()
            + "> page = "
            + getLowercaseChar(clazz.getSimpleName())
            + "Service.findAll("
            + getLowercaseChar(clazz.getSimpleName())
            + "Query, pageable);\n"
            + "    HttpHeaders headers =\n"
            + "        PaginationUtil.generatePaginationHttpHeaders(page, \"/api/ship/queryAllBoundShips\");\n"
            + "    return new ResponseEntity(\n"
            + "        SmzReaponse.createBySuccess("
            + getLowercaseChar(clazz.getSimpleName())
            + "WebMapper.entitys2vos(page.getContent())),\n"
            + "        headers,\n"
            + "        HttpStatus.OK);\n"
            + "  }\n"
            + "\n"
            + "  @ApiOperation(\n"
            + "      value = \"根据id查询\",\n"
            + "      httpMethod = \"GET\",\n"
            + "      nickname = \"findOne\",\n"
            + "      consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)\n"
            + "  @GetMapping(value = \"/"
            + getLowercaseChar(clazz.getSimpleName())
            + "/{id}\")\n"
            + "  public ResponseEntity<SmzReaponse<"
            + clazz.getSimpleName()
            + "Vo>> findOne(\n"
            + "      @PathVariable @ApiParam(value = \"数据id\") String id) {\n"
            + "    return ResponseEntity.ok(\n"
            + "        SmzReaponse.createBySuccess(\n"
            + "            "
            + getLowercaseChar(clazz.getSimpleName())
            + "Service.findOne(id).map(e -> "
            + getLowercaseChar(clazz.getSimpleName())
            + "WebMapper.bo2vo(e)).orElseGet(null)));\n"
            + "  }\n"
            + "\n"
            + "  @ApiOperation(\n"
            + "      value = \"添加数据\",\n"
            + "      httpMethod = \"POST\",\n"
            + "      nickname = \"add\",\n"
            + "      consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)\n"
            + "  @PostMapping(value = \"/"
            + clazz.getSimpleName()
            + "\")\n"
            + "  public ResponseEntity<SmzReaponse<"
            + clazz.getSimpleName()
            + "Vo>> add(@RequestBody @Valid "
            + clazz.getSimpleName()
            + "Fo fo) {\n"
            + "\n"
            + "    return ResponseEntity.ok(\n"
            + "        SmzReaponse.createBySuccess(\n"
            + "            "
            + getLowercaseChar(clazz.getSimpleName())
            + "WebMapper.bo2vo("
            + getLowercaseChar(clazz.getSimpleName())
            + "Service.add("
            + getLowercaseChar(clazz.getSimpleName())
            + "WebMapper.fo2bo(fo)))));\n"
            + "  }\n"
            + "\n"
            + "  @ApiOperation(\n"
            + "      value = \"修改数据\",\n"
            + "      httpMethod = \"PUT\",\n"
            + "      consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)\n"
            + "  @PutMapping(value = \"/"
            + clazz.getSimpleName()
            + "\")\n"
            + "  public ResponseEntity<SmzReaponse<"
            + clazz.getSimpleName()
            + "Vo>> update(@RequestBody @Valid "
            + clazz.getSimpleName()
            + "Fo fo) {\n"
            + "\n"
            + "    return ResponseEntity.ok(\n"
            + "        SmzReaponse.createBySuccess(\n"
            + "            "
            + getLowercaseChar(clazz.getSimpleName())
            + "WebMapper.bo2vo("
            + getLowercaseChar(clazz.getSimpleName())
            + "Service.edit("
            + getLowercaseChar(clazz.getSimpleName())
            + "WebMapper.fo2bo(fo)))));\n"
            + "  }\n"
            + "\n"
            + "  @ApiOperation(\n"
            + "      value = \"删除数据\",\n"
            + "      httpMethod = \"DELETE\",\n"
            + "      consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)\n"
            + "  @DeleteMapping(value = \"/"
            + clazz.getSimpleName()
            + "/{id}\")\n"
            + "  public ResponseEntity<SmzReaponse> delete(@PathVariable String id) {\n"
            + "    "
            + getLowercaseChar(clazz.getSimpleName())
            + "Service.delete(id);\n"
            + "    return new ResponseEntity<>(SmzReaponse.createBySuccess(\"删除成功\", \"删除成功\"), HttpStatus.OK);\n"
            + "  }\n"
            + "}");
    fw.flush();
    fw.close();
    showInfo(fileName);
  }
  /**
   * * 一键生成所有entity对应的类
   *
   * @param clazz 实体类
   * @param basePackage 基础包路径 如:com.demo.test
   */
  public static void generateAllBeans(Class clazz, String basePackage, String cnName) {
    try {
      initDir(basePackage);
      /** 生成bo */
      generateBo(clazz, basePackage);
      /** 生成fo vo bo query */
      generateFo(clazz, basePackage, cnName);
      generateVO(clazz, basePackage, cnName);
      generateQuery(clazz, basePackage, cnName);
      generateRepository(clazz, basePackage);

      /** 生成ServiceMapper */
      generateServiceMapper(clazz, basePackage);
      /** 生成webmapper */
      generateWebMapper(clazz, basePackage);

      /** 生成Service */
      generateService(clazz, basePackage);

      /** 生成ServiceImpl */
      generateServiceImpl(clazz, basePackage);

      /** 生成resource */
      generateResource(clazz, basePackage, cnName);

    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

运行后可生成基本的增删改查代码。
创建成功后启动项目会自动生成表结构,从而只需要关心业务逻辑,节省开发成本。
欢迎指正
感谢浏览

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在使用 Spring Boot Data JPA 模块时,我们可以通过配置实体类和数据源来自动生成表。具体步骤如下: 1. 添加 Spring Boot Data JPA 依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> ``` 2. 配置数据源和 JPA 属性,例如在 application.yml 文件中: ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/test?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver jpa: hibernate: ddl-auto: update show-sql: true ``` 其中,`ddl-auto` 属性用于定义 Hibernate 在启动时对数据库的操作,它有以下几个可选值: - `create`:每次启动时都重新创建表,这将删除所有的数据表并重新创建它们。这是一个非常危险的操作,因为它会永久删除所有的数据。 - `create-drop`:每次启动应用程序时都会创建并删除表。这是一个非常危险的操作,因为它会永久删除所有的数据。 - `update`:Hibernate 将会根据实体类的定义自动更新表。如果表不存在,则 Hibernate 会创建该表。如果表已经存在,则 Hibernate 会根据实体类的定义更新表结构,但是不会删除任何数据。 - `validate`:Hibernate 比较实体类和数据库表结构,如果不匹配,则会抛出异常,应用程序将不会启动。 - `none`:Hibernate 不会对数据库进行任何操作。 3. 定义实体类,例如: ```java @Entity @Table(name = "user") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(nullable = false) private String name; @Column(nullable = false) private Integer age; // 省略 getter 和 setter 方法 } ``` 其中,`@Entity` 注解用于将 User 类标记为 JPA 实体,`@Table` 注解用于指定数据库表的名称。`@Id` 和 `@GeneratedValue` 注解用于定义主键和自动生成主键的策略。 4. 运行应用程序,Hibernate 将会自动根据实体类定义生成对应的数据表。如果 `ddl-auto` 属性值为 `update`,则 Hibernate 会根据实体类定义更新表结构。如果表不存在,则 Hibernate 会创建该表。如果表已经存在,则 Hibernate 会根据实体类的定义更新表结构,但不会删除任何数据。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值