Scala Slick 2:如何编写与DB无关的DAL代码
这基本上是一个重复,但是关于Slick-2,因为对v.1有效的答案不再有效 简而言之,精巧的文档建议这样做Scala Slick 2:如何编写与DB无关的DAL代码,scala,slick,Scala,Slick,这基本上是一个重复,但是关于Slick-2,因为对v.1有效的答案不再有效 简而言之,精巧的文档建议这样做 package models import scala.slick.driver.H2Driver.simple._ class Pictures(tag: Tag) extends Table[(Int, String, String)](tag, "Pictures") { def id = column[Int]("id", O.PrimaryKey) def ur
package models
import scala.slick.driver.H2Driver.simple._
class Pictures(tag: Tag) extends Table[(Int, String, String)](tag, "Pictures") {
def id = column[Int]("id", O.PrimaryKey)
def urlThumb = column[String]("urlThumb", O.NotNull)
def urlLarge = column[String]("urlLarge", O.NotNull)
def * = (id, urlThumb, urlLarge)
}
这是将代码直接绑定到驱动程序。我希望它与驱动程序无关,即与任何JdbcProfile驱动程序一起工作。我发现的唯一方法是将驱动程序传递给DAO类
class SlickDAO(val driver: JdbcProfile) {
import driver.simple._
问题是,如果我想用共享行为定义一些特征,例如CRUDSupport,我不能为该特征设置参数,我只能创建一个抽象类。因此,我很好奇,使用Slick-2编写DAL的推荐方法是什么?我确信这是蛋糕模式,但我在Scala方面还不够高级,无法实现它。我不知道Slick的具体情况,但是有标准的Scala方法来解决这个问题 我不能为trait设置参数,我只能创建一个抽象类 但是你可以
trait SlickDAO {
val driver: JdbcProfile
import driver.simple._
...
}
后来
class SlickDAOImpl(val driver: JdbcProfile) extends SlickDAO
或
然而,在traits中使用abstractval
s可能会导致初始化顺序出现问题,所以我更喜欢
trait SlickDAO {
// can still be implemented as a val
def driver: JdbcProfile
// can't import driver.simple._, you'll have to write the prefix explicitly
...
}
或
看看:
以及:
这可能会有帮助。我找到了一个使用这种精确方法的示例:
trait SlickDAO {
// can still be implemented as a val
def driver: JdbcProfile
// can't import driver.simple._, you'll have to write the prefix explicitly
...
}
trait SlickDAO {
def getDriver: JdbcProfile
lazy val driver = getDriver
import driver.simple._
...
}