了解如何利用Kilo框架创建和消费RESTful web服务,以及与关系数据库交互和处理常见文件格式。阅读本文了解如何优化应用程序的占用空间和提高代码可读性。
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)); }
类似地,以下两个方法可用于更新或删除现有项:文章来源:https://www.toymoban.com/diary/java/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) )); } }
更多相关信息,可以查看右边链接,项目文件(github.com/HTTP-RPC/Kilo/blob/master/README.md)文章来源地址https://www.toymoban.com/diary/java/687.html
到此这篇关于使用Schema类型在Java中创建SQL查询 - Kilo框架介绍的文章就介绍到这了,更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!