你可能喜欢他,也有可能讨厌他,就像 Lombok 这种 Java 编程模式一样,也会被很多人拒绝。只不过这次你遇到的不再是处理简单的 setter 和 getter,而是用这种编程风格来解决 ORM 的简单查询和复杂 SQL 编程。
经过这段时间各位提交的 Bug 和版本的基本特性,发 1.4.0 稳定版本,主要特性如下:
项目地址: https://github.com/braisdom/ObjectiveSql
完整特性如下:
1 简单查询(首先需要定义一个以 DomainModel Annotation 定义的模型)
@DomainModel public class Member { private String no; @Queryable private String name; private Integer gender; private String mobile; private String otherInfo; @Relation(relatiOnType= RelationType.HAS_MANY) private List<Order> orders; } 1.1 数据持久化
Member.create(newMember); Member.create(newMember, true); // Create a member without validating Member.create(Member.newInstanceFrom(memberHash)); Member.create(new Member[]{newMember1, newMember2, newMember3}, false); Member.update(1L, newMember, true); // Update a member with primary key Member.update("name = 'Smith => Jackson'", "name = 'Alice'"); Member.destroy(1L); // Delete a member with primary key Member.destroy("name = 'Mary'"); // Execute SQL Member.execute(String.format("DELETE FROM %s WHERE name = 'Mary'", Member.TABLE_NAME)); 1.2 事务处理
@Transactional public static void makeOrder(Order order, OrderLine... orderLines) throws SQLException { Order.create(order, false); OrderLine.create(orderLines, false); } 1.3 查询与统计
Member.countAll(); Member.count("id > ?", 1); Member.queryByPrimaryKey(1); Member.queryFirst("id = ?", 1); Member.query("id > ?", 1); Member.queryAll(); 1.4 分页查询
Page page = Page.create(0, 10);// Create a Page instance with current page and page size PagedList<Member> members = Member.pagedQueryAll(page, Member.HAS_MANY_ORDERS); 1.5 关联对象查询
// Querying objects with convenient methods, and it will carry the related objects Member.queryAll(Member.HAS_MANY_ORDERS); Member.queryByPrimary(1, Member.HAS_MANY_ORDERS); Member.queryByName("demo", Member.HAS_MANY_ORDERS); 2 复杂 SQL 查询
Java 代码:
// SQL programming with Java syntax without losing the features of SQL syntax Order.Table orderTable = Order.asTable(); Select select = new Select(); select.project(sum(orderTable.amount) / sum(orderTable.quantity) * 100) .from(orderTable) .where(orderTable.quantity > 30 && orderTable.salesAt.between($("2020-10-10 00:00:00"), $("2020-10-30 23:59:59"))) .groupBy(orderTable.productId); 生成的 SQL 代码:
-- SQL syntax is the same as Java syntax SELECT ((((SUM(`T0`.`amount` ) / SUM(`T0`.`quantity` ) )) * 100)) FROM `orders` AS `T0` WHERE ((`T0`.`quantity` > 30) AND `T0`.`sales_at` BETWEEN '2020-10-10 00:00:00' AND '2020-10-30 23:59:59') GROUP BY `T0`.`product_id` 