slick源碼閱讀筆記二 slick.list.Rep
轉載請註明出處
https://www.cnblogs.com/elyw/p/10282476.html
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抽象語法樹。
2.2.1 Rep頂層父類
頂層父類有兩個方法, encodeRef(path:Node):Rep[T] 和 toNode:Node。
encodeRef方法
encodeRef方法從直覺上看,就是將抽象語法樹的Node轉化為Rep[T]。
encodeRef方法的作用是將Node附帶上類型,路徑等上下文信息, 通過這些上下文信息,使得Node可以使用scala類型進行約束,映射,或者可以標記節點的父節點繼承父節點的上下文等等。toNode方法
toNode方法就是將Rep的類型上下文信息去掉 , 將Rep還原回Node。
2.2.2 TypedRep 和 UntypedRep
區別
TypedRep 和 UntypedRep 唯一的區別是TypedRep在encodeRef的時候會通過隱式參數保存Type信息,使得Rep在運行時也可以拿到Rep附帶的類型信息。而UntypedRep的類型信息只能作為編譯時的泛型約束。TypedRep 附帶的類型信息
這裏的Type是slick.ast抽象的Type,在scala的classTag的基礎上增加描述,對Tuple,Option等做了進一步的支持,可以和數據庫的數據類型進行映射,以後會詳細說明這一部分。作用
TypedRep 主要是作為表字段column的Rep, 附帶了可以和數據庫進行映射的類型信息。
UnTypedRep 目前沒什麽用。
2.2.3 MappedProjection
功能
MappedProjection的作用是將查詢回來的數據映射為scala對象。主要成員
child:Node 相關聯的抽象語法樹節點
Mapper:slick.ast.Type 和 scala類型之間相互轉化
classTag: scala類型信息
2.3.4 ShapedValue, AbstractTable, QueryBase
這裏簡單介紹一下相關的功能, 後面會詳細分析這3個類。
ShapedValue是將基礎類型組合起來以後的包含路徑信息的Rep
AbstractTable用來表示數據庫表, 包含所有的表字段Rep
QueryBase是查詢的Rep,可以進行map, filter等操作將Query映射為另一個Query。其中shaped字段是·將AbstractTable轉為ShapedValue後的對象·
2.3.5 RepOption
scala的Option類對應的Rep
slick源碼閱讀筆記二 slick.list.Rep