了解如何利用Kilo框架創(chuàng)建和消費RESTful web服務(wù),以及與關(guān)系數(shù)據(jù)庫交互和處理常見文件格式。閱讀本文了解如何優(yōu)化應(yīng)用程序的占用空間和提高代碼可讀性。
Kilo(以前稱為HTTP-RPC)是一個用于在Java中創(chuàng)建和消費RESTful和類似REST的Web服務(wù)的開源框架。它非常輕量級,只需要Java運行時環(huán)境和一個Servlet容器。整個框架的大小不到150KB,因此在需要最小化占用空間的應(yīng)用程序中非常理想。
本文首先介紹了兩個基本的Kilo類,QueryBuilder和ResultSetAdapter。然后討論了Kilo對“模式類型”的支持,這使得可以通過Java語言構(gòu)造而不是純文本來表達SQL查詢。
換句話說,它們?yōu)椴樵兲峁┝艘环N“領(lǐng)域特定語言”(DSL)。
獲取Kilo
Kilo通過Maven Central進行分發(fā):
org.httprpc:kilo-client - 包括支持消費Web服務(wù),與關(guān)系數(shù)據(jù)庫交互以及處理常見文件格式(要求Java 17或更高版本)(repo1.maven.org/maven2/org/httprpc/kilo-client/)
org.httprpc:kilo-server - 依賴于客戶端;包括創(chuàng)建Web服務(wù)的支持(要求Jakarta Servlet規(guī)范5.0或更高版本)(repo1.maven.org/maven2/org/httprpc/kilo-server/)
QueryBuilder和ResultSetAdapter
Kilo的QueryBuilder類提供了對程序化構(gòu)建和執(zhí)行SQL查詢的支持。例如,給定以下MySQL示例數(shù)據(jù)庫中的表:
create table pet ( name varchar(20), owner varchar(20), species varchar(20), sex char(1), birth date, death date );
這段代碼可以用于創(chuàng)建一個查詢,返回與特定所有者關(guān)聯(lián)的所有行:
var queryBuilder = new QueryBuilder(); queryBuilder.append("select * from pet where owner = :owner");
冒號字符將“owner”標(biāo)識為參數(shù)或變量。參數(shù)值可以作為參數(shù)傳遞給QueryBuilder的executeQuery()方法,如下所示:
try (var statement = queryBuilder.prepare(getConnection()); var results = new ResultSetAdapter(queryBuilder.executeQuery(statement, mapOf( entry("owner", owner) )))) { ... }
Kilo的ResultSetAdapter類通過Iterable接口提供對JDBC結(jié)果集內(nèi)容的訪問。適配器的迭代器生成Map實例來表示單個行。結(jié)果可以序列化為JSON或CSV,也可以用作模板文檔的數(shù)據(jù)字典。或者,它們可以映射到Pet實例的列表,并返回給調(diào)用者:
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還支持使用“模式類型”進行更結(jié)構(gòu)化的查詢構(gòu)建方法。例如,上述查詢可以使用模式類型編寫如下:
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"));
模式類型是實現(xiàn)SchemaElement接口的枚舉類型。它們分別使用Table和Column注解與表名和列名相關(guān)聯(lián)。相比于字符串字面值,它們通常更可取,因為它們促進了代碼重用,并對重構(gòu)更具彈性。它們還可以提高可讀性,特別是在處理復(fù)雜查詢時。在上面的示例中,已經(jīng)靜態(tài)導(dǎo)入了OWNER常量以減少冗余。
還支持插入、更新和刪除操作。例如,給定以下類型(表示假設(shè)產(chǎn)品目錄中的一項):
@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); }
此服務(wù)方法可用于向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)); }
類似地,以下兩個方法可用于更新或刪除現(xiàn)有項:文章來源:http://www.zghlxwxcb.cn/article/687.html
@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) )); } }
更多相關(guān)信息,可以查看右邊鏈接,項目文件(github.com/HTTP-RPC/Kilo/blob/master/README.md)文章來源地址http://www.zghlxwxcb.cn/article/687.html
到此這篇關(guān)于使用Schema類型在Java中創(chuàng)建SQL查詢 - Kilo框架介紹的文章就介紹到這了,更多相關(guān)內(nèi)容可以在右上角搜索或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!