轉載請註明出處
http://www.javashuo.com/article/p-uyotettw-cp.htmlhtml
Rep是在使用slick最常碰到的類,也是slick的靈魂所在。 利用Rep實現了相似scala.collection的api以及編譯時/運行時的類型檢查。
使用slick的過程當中,最經常使用的Table, TableQuery, Column都是Rep的子類。數據庫
Rep的功能是成爲scala語言和slick.ast包下節點的橋樑, 使得能夠使用scala的類型系統和方法來生成slick抽象語法樹。api
頂層父類有兩個方法, encodeRef(path:Node):Rep[T] 和 toNode:Node。app
encodeRef方法
encodeRef方法從直覺上看,就是將抽象語法樹的Node轉化爲Rep[T]。
encodeRef方法的做用是將Node附帶上類型,路徑等上下文信息, 經過這些上下文信息,使得Node能夠使用scala類型進行約束,映射,或者能夠標記節點的父節點繼承父節點的上下文等等。scala
toNode方法
toNode方法就是將Rep的類型上下文信息去掉 , 將Rep還原回Node。3d
區別
TypedRep 和 UntypedRep 惟一的區別是TypedRep在encodeRef的時候會經過隱式參數保存Type信息,使得Rep在運行時也能夠拿到Rep附帶的類型信息。而UntypedRep的類型信息只能做爲編譯時的泛型約束。code
TypedRep 附帶的類型信息
這裏的Type是slick.ast抽象的Type,在scala的classTag的基礎上增長描述,對Tuple,Option等作了進一步的支持,能夠和數據庫的數據類型進行映射,之後會詳細說明這一部分。htm
做用
TypedRep 主要是做爲表字段column的Rep, 附帶了能夠和數據庫進行映射的類型信息。
UnTypedRep 目前沒什麼用。對象
功能
MappedProjection的做用是將查詢回來的數據映射爲scala對象。blog
主要成員
child:Node 相關聯的抽象語法樹節點
Mapper:slick.ast.Type 和 scala類型之間相互轉化
classTag: scala類型信息
這裏簡單介紹一下相關的功能, 後面會詳細分析這3個類。
ShapedValue是將基礎類型組合起來之後的包含路徑信息的Rep
AbstractTable用來表示數據庫表, 包含全部的表字段Rep
QueryBase是查詢的Rep,能夠進行map, filter等操做將Query映射爲另外一個Query。其中shaped字段是·將AbstractTable轉爲ShapedValue後的對象·
scala的Option類對應的Rep