溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么理解ObjectiveSql的面向?qū)ο?/h1>
發(fā)布時(shí)間:2021-12-30 16:49:32 來源:億速云 閱讀:175 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“怎么理解ObjectiveSql的面向?qū)ο蟆钡挠嘘P(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

最近看了一些視頻,是關(guān)于“充血模型”和“貧血模型”,還有ActiveRecord 模式等,如果站在更高的角度去理解,“貧血模型”就是C語言中的"struct",而充血模型就是Java 中的Class,到底是"struct" 還是Class 要站在系統(tǒng)不同位置去理解,兩者都有存在的理由,只是“貧血模型”會(huì)隱式的存在。我的理解是“貧血模型”通常存在于數(shù)據(jù)傳輸,它只是一種傳輸協(xié)議定義,可以用在不同子系統(tǒng)或數(shù)據(jù)庫(kù)之間的數(shù)據(jù)傳遞,當(dāng)然“貧血模型”也不僅僅只有set 和get 方法,它應(yīng)封裝協(xié)議相關(guān)的行為(通常這些行為被封裝在其它控制Class 中),Google 的ProtoBuffer 就是一個(gè)很好的實(shí)踐。而“充血模型”和ActiveRecord,則是人為的一種定義,本質(zhì)上它只是面向?qū)ο笤O(shè)計(jì)中基礎(chǔ)的概念(狀態(tài)和行為的封裝),純屬制造概念。

面向?qū)ο蟮脑掝}很大,我就以我項(xiàng)目中實(shí)際的問題簡(jiǎn)單介紹。

@DomainModel
public class Order {
  private String no;
  private Integer memberId;
  private Float amount;
  private Float quantity;
  @Column(transition = SqlDateTimeTransitional.class)
  private Timestamp salesAt;
  @Relation(relationType = RelationType.BELONGS_TO)
  private Member member;
  @Relation(relationType = RelationType.HAS_MANY)
  private List<OrderLine> orderLines;
  @Transactional
  @DataSourceName("test")
  public static void makeOrder(Order order, OrderLine... orderLines) throws SQLException {
    Order.create(order, false);
    OrderLine.create(orderLines, false);
  }
}

DomainModel 在項(xiàng)目中以Annotation 的形式存在,用于標(biāo)識(shí)一個(gè)Class 是否為應(yīng)用系統(tǒng)中的一個(gè)模型,模型中應(yīng)該包括業(yè)務(wù)的狀態(tài)和邏輯,同時(shí)也應(yīng)描述描述該模型與其它模型的關(guān)系,具體解釋如下:

  1. @DomainModel 會(huì)將該模型的狀態(tài)與數(shù)據(jù)庫(kù)中的表進(jìn)行關(guān)聯(lián)

  2. @Column(transition = SqlDateTimeTransitional.class) 定義該字段與數(shù)據(jù)庫(kù)之間的轉(zhuǎn)換方式

  3. @Relation(relationType = RelationType.BELONGS_TO) 定義Order 與Member 的關(guān)系

  4. @Transactional 標(biāo)識(shí)該方法的數(shù)據(jù)操作會(huì)作為事務(wù)的形式提交

  5. @DataSourceName("test") 用于多數(shù)據(jù)源時(shí)指定該方法中的數(shù)據(jù)所屬的數(shù)據(jù)庫(kù)

Order 模型你可以稱為ActiveRecord,也可以稱為充血模型,但本質(zhì)上它就是一個(gè)Java 的標(biāo)準(zhǔn)Class,符合面向?qū)ο笤O(shè)計(jì)的一般原則,將問題域細(xì)分,再封裝,它只是將問題域中“訂單”進(jìn)行抽象,設(shè)計(jì)狀態(tài)和行為,將問題域縮小至原子粒度,從業(yè)務(wù)邏輯概念進(jìn)行推演不會(huì)產(chǎn)生歧義,使代碼能夠清晰描述邏輯和狀態(tài),將純技術(shù)型代碼分離,上述定義完成后,你可以這樣直接使用:

Member member = Member.queryByPrimaryKey(1);
List<Member> members = Member.query("id between ? and ?", 10, 20);
int count = Member.count("id > ?", 10);

“怎么理解ObjectiveSql的面向?qū)ο蟆钡膬?nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI