slick源碼閱讀筆記二 slick.lifted.Rep

轉載請註明出處
http://www.javashuo.com/article/p-uyotettw-cp.htmlhtml

目錄

slick源碼閱讀筆記 目錄&總覽

slick源碼閱讀筆記一 slick.ast

slick源碼閱讀筆記二 slick.lifted.Rep

slick源碼閱讀筆記三 ShapedValue 在Table和Query上的應用

slick源碼閱讀筆記四 隱式轉換--column與Query查詢功能實現

slick源碼閱讀筆記五 Query查詢條件生成與OptionMapper

2. slick.lifted.Rep

Rep是在使用slick最常碰到的類,也是slick的靈魂所在。 利用Rep實現了相似scala.collection的api以及編譯時/運行時的類型檢查。
使用slick的過程當中,最經常使用的Table, TableQuery, Column都是Rep的子類。數據庫

2.1 Rep的繼承結構

2.2 Rep的核心方法和功能

Rep的功能是成爲scala語言和slick.ast包下節點的橋樑, 使得能夠使用scala的類型系統和方法來生成slick抽象語法樹。api

2.2.1 Rep頂層父類

頂層父類有兩個方法, encodeRef(path:Node):Rep[T] 和 toNode:Node。app

  1. encodeRef方法
    encodeRef方法從直覺上看,就是將抽象語法樹的Node轉化爲Rep[T]。
    encodeRef方法的做用是將Node附帶上類型,路徑等上下文信息, 經過這些上下文信息,使得Node能夠使用scala類型進行約束,映射,或者能夠標記節點的父節點繼承父節點的上下文等等。scala

  2. toNode方法
    toNode方法就是將Rep的類型上下文信息去掉 , 將Rep還原回Node。3d

2.2.2 TypedRep 和 UntypedRep

  1. 區別
    TypedRep 和 UntypedRep 惟一的區別是TypedRep在encodeRef的時候會經過隱式參數保存Type信息,使得Rep在運行時也能夠拿到Rep附帶的類型信息。而UntypedRep的類型信息只能做爲編譯時的泛型約束。code

  2. TypedRep 附帶的類型信息
    這裏的Type是slick.ast抽象的Type,在scala的classTag的基礎上增長描述,對Tuple,Option等作了進一步的支持,能夠和數據庫的數據類型進行映射,之後會詳細說明這一部分。htm

  3. 做用
    TypedRep 主要是做爲表字段column的Rep, 附帶了能夠和數據庫進行映射的類型信息。
    UnTypedRep 目前沒什麼用。對象

2.2.3 MappedProjection

  1. 功能
    MappedProjection的做用是將查詢回來的數據映射爲scala對象。blog

  2. 主要成員
    child:Node 相關聯的抽象語法樹節點
    Mapper:slick.ast.Type 和 scala類型之間相互轉化
    classTag: scala類型信息

2.3.4 ShapedValue, AbstractTable, QueryBase

這裏簡單介紹一下相關的功能, 後面會詳細分析這3個類。

  1. ShapedValue是將基礎類型組合起來之後的包含路徑信息的Rep

  2. AbstractTable用來表示數據庫表, 包含全部的表字段Rep

  3. QueryBase是查詢的Rep,能夠進行map, filter等操做將Query映射爲另外一個Query。其中shaped字段是·將AbstractTable轉爲ShapedValue後的對象·

2.3.5 RepOption

scala的Option類對應的Rep

相關文章
相關標籤/搜索