在使用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()
}
}