sql-assistant

A simple sql builder

License

License

Categories

Categories

Ant Build Tools
GroupId

GroupId

com.github.347255699
ArtifactId

ArtifactId

sql-assistant
Last Version

Last Version

1.1.1
Release Date

Release Date

Type

Type

jar
Description

Description

sql-assistant
A simple sql builder
Project URL

Project URL

https://github.com/347255699/sql-assistant
Source Code Management

Source Code Management

https://github.com/347255699/sql-assistant

Download sql-assistant

How to add to project

<!-- https://jarcasting.com/artifacts/com.github.347255699/sql-assistant/ -->
<dependency>
    <groupId>com.github.347255699</groupId>
    <artifactId>sql-assistant</artifactId>
    <version>1.1.1</version>
</dependency>
// https://jarcasting.com/artifacts/com.github.347255699/sql-assistant/
implementation 'com.github.347255699:sql-assistant:1.1.1'
// https://jarcasting.com/artifacts/com.github.347255699/sql-assistant/
implementation ("com.github.347255699:sql-assistant:1.1.1")
'com.github.347255699:sql-assistant:jar:1.1.1'
<dependency org="com.github.347255699" name="sql-assistant" rev="1.1.1">
  <artifact name="sql-assistant" type="jar" />
</dependency>
@Grapes(
@Grab(group='com.github.347255699', module='sql-assistant', version='1.1.1')
)
libraryDependencies += "com.github.347255699" % "sql-assistant" % "1.1.1"
[com.github.347255699/sql-assistant "1.1.1"]

Dependencies

compile (1)

Group / Artifact Type Version
javax.persistence : javax.persistence-api jar 2.2

provided (1)

Group / Artifact Type Version
org.projectlombok : lombok jar 1.18.16

test (2)

Group / Artifact Type Version
org.junit.jupiter : junit-jupiter-api jar 5.7.0
org.slf4j : slf4j-simple jar 1.7.30

Project Modules

There are no modules declared in this project.

sql-assistant

一个简洁易用的 SQL Builder,能够让你通过 java 的链式调用方式来编写复杂的 sql 语句。

Installation

通过 maven 的方式引入:

<dependency>
    <groupId>com.github.347255699</groupId>
    <artifactId>sql-assistant</artifactId>
    <version>1.1.1</version>
</dependency>

通过 gradle 的方式引入:

compile group: 'com.github.347255699', name: 'sql-assistant', version: '1.1.1'

Usage

Quick Start

sql-assistant 为所有的 sql 语句构造提供了统一的入口。你可以通过 SqlAssistant 对象来快速开始。

SqlHolder sqlHolder = SqlAssistant.beginSimpleSelect()
                .select("name_space", "name", "public_ip", "private_ip")
                .from("m_node")
                .where(Conditions.equals("name", "menfre"))
                .end();
log.info("my sql: {}", sqlHolder.getSql());
log.info("my condition args: {}", Arrays.toString(sqlHolder.getArgs()));

结果:

sql: SELECT name_space, name, public_ip, private_ip FROM m_node WHERE name = ?;
my condition args: [menfre]

SelectBuilder

Select 语句根据不同的使用习惯被拆分为三种模式,当然以下三种模式均可以使用 SqlAssistant 来快速开始。

  • SimpleSelectBuilder
  • ComplexSelectBuilder
  • JoinSelectBuilder

为了迎合大部分主流的 orm 框架,SelectBuilder 并不会将 where 子句的条件参数拼接到 sql 语句中,而是通过 Object 数组的方式额外提供,sql 语句中的条件参数均以占位符 ? 代替。

SimpleSelectBuilder

SimpleSelectBuilderSelectBuilder 中最简单的一种,能满足常见单表查询的场景。

SqlHolder sqlHolder = SqlAssistant.beginSimpleSelect()
                .select("name_space", "name", "public_ip", "private_ip")
                .from("m_node")
                .orderBy(Sort.of("n.name", Sort.Direction.ASC))
                .limit(10)
                .end();

对应的 sql:

SELECT name_space, name, public_ip, private_ip FROM m_node ORDER BY n.name ASC LIMIT 10;

ComplexSelectBuilder

ComplexSelectBuilder 对比 SimpleSelectBuilder 增加了多表查询的能力,多表可以通过 ColumnGroup 对象维护起来。这种模式通常适用于多表查询且链接条件比较简单的情况。

ColumnGroup node = Columns.group("n", "m_node", Columns.asList("name", "name_space", "public_ip", "private_ip"));
ColumnGroup label = Columns.group("l", "m_label", Columns.asList("label_key", "label_value"));
SqlHolder sqlHolder = SqlAssistant.beginComplexSelect()
                .select(node, label)
                .where(Conditions.columnEquals("n.m_api_object_id", "l.object_id"))
                .where(Conditions.equals("n.name", "menfre"))
                .orderBy(Sort.of("n.name", Sort.Direction.ASC))
                .limit(5, 10)
                .end();

对应的 sql:

SELECT n.name, n.name_space, n.public_ip, n.private_ip, l.label_key, l.label_value FROM m_node AS n, m_label AS l WHERE n.m_api_object_id = l.object_id AND n.name = ? ORDER BY n.name ASC LIMIT 5, 10;

JoinSelectBuilder

JoinSelectBuilderSelectBuilder 最复杂的一种,在 ComplexSelectBuilder 的基础上增加了 join 子句;能够通过 join 链将不同的 join 子句链接起来,提升 join 逻辑的可读性和易用性。

ColumnGroup node = Columns.group("n", "m_node", Columns.asList("name", "name_space", "public_ip", "private_ip"));
ColumnGroup label = Columns.group("l", "m_label", Columns.asList("label_key", "label_value"));
Join leftJoin = node.left(label, Conditions.columnEquals("n.m_api_object_id", "l.object_id"));
SqlHolder sqlHolder = SqlAssistant.beginJoinSelect()
                .select(node, label)
                .join(leftJoin)
                .where(Conditions.equals("n.name", "menfre"))
                .orderBy(Sort.of("n.name", Sort.Direction.ASC))
                .limit(5, 10)
                .end();

对应的 sql:

SELECT n.name, n.name_space, n.public_ip, n.private_ip, l.label_key, l.label_value FROM m_node AS n LEFT JOIN m_label AS l ON n.m_api_object_id = l.object_id WHERE n.name = ? ORDER BY n.name ASC LIMIT 5, 10;

InsertBuilder

InsertBuilder 支持 ColumnGroup 作为参数来执行 insert into 操作。

ColumnGroup node = Columns.group("m_node", Columns.asList("name", "name_space", "private_ip", "public_ip"));
SqlHolder sqlHolder = SqlAssistant.beginInsert()
                .insertInto(node)
                .values("menfre", "test", "192.168.0.1", "123.3.4.1")
                .end();

对应的 sql:

INSERT INTO m_node(name, name_space, private_ip, public_ip)VALUES(?, ?, ?, ?);

DeleteBuilder

SqlHolder sqlHolder = SqlAssistant.beginDelete()
                .deleteFrom("m_node")
                .where(Conditions.equals("name", "menfre"))
                .where(Conditions.equals("name_space", "test"))
                .end();

对应的 sql:

DELETE FROM m_node WHERE name = ? AND name_space = ?;

UpdateBuilder

SqlHolder sqlHolder = SqlAssistant.beginUpdate()
                .update("m_node")
                .set("name", "menfre2")
                .set(UpdateItem.of("name_space", "dev"))
                .where(Conditions.equals("name", "menfre"))
                .where(Conditions.equals("name_space", "test"))
                .end();

对应的 sql:

UPDATE m_node SET name = ?, name_space = ? WHERE name = ? AND name_space = ?;

注解

sql-assistant 的 Select 语句支持通过给 pojo 注解的方式来替代繁琐的 Column 构造。

  • MultiEntity
  • Entity

MultiEntity

Pojo:

@Data
@MultiEntity(tables = {"A","B"}, alias = {"a","b"})
public class MultiEntityVo {
    @Column(table = "user1")
    private int id;

    private String name;

    @Column(table = "A", name = "age1", columnDefinition = "18")
    @AliasColumn("age2")
    private int age;

    @IgnoreColumn
    private String address;
}
SqlHolder sqlHolder = SqlAssistant.beginComplexSelect()
                .select(Columns.groupByMultiEntity(MultiEntityVo.class))
                .getSql();

对应的 sql:

SELECT a.id, a.name, IFNULL(b.age1, 18) AS age2 FROM user1 AS a, user2 AS b;

Entity

Pojo:

@Entity
public class EntityVo {
    @Id
    private int id;

    @Column(name = "my_name", columnDefinition = "'menfre'")
    private String myName;

    @Column(columnDefinition = "18")
    @AliasColumn("age2")
    private int age;

    @IgnoreColumn
    private String address;
}

@Entity 和 @Id 是 JPA 中的注解,在这里只会扫描 @Column、@AliasColumn、@IgnoreColumn 用于构造 sql 语句。

SqlHolder sqlHolder = SqlAssistant.beginSimpleSelect()
                .select(Columns.asList(EntityVo.class))
                .from("user")
                .getSql();

对应的 sql:

SELECT id, IFNULL(my_name, 'menfre'), IFNULL(age, 18) AS age2 FROM user;

Versions

Version
1.1.1
1.0.1
1.0.0