现在已经改变了,ORM 最初的出现主要是Java 程序员需要在字符串的基础上抽象出可复用的基础模型,但由于SQL 太过于灵活,所以Java 的抽象一直不够理想,主要体现在以下几个方面:
1)模型表达双重性问题
模型表达双重性就是同一个Java Bean 需要同时表达Java 的特性和SQL 的特性,因为两种计算逻辑的差异性很大,无法在同一个Java Bean 中进行描述,分开描述就会出现重复代码和变更时的一致性问题。
2)语法一致性问题
Java 表达式的语法和SQL 表达式的语法有相似的地方,也有不同的地方,例如:逻辑表达式,Java中是 a && b 或者a || b,而在SQL中是a and b 或者a or b 等,两个语法不能互换,就会导致大量字符串形式的编码存在。
ObjectiveSQL 通过动态代码生成,保持一个模型承载两种语义,通过运算符重载,实现两种表达式语法的一致性,同时解决了动态查询的复杂性。
简单示例:
Order.Table orderTable = Order.asTable();
Select select = new Select();
select.project((sum(orderTable.amount) / sum(orderTable.quantity) * 100).as("unit_amount"))
.from(orderTable)
.where(orderTable.quantity > 30 &&
orderTable.salesAt.between("2020-05-02 23:59:59", "2020-05-02 23:59:59"))
.groupBy(orderTable.memberId);
生成的SQL 代码,语法基本一致:
SELECT (SUM(`orders_t0`.`amount` ) / SUM(`orders_t0`.`quantity` ) * 100) AS unit_amount
FROM `orders` AS `orders_t0`
WHERE `orders_t0`.`quantity` > 30 AND `orders_t0`.`sales_at` BETWEEN '2020-05-01 00:00:00' AND '2020-05-02 23:59:59'
GROUP BY `orders_t0`.`member_id`
补充一下性能测试: