在使用jdbc的时候不免遇到需要批量插入或者更新的场景,对于batch操作,scalikejdbc的官方文档写的不是太清楚,特此写文档进行记录。
scalikejdbc的配置方式可以参考这篇文章:设置HikariCP作为scalikejdbc连接池 或者参考官方文档
scalikejdbc提供的批量操作的方法名为:batchByName,该方法接收Seq[(Symbol, Any)]*类型作为参数,我们可以构造Seq[Seq[(Symbol, Any)]]参数,然后使用:_*将外层Seq转为可变参数。
我写了一个可以将scala case class转为Seq[(Symbol, Any)]的函数:
val getParams: Product => Seq[(Symbol, Any)] = (cc: Product) => cc.getClass.getDeclaredFields.map(v => Symbol(v.getName)).zip(cc.productIterator.to).toSeq
然后就可以通过这个函数把我们的参数转换为scalikejdbc需要的参数,然后进行批量操作了,代码如下:
这里与单条执行的sql不同的是,不支持${}占位符,对于参数名称需要使用{}包起来,不然无法正确识别
def saveCustToDB(cust: Seq[TableEntity]): Unit = {
//初始化连接池
initDbPool()
//转换参数
val params = cust.map(getParams)
DB localTx { implicit session =>
sql"""
insert into Table (f1, f2)
VALUES ({f1}, {f2})
"""
.batchByName(params:_*)
.apply()
}
}