使用Schema类型在Java中创建SQL查询 - Kilo框架介绍

了解如何利用Kilo框架创建和消费RESTful web服务,以及与关系数据库交互和处理常见文件格式。阅读本文了解如何优化应用程序的占用空间和提高代码可读性。

Java,SQL,Schema

Kilo(以前称为HTTP-RPC)是一个用于在Java中创建和消费RESTful和类似REST的Web服务的开源框架。它非常轻量级,只需要Java运行时环境和一个Servlet容器。整个框架的大小不到150KB,因此在需要最小化占用空间的应用程序中非常理想。

本文首先介绍了两个基本的Kilo类,QueryBuilder和ResultSetAdapter。然后讨论了Kilo对“模式类型”的支持,这使得可以通过Java语言构造而不是纯文本来表达SQL查询。

换句话说,它们为查询提供了一种“领域特定语言”(DSL)。

获取Kilo

Kilo通过Maven Central进行分发:

  • org.httprpc:kilo-client - 包括支持消费Web服务,与关系数据库交互以及处理常见文件格式(要求Java 17或更高版本)(repo1.maven.org/maven2/org/httprpc/kilo-client/)

  • org.httprpc:kilo-server - 依赖于客户端;包括创建Web服务的支持(要求Jakarta Servlet规范5.0或更高版本)(repo1.maven.org/maven2/org/httprpc/kilo-server/)

QueryBuilder和ResultSetAdapter

Kilo的QueryBuilder类提供了对程序化构建和执行SQL查询的支持。例如,给定以下MySQL示例数据库中的表:

create table pet (
  name varchar(20),
  owner varchar(20),
  species varchar(20),
  sex char(1),
  birth date,
  death date
);

这段代码可以用于创建一个查询,返回与特定所有者关联的所有行:

var queryBuilder = new QueryBuilder();

queryBuilder.append("select * from pet where owner = :owner");

冒号字符将“owner”标识为参数或变量。参数值可以作为参数传递给QueryBuilder的executeQuery()方法,如下所示:

try (var statement = queryBuilder.prepare(getConnection());
    var results = new ResultSetAdapter(queryBuilder.executeQuery(statement, mapOf(
        entry("owner", owner)
    )))) {
    ...
}

Kilo的ResultSetAdapter类通过Iterable接口提供对JDBC结果集内容的访问。适配器的迭代器生成Map实例来表示单个行。结果可以序列化为JSON或CSV,也可以用作模板文档的数据字典。或者,它们可以映射到Pet实例的列表,并返回给调用者:

public interface Pet {
    String getName();
    String getOwner();
    String getSpecies();
    String getSex();
    Date getBirth();
    Date getDeath();
}
return results.stream().map(result -> BeanAdapter.coerce(result, Pet.class)).toList();

模式(Schema)类型

QueryBuilder还支持使用“模式类型”进行更结构化的查询构建方法。例如,上述查询可以使用模式类型编写如下:

public interface Pet {
    @Table("pet")
    enum Schema implements SchemaElement {
        @Column("name")
        NAME,
        @Column("owner")
        OWNER,
        @Column("species")
        SPECIES,
        @Column("sex")
        SEX,
        @Column("birth")
        BIRTH,
        @Column("death")
        DEATH
    }

    ...
}
var queryBuilder = QueryBuilder.selectAll()
    .from(Pet.Schema.class)
    .where(OWNER.eq("owner"));

模式类型是实现SchemaElement接口的枚举类型。它们分别使用Table和Column注解与表名和列名相关联。相比于字符串字面值,它们通常更可取,因为它们促进了代码重用,并对重构更具弹性。它们还可以提高可读性,特别是在处理复杂查询时。在上面的示例中,已经静态导入了OWNER常量以减少冗余。

还支持插入、更新和删除操作。例如,给定以下类型(表示假设产品目录中的一项):

@Description("Represents an item in the catalog.")
public interface Item {
    @Table("item")
    enum Schema implements SchemaElement {
        @Column("id")
        ID,
        @Column("description")
        DESCRIPTION,
        @Column("price")
        PRICE
    }

    @Key("id")
    @Description("The item's ID.")
    Integer getID();
    void setID(Integer id);

    @Description("The item's description.")
    @Required
    String getDescription();
    void setDescription(String description);

    @Description("The item's price.")
    @Required
    Double getPrice();
    void setPrice(Double price);
}

此服务方法可用于向item表添加一行:

@RequestMethod("POST")
@ResourcePath("items")
@Description("Adds an item to the catalog.")
@Creates
public Item addItem(
    @Description("The item to add.") Item item
) throws SQLException {
    var queryBuilder = QueryBuilder.insertInto(Item.Schema.class, DESCRIPTION, PRICE)
        .values("description", "price");

    try (var statement = queryBuilder.prepare(getConnection())) {
        queryBuilder.executeUpdate(statement, new BeanAdapter(item));
    }

    return getItem(BeanAdapter.coerce(queryBuilder.getGeneratedKeys().get(0), Integer.class));
}

类似地,以下两个方法可用于更新或删除现有项:

@RequestMethod("PUT")
@ResourcePath("items/?")
@Description("Updates an item.")
public void updateItem(
    @Description("The item ID.") Integer itemID,
    @Description("The updated item.") Item item
) throws SQLException {
    item.setID(itemID);

    var queryBuilder = QueryBuilder.update(Item.Schema.class, DESCRIPTION, PRICE)
        .set("description", "price")
        .where(ID.eq("id"));

    try (var statement = queryBuilder.prepare(getConnection())) {
        queryBuilder.executeUpdate(statement, new BeanAdapter(item));
    }
}
@RequestMethod("DELETE")
@ResourcePath("items/?")
@Description("Deletes an item.")
public void deleteItem(
    @Description("The item ID.") Integer itemID
) throws SQLException {
    var queryBuilder = QueryBuilder.deleteFrom(Item.Schema.class).where(ID.eq("id"));

    try (var statement = queryBuilder.prepare(getConnection())) {
        queryBuilder.executeUpdate(statement, mapOf(
            entry("id", itemID)
        ));
    }
}

更多相关信息,可以查看右边链接,项目文件(github.com/HTTP-RPC/Kilo/blob/master/README.md)文章来源地址https://www.toymoban.com/diary/java/687.html

到此这篇关于使用Schema类型在Java中创建SQL查询 - Kilo框架介绍的文章就介绍到这了,更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

原文地址:https://www.toymoban.com/diary/java/687.html

如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用
了解索引对表的影响以及如何分析查询计划,在MySQL中进行SQL查询性能调优
上一篇 2024年01月11日 23:34
如何在HTML中缩进,Html缩进的多种方式
下一篇 2024年01月13日 13:58

相关文章

  • gaussDB的schema创建查询,及其查询下面的表列,修改列类型

    修改列类型与众不同 alter table adqm_safe_data_encrypt_job_instance alter COLUMN state TYPE INT4 设置列非空 alter table data_watermark_rule alter COLUMN encrypt_type set not null alter COLUMN state TYPE INT4 pg_catalog.pg_namespace来查看当前数据库中全部的Schema  select oid,* from pg_catalog.pg_namespace; 创建schema create schema g

    2024年02月07日
    浏览(16)
  • Json Schema介绍 和 .net 下的实践 - 基于Lateapexearlyspeed.Json.Schema - 基础1 - type关键字和string类型

    本系列旨在介绍Json Schema的常见用法,以及.net实现库Lateapexearlyspeed.Json.Schema的使用 这篇文章将介绍Json Schema中的type,和string类型的常见验证功能。用例基于.net的LateApexEarlySpeed.Json.Schema nuget package。这是新创建的一个 Json Schema在.net下的高性能实现库。 就像其他各种Sch

    2024年02月02日
    浏览(18)
  • SQL语句 - 多表查询使用详细介绍

    例如我们有一张员工表和部门表, 员工表有6条数据, 部门表表有4条数据 : 使用多表查询, 查询员工表和部门表两张表 : 此时查询到的结果会有24条数据, 为什么会这样呢 ? 笛卡尔积:有A, B两个集合, 取A, B集合所有组合情况(4*6=24); 我们多表查询, 更多的是消除这些无效的数据 例

    2024年01月16日
    浏览(20)
  • 使用navicat利用sql语句查询表所有字段的字段名,类型,长度。

    想要在navicat下,用sql语句查询一个表的所有字段和其相关信息。 打开所需要查询的表的数据库 查新建询 把下面的sql语句复制粘贴到新建的查询编辑器中并修改库名和表 这样表的相关信息就会显示出来了,将其选中,点击鼠标右键,——复制为——制表符分隔值(字段名和

    2023年04月08日
    浏览(32)
  • Mybaits:数据库查询类型不匹配,java.sql.SQLDataException: Cannot determine value type from string

    目录 一.问题描述 二.源码分析 三.总结 事情的起因是用MybaitsPlus查询数据库过程中,查询结果与要封装的实体类字段类型对应不上,类似这样: 数据库查询结果: java实体类: 字段名字和实体类的名字类型都能对应上,但最后的查询结果却会报错java.sql.SQLDataException: Cannot d

    2024年02月03日
    浏览(21)
  • 24、Flink 的table api与sql之Catalogs(介绍、类型、java api和sql实现ddl、java api和sql操作catalog)-1

    一、Flink 专栏 Flink 专栏系统介绍某一知识点,并辅以具体的示例进行说明。 1、Flink 部署系列 本部分介绍Flink的部署、配置相关基础内容。 2、Flink基础系列 本部分介绍Flink 的基础部分,比如术语、架构、编程模型、编程指南、基本的datastream api用法、四大基石等内容。 3、

    2024年02月06日
    浏览(23)
  • JSP 学生成绩查询管理系统eclipse开发sql数据库serlvet框架bs模式java编程MVC结构

    一、源码特点   JSP 学生成绩查询管理系统 是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,比较流行的servlet框架系统具有完整的源代码和数据库,eclipse开发系统主要采用B/S模式 开发。 java 学生成绩查询管理系统 代码下载链接 https://download.csdn.net/download/qq_412

    2024年02月05日
    浏览(25)
  • MySQL实践——sys schema介绍及使用

    sys schema介绍 说到诊断MySQL的性能问题,都知道从performance_schema去获取想要的数据,但是其复杂程度让使用人员使用起来很不方便。在MySQL5.7中,performance_schema已经有80多张表,每张表都是各种统计信息的罗列。另外这些表和information_schema中的部分表也有关联,导致使用人员使

    2024年02月14日
    浏览(21)
  • 【Java 进阶篇】使用 SQL 进行排序查询

    在数据库中,我们经常需要对查询的结果进行排序,以便更容易地理解和分析数据。SQL(Structured Query Language)提供了强大的排序功能,允许我们按照指定的列对数据进行升序或降序排序。本文将详细介绍如何使用 SQL 进行排序查询,包括基本的排序语法、多列排序、自定义排

    2024年02月07日
    浏览(17)
  • mysql —案例复杂查询+索引使用+DBeaver中创建索引

    接上章 我们 对一个简单的选课功能进行 设计分析 实际上在工作中 拿到一个需求,也是这样的一个分析过程 一个份 需求文档+原型 出来,只要是你负责这个模块,就需要你自己建表建库,设计接口文档,也许现在有的公司会有一个带你的大哥会帮你建表建库【甚至接口文档

    2024年02月13日
    浏览(19)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包