将 mysql 记录集中的多列转换为数组

Converting multiple columns from mysql recordset into Array

在 Scala 2.12 中,我尝试将 MySQL 查询中的两列转换为两个数组,然后将这两个数组组合成一个数组,如下所示

val url = "jdbc:mysql://00.0.0.00:3306/dataanalysis"
val driver = "com.mysql.jdbc.Driver"
val username = "xxxx"
val password = "yyyy"
var connection:Connection = _

  Class.forName(driver)

  connection = DriverManager.getConnection(url, username, password)
  val statement = connection.createStatement
  val rs1 = statement.executeQuery("" +
    "select BBK,date_format(min(date(AAA)),'%Y%m%d') as AAA from OPER_MEMB_AAAD " +
    "where AAF between '2020/07/01' and '2020/07/31' " +
    "group by BBK order by BBK")

val strBBKArray=new Iterator[String] {
    def hasNext = rs1.next()
    def next() = rs1.getString(1)
 }.toArray

val strAAAArray=new Iterator[String] {
  def hasNext = rs1.next()
  def next() = rs1.getString(2)
}.toArray

val strRs1Array=数组(strBBKArray,strAAAArray)

它适用于 BBK 列,但不适用于 AAA。

val strBBKArray: Array[String] = Array(1211212,2324324...
val strAAAArray: Array[String] = Array()

当我在 strBBKArray 之前用元素填充 strAAAArray 时,列 AAA 被转换为数组但没有 BBK。我的猜测是迭代器到达第一列的 rs1 的底部,当我想再次迭代时它没有找到更多记录。如何让迭代器回到 rs1 的第一行,或者有更好的方法将多列记录集转换为一个数组?

也许我在这里完全糊涂了。但是你知道当你执行 next() 时你实际上是在从迭代器中删除元素吗?如果您想对其进行两次迭代......也许您可以尝试在对其进行迭代之前创建它的副本。然后迭代第二个?或者你可以使用 next()

之外的其他迭代
  val rs1 = statement.executeQuery("" +
    "select BBK,date_format(min(date(AAA)),'%Y%m%d') as AAA from OPER_MEMB_AAAD " +
    "where AAF between '2020/07/01' and '2020/07/31' " +
    "group by BBK order by BBK")

val rs2 = rs1.clone

val strBBKArray=new Iterator[String] {
    def hasNext = rs1.next()
    def next() = rs1.getString(1)
 }.toArray

val strAAAArray=new Iterator[String] {
  def hasNext = rs2.next()
  def next() = rs2.getString(2)
}.toArray

您可以在 Scala 文档中阅读更多关于 Scala 中迭代器如何工作的信息,尤其是 next():docs.scala-lang.org/overviews/collections/iterators.html

否则,我个人会使用 map 或“toArray”(如果存在)。我不知道 mysql 记录集有什么用处。检查您拥有的库和方法:)

最后我是这样搞的。尽管它比我预期的要复杂,但它确实有效。如果有人有更好的解决方案。随意post它,我会在测试后勾选你的答案。

 val rs1 = statement.executeQuery("" +
    "select BBK,AAA from OPER_MEMB_AAAD order by BBK")

while (rs1.next()){
  strBBKArrayRs1+=rs1.getString(1)
  strAAAArrayRs1+=rs1.getString(2)
}

val rs2 = statement.executeQuery("" +
  "select BBK,AAB from MIDD_MEMB_AAAJ order by BBK")

while (rs2.next()){
  strBBKArrayRs2+=rs2.getString(1)
  strAAAArrayRs2+=rs2.getString(2)
}

val strRs1Array=ArrayBuffer(strBBKArrayRs1,strAAAArrayRs1)
val strRs2Array=ArrayBuffer(strBBKArrayRs2,strAAAArrayRs2)