数据库查询工具 sql builder-01-IQL
2024年1月10日大约 11 分钟
拓展阅读
ORM-01-Hibernate、MyBatis、EclipseLink、Spring Data JPA、TopLink、ActiveJDBC、Querydsl 和 JOOQ 对比
ORM-02-Hibernate 对象关系映射(ORM)框架
ORM-02-JPA Java Persistence API 入门介绍
前言
自己通过 jdbc 实现了一个 数据库查询工具,不过后来想拓展查询功能时,总觉得不够尽兴。
所以在想能不能把 SQL 的构建单独抽离出来。
IQL
IQL 感觉还不错,不过 github 的热度很低,估计是因为文档是俄文,大家看不懂?
创建目的
IQL 类被设计用于简化编写简单 SQL 查询的时间并最小化语法错误的风险。该
项目不旨在与 ORM 竞争,因为它是另一种方法,或者与像 JOOQ 这样的项目竞争。
优势
- 在编写查询时排除语法错误
- 简化多行数据插入 - 无需连接查询,只需为每个新行调用 insert() 方法即可
- 如果在没有 WHERE 的情况下执行 DELETE 或 UPDATE,则生成异常
- UPSERT 操作,如果指定了 WHERE,则插入或更新记录
- 在插入之前对行进行额外处理的能力(使用特定的功能接口)
- 从 int 数字、String 字符串或 Date 对象自动解析日期
- 命令的顺序不重要,例如,可以在 LIMIT 之后指定 GROUP BY,在 ORDER BY 之后指定 WHERE,在 SELECT 之前指定 JOIN
- 简化处理输入数据 - 无需使用 setString()、setInt() 和其他从 PreparedStatment 输入数据的方法,只需输入相应的变量即可
- 使用 IDE 时语法突出显示(通常直接写 SQL 查询时缺少此功能)
- 每个查询具有类似的结构,并以表输入开头,例如,对于 SELECT 查询,首先通过 addTable() 方法添加所需的表,对于 UPDATE、INSERT、DELETE 查询也需要执行同样的操作
- 可以返回生成的 SQL 代码,与 PreparedStatement 不同
- 插入和更新数据的查询具有相似的结构,与 SQL 不同,在那里处理 INSERT 和 UPDATE 操作完全不同
劣势
- 主要适用于 CRUD 操作,没有复杂的逻辑
- 不支持所有数据类型
- 不能在同一查询中同时使用函数和普通字段选择(将会修复)
内置常量
WHERE 比较操作:
常量 | SQL 对应 |
---|---|
EQUAL | "=" |
NOT_EQUAL | "!=" |
MORE | ">" |
MORENEQUAL | ">=" |
LESSNEQUAL | " s.replace("&", "&").replace("", ">")); |
然后,所有插入到查询中的 %s 类型的字符串将使用此方法进行处理:
```java
IQL iql = new IQL(con);
iql.addTable("myvals");
iql.setInsertFields("price %f", "name %s");
iql.insert(3.22, "спички");
String SQL = iql.getSQL();
生成的 SQL 代码如下:
INSERT INTO `myvals`(`price`, `name`) VALUES (3.22, '<h1>спички</h1>')
参考资料
贡献者
binbin.hou