前言git
爲了讓Dlang像 Java / PHP / C# 同樣具備很是好的數據庫操做體驗,咱們瞭解了 PDO、JDBC、HIBERNATE、ADO.NET,最終發現你們的設計都不是很統一,只有 Java 最新的持久化標準 JPA 是真正的具備可移植性,因此咱們準備本身實現一套 JPA 機制,命名爲 dlang-entity。github
分析數據庫
分析的時候發現 dlang 官方沒有任何標準的數據庫操做接口,也就是像 PDO / JDBC / ADO.NET 這樣的東東都不存在……架構
繼續分析發現上層還有 SQL BUILDER ,最上層還有 Entity 的一系列管理,最終咱們把 ORM 分紅了 4 個層,分別是 Database / DBAL / CriteriaQuery/ Entity性能
層次功能ui
難點分析設計
上面的架構是分層實現,可是對於功能來講是從外而內,Database 和 Entity 是同步設計的,目前參考了 JPA 的接口設計,也認爲是一種標準,可是存在的問題是語言之間的特性不一樣,Java 在 JPA 的設計上使用了不少運行時註解特性,雖然設計簡單可是性能確定是不理想,可是研究了 dlang 的方案後發現不少東西不能在運行時處理,由於 dlang 的編譯時很是牛,雖然 dlang 這樣的實現會讓性能達到極致,可是也同時很大程度的增長了開發的複雜度。code
好比,參照 JPA 的設計用 dlang 能夠這樣:接口
class User { int id; string name; int age; int high; } class UserModel { User[] getUsers(String name, int age, int high) { CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery query = cb.createQuery!User(); //from Root root = query.from(typeid(User)); //where Predicate p1 = cb.like(root.get("name"), "%" ~ name ~ "%"); Predicate p2 = cb.equal(root.get("age"), age); Predicate p3 = cb.equal(root.get("high"), high); Predicate p = cb.and(p1, cb.or(p2, p3)); query.where(p); User[] users; auto result = em.createQuery(query).getResult(); foreach(auto user; result) { users ~= user; } return users; } }
固然是否是行得通還有待驗證,後續再持續更新本文章。 開發
未完待續!
~~~~~~~~~~ 2018.12.13 ~~~~~~~~~~~~
如今 hunt-entity 已經支持了完整的 JPA 實現,而且提供了 EQL 來對標 JPA 的 JPQL 來支持複雜查詢,項目地址: