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