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。

  1. encodeRef方法
    encodeRef方法从直觉上看,就是将抽象语法树的Node转化为Rep[T]。
    encodeRef方法的作用是将Node附带上类型,路径等上下文信息, 通过这些上下文信息,使得Node可以使用scala类型进行约束,映射,或者可以标记节点的父节点继承父节点的上下文等等。

  2. toNode方法
    toNode方法就是将Rep的类型上下文信息去掉 , 将Rep还原回Node。

2.2.2 TypedRep 和 UntypedRep

  1. 区别
    TypedRep 和 UntypedRep 唯一的区别是TypedRep在encodeRef的时候会通过隐式参数保存Type信息,使得Rep在运行时也可以拿到Rep附带的类型信息。而UntypedRep的类型信息只能作为编译时的泛型约束。

  2. TypedRep 附带的类型信息
    这里的Type是slick.ast抽象的Type,在scala的classTag的基础上增加描述,对Tuple,Option等做了进一步的支持,可以和数据库的数据类型进行映射,以后会详细说明这一部分。

  3. 作用
    TypedRep 主要是作为表字段column的Rep, 附带了可以和数据库进行映射的类型信息。
    UnTypedRep 目前没什么用。

2.2.3 MappedProjection

  1. 功能
    MappedProjection的作用是将查询回来的数据映射为scala对象。

  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

posted @ 2019-01-20 12:12  贰零妖舞  阅读(413)  评论(0编辑  收藏  举报