0
def jdbcReader(user: String, pwd: String, url: String, id: Int): List[mutable.Map[String, String] = {
   var KeyVal = mutable.Map[String, String]()

   var connection: Connection = null
   try {

      connection = DriverManager.getConnection(url, user, pwd)
      val statement = connection.createStatement()
      val resultSet = statement.executeQuery("SELECT Nam, Value FROM tablename WHERE id=?".replace("?", id.toString))
      while (resultSet.next()) {
         val name = resultSet.getString("Nam")
         val value = resultSet.getString("Value")
         // println("name , value = " + name + ", " + value)
      }

   } catch {
      case e => e.printStackTrace()
         val t = e.getMessage()
   }
}

如何将元素添加到地图列表并从此方法返回?我相信你已经知道我是 Scala 的新手

4

1 回答 1

0

该代码有很多导致清晰度问题的问题,但我会尽我所能回答您的问题。

def jdbcReader(user:String,pwd:String, url: String, id:Int): Map[String, String] ={

   try {

      val connection = DriverManager.getConnection(url, user, pwd)
      val statement = connection.createStatement()
      val resultSet = statement.executeQuery(s"SELECT Nam, Value FROM tablename WHERE id=${id.toString}")


      resultSet.map(e => (e.getString("Name"), e.getString("Value")).toMap

       //Or if you want a hashmap
       // resultSet.map(e=>(e.getString("Name"), e.getString("Value")).groupBy(_._1).map { case (k,v) => (k,v.map(_._2))}


   } catch {
     case e : Exception => 
       e.printStackTrace()
       val t = e.getMessage()      
    }
 }

我们不建议在 Scala 中使用var 。像以往一样,除非你真的,真的必须这样做。因此,我们不会尝试获取结果并将它们添加到地图中,而是会在旅途中使用这些条目构建地图。

1)我们获取结果并将它们映射到键和值的元组(对)

2)只需调用 .toMap 将其转换为地图

2.1)也可以做一个groupBy,基本上就是把这些pairs全部key分组,然后调用.map构造一个HashMap

请注意,我会建议一些对新手来说可能稍微先进的想法,但是我强烈建议您花时间熟悉这些想法,因为它们将来会对您有很大帮助

如果将来出于任何原因需要更新此 Map,您应该研究函数组合的想法,您将在其中构造一个新的、更新的 Map 实例并将其传递到它需要通过组合的任何地方。或者,在绝对必须保持共享状态的情况下,请查看State Monadscats.effect.Ref

此解决方案假定 resultSet 是一个集合。但是我不得不说,我很难相信一个数据库操作,只是返回。该操作可能应该包含在 IO 中并返回一个未来,整个事情应该返回一个 Either 或 Try。我们也不喜欢在 Scala 中抛出异常。我将把这些作为练习留给你,因为这些建议超出了问题的范围。

于 2019-11-05T16:01:26.523 回答