slick源码阅读笔记二 slick.lifted.Rep
转载请注明出处
https://www.cnblogs.com/elyw/p/10282476.html
目录
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抽象语法树。
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