在使用jdbc的时候不免遇到需要批量插入或者更新的场景,对于batch操作,scalikejdbc的官方文档写的不是太清楚,特此写文档进行记录。

scalikejdbc的配置方式可以参考这篇文章:设置HikariCP作为scalikejdbc连接池 或者参考官方文档

scalikejdbc提供的批量操作的方法名为:batchByName,该方法接收Seq[(String, Any)]类型作为参数,我们可以构造Seq[Seq[(String, Any)]]参数,然后使用:_将外层Seq转为可变参数。

我写了一个可以将scala case class转为Seq[(String, Any)]的函数:

def transformParams(cc: Product): Seq[(String, Any)] = {
  cc.getClass.getDeclaredFields.map(v => v.getName).zip(cc.productIterator.to).toSeq
}

然后就可以通过这个函数把我们的参数转换为scalikejdbc需要的参数,然后进行批量操作了,代码如下:
这里与单条执行的sql不同的是,不支持${}占位符,对于参数名称需要使用{}包起来,不然无法正确识别

def saveCustToDB(params: Seq[TableEntity]): Unit = {
  //初始化连接池
  initDbPool()
  //转换参数
  val newParams = params.map(transformParams)
  DB localTx { implicit session =>
    sql"""
         insert into table (f1, f2)
         VALUES ({f1}, {f2})
       """
      .batchByName(newParams:_*)
      .apply()
  }
}