Macula Boot Starter JPA

概述

该模块主要使用alibaba druid作为数据源工具,Spring Data JPA和Fenix作为数据库操作框架。 Fenix(菲尼克斯)是一个为了解决复杂动态 SQL (JPQL) 而生的 Spring Data JPA 扩展库,能辅助开发者更方便快捷的书写复杂、动态且易于维护的 SQL,支持 ActiveRecord 模式和多种查询方式。

组件坐标

<dependency>
    <groupId>dev.macula.boot</groupId>
    <artifactId>macula-boot-starter-jpa</artifactId>
    <version>${macula.version}</version>
</dependency>

使用配置

配置上没有太特殊的,主要是数据源配置以及fenix配置。

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/xxx?serverTimezone=Asia/Shanghai&characterEncoding=utf-8
    username: xxx
    password: xxx
  jpa:
    show-sql: true 		# 默认false,在日志里显示执行的sql语句
    hibernate:
    	# 指定为update,每次启动项目检测表结构有变化的时候会新增字段,表不存在时会 新建,如果指定create,
    	# 则每次启动项目都会清空数据并删除表,再新建。生产要指定为none
      ddl-auto: update 
      
# Fenix 的几个配置项、默认值及详细说明,通常情况下你不需要填写这些配置信息(下面的配置代码也都可以删掉).
fenix:
  # v2.4.1 版本新增,表示是否开启 debug 调试模式,默认 false。
  # 当开启之后,对 XML 中的 SQL 会进行实时文件流的读取和解析,不需要重启服务。切记仅在开发环境中开启此功能.
  debug: true
  # 成功加载 Fenix 配置信息后,是否打印启动 banner,默认 true.
  print-banner: true
  # 是否打印 Fenix 生成的 SQL 信息,默认为空.
  # 当该值为空时,会读取 'spring.jpa.show-sql' 的值,为 true 就打印 SQL 信息,否则不打印.
  # 当该值为 true 时,就打印 SQL 信息,否则不打印. 生产环境不建议设置为 true.
  print-sql: true
  # 扫描 Fenix XML 文件的所在位置,默认是 fenix 目录及子目录,可以用 yaml 文件方式配置多个值.
  xml-locations: fenix
  # 扫描你自定义的 XML 标签处理器的位置,默认为空,可以是包路径,也可以是 Java 或 class 文件的全路径名
  # 可以配置多个值,不过一般情况下,你不自定义自己的 XML 标签和处理器的话,不需要配置这个值.
  handler-locations:
  # v2.2.0 新增的配置项,表示自定义的继承自 AbstractPredicateHandler 的子类的全路径名
  # 可以配置多个值,通常情况下,你也不需要配置这个值.
  predicate-handlers:
  # v2.7.0 新增的配置项,表示带前缀下划线转换时要移除的自定义前缀,多个值用英文逗号隔开,通常你不用配置这个值.
  underscore-transformer-prefix:

核心功能

阿里druid数据源配置

数据源的配置请参考druid-spring-boot-starter 官方文档

BaseEntity

默认提供了ID和审计字段,ID默认是自增长模式,如果数据库的默认字段不是标准的,请自行编写基础的Entity。同时记得在配置文件中设置审计字段的名称

@Getter
@Setter
@Accessors(chain = true)
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntity<PK extends Serializable> implements Persistable<PK> {

    private static final long serialVersionUID = 1L;

    @JsonSerialize(using = ToStringSerializer.class)
    @Schema(description = "主键ID")
    @Id
    private PK id;

    @Schema(description = "创建人")
    @CreatedBy
    private String createBy;

    @Schema(description = "更新人")
    @CreatedDate
    private LocalDateTime createTime;

    @Schema(description = "创建时间")
    private String lastUpdateBy;

    @Schema(description = "更新时间")
    private LocalDateTime lastUpdateTime;

    @Transient
    @Override
    public boolean isNew() {
        return null == getId();
    }
}

Fenix快速开始

public interface BlogRepository extends JpaRepository<Blog, String> {

    /**
     * 使用 {@link QueryFenix} 注解来演示根据散参数、博客信息Bean(可以是其它Bean 或者 Map)来多条件模糊分页查询博客信息.
     *
     * @param ids      博客信息 ID 集合
     * @param blog     博客信息实体类,可以是其它 Bean 或者 Map.
     * @param pageable JPA 分页排序参数
     * @return 博客分页信息
     */
    @QueryFenix
    Page<Blog> queryMyBlogs(@Param("ids") List<String> ids, @Param("blog") Blog blog, Pageable pageable);

}
<!-- 这是用来操作博客信息的 Fenix XML 文件,请填写 namespace 命名空间. -->
<fenixs xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        namespace="dev.macula.boot.starter.jpa.test.repository.BlogRepository"
        xmlns="http://macula.dev/schema/jpa"
        xsi:schemaLocation="http://macula.dev/schema/jpa https://macula.dev/schema/jpa/fenix.xsd">

    <!-- 这是一条完整的 Fenix 查询语句块,必须填写 fenix 标签的 id 属性. -->
    <fenix id="queryMyBlogs">
        SELECT
        b
        FROM
        Blog AS b
        WHERE
        <in field="b.id" value="ids" match="ids != empty"/>
        <andLike field="b.author" value="blog.author" match="blog.author != empty"/>
        <andLike field="b.title" value="blog.title" match="blog.title != empty"/>
        <andBetween field="b.createTime" start="blog.createTime" end="blog.lastUpdateTime"
                    match="(?blog.createTime != empty) || (?blog.lastUpdateTime != empty)"/>
    </fenix>
</fenixs>

Fenix具体使用请参考官方文档

依赖引入

<dependencies>
    <dependency>
        <groupId>dev.macula.boot</groupId>
        <artifactId>macula-boot-commons</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
        <exclusions>
            <exclusion>
                <groupId>com.zaxxer</groupId>
                <artifactId>HikariCP</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    <!-- fenix -->
    <dependency>
        <groupId>com.blinkfox</groupId>
        <artifactId>fenix-spring-boot-starter</artifactId>
    </dependency>

    <!-- MySql -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>

    <!-- Druid -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
    </dependency>

    <dependency>
        <groupId>dev.macula.boot</groupId>
        <artifactId>macula-boot-starter-security</artifactId>
        <optional>true</optional>
    </dependency>

    <!-- For Test -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

版权说明