D語言(Dlang)ORM - entity 架構

前言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

  1. Database 負責基礎的數據庫訪問,接收  SQL 語句,相似於 PDO、JDBC、ADO.NET;
  2. DBAL 負責實現 SQL BUILDER,依賴 Database;
  3. CriteriaQuery 是調用 DBAL 層,和 Entity 的實體進行關係綁定;
  4. Entity 見名之意就是實體,下面依賴 DBAL 和 CriteriaQuery。

難點分析設計

上面的架構是分層實現,可是對於功能來講是從外而內,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 來支持複雜查詢,項目地址:

https://github.com/huntlabs/hunt-entity

相關文章
相關標籤/搜索