FunDA的特點(diǎn)之一是以數(shù)據(jù)流方式提供逐行數(shù)據(jù)操作支持。這項(xiàng)功能解決了FRM如Slick數(shù)據(jù)操作以SQL批次模式為主所產(chǎn)生的問題。為了實(shí)現(xiàn)安全高效的數(shù)據(jù)行操作,我們必須把FRM產(chǎn)生的Query結(jié)果集轉(zhuǎn)變成一種強(qiáng)類型的結(jié)果集,也就是可以字段名稱進(jìn)行操作的數(shù)據(jù)行類型結(jié)果集。在前面的一篇討論中我們介紹了通過Shape來改變Slick Query結(jié)果行類型。不過這樣的轉(zhuǎn)變方式需要編程人員對(duì)Slick有較深的了解。更重要的是這種方式太依賴Slick的內(nèi)部功能了。我們希望FunDA可以支持多種FRM,所以應(yīng)當(dāng)盡量避免與任何FRM的緊密耦合??磥韽腇RM的返回結(jié)果開始進(jìn)行數(shù)據(jù)行類型格式轉(zhuǎn)換是一種比較現(xiàn)實(shí)的選擇。一般來說我們還是可以假定任何FRM的使用者對(duì)于FRM的Query結(jié)果集類型是能理解的,因?yàn)樗麄兊闹饕康木褪菫榱耸褂眠@個(gè)結(jié)果集。那么由FunDA的使用者提供一個(gè)Query結(jié)果數(shù)據(jù)行與另一種類型的類型轉(zhuǎn)換函數(shù)應(yīng)該不算是什么太高的要求吧。FunDA的設(shè)計(jì)思路是由用戶提供一個(gè)目標(biāo)類型以及FRM Query結(jié)果數(shù)據(jù)行到這個(gè)強(qiáng)類型行類型的類型轉(zhuǎn)換函數(shù)后由FunDA提供強(qiáng)類型行結(jié)果集。下面先看一個(gè)典型的Slick Query例子:
1 import slick.driver.H2Driver.api._ 2 import scala.concurrent.duration._ 3 import scala.concurrent.Await 4 5 object TypedRow extends App { 6 7 class AlbumsTable(tag: Tag) extends Table[ 8 (Long,String,String,Option[Int],Int)](tag,"ALBUMS") { 9 def id = column[Long]("ID",O.PrimaryKey)10 def title = column[String]("TITLE")11 def artist = column[String]("ARTIST")12 def year = column[Option[Int]]("YEAR")13 def company = column[Int]("COMPANY")14 def * = (id,title,artist,year,company)15 }16 val albums = TableQuery[AlbumsTable]17 class CompanyTable(tag: Tag) extends Table[(Int,String)](tag,"COMPANY") {18 &nbs