2011年6月2日木曜日

[Scala]ScalaでPostgreSQLを操作する - ごにょごにょ編

さて、環境もできたのでごにょごにょしましょう。
今回はJDBCを使用してPostgreSQLを操作します。
通信とかDB周りってぜーんぜん詳しくないので(笑)
ツッコミどころがおおくてごめんね☆

さて、まずは自作関数を。
Scalaプログラミング入門という本を使って書いてみます。

DBをいじる際に重要になるのはやっぱりOPEN/CLOSEなので
そのあたりを軽くしてみるのでこんなものを。

Control.scala
object Control {
  def using[A <: {def close(): Unit}, B](param: A)(f: A => B): B =
    try {
      f(param)
    } finally {
      param.close()
    }

    import scala.collection.mutable.ListBuffer
    def bmap[T](test: => Boolean)(block: => T): List[T] = {
      val ret = new ListBuffer[T]
      while(test) ret += block
      ret.toList
    }
}

教科書のまるぱくり。いえいえ、写経ですから。
上のコードではusingという関数をつくってますね。
これは読んだらとじてくれます。finallyわすれをしないためですね。

つづいての関数はSQLで取得したアイテムをListに落としてくれるためのものです。

自作関数はできたので、使用例を。


Person.scala
case class Person(name:String,mailaddress:String)

object Person {
  import Control._
  import java.sql._
  
  def selecter(conn : Connection) : List[Person] = 
    using(conn.createStatement) {st =>
      using(st.executeQuery("select name, mailaddress from PersonDB")) { rs =>
        bmap(rs.next) {
          new connectionDB(rs.getString("name"), rs.getString("mailaddress"))
        }
      }
    } 
}

すごーくすっきりなものになりました。
ここでは実際のSQL文を書いております。
そして取得したフィールドをListにして返却してますね。


さらにこれを使用します。
教科書はここから書いてなかったのでここからは素人的な書き方になります。

Console.scala
object Console {
  import connectionDB._
  import java.sql.DriverManager
  
  def main(args: Array[String]): Unit = {
    Class.forName("org.postgresql.Driver")
    val db = DriverManager.getConnection(
   "jdbc:postgresql://{ホスト名}/{データベース名}",
   "{アカウント}",
   "{パスワード}")
 val list = selecter(db)
 db.close
    
 list.foreach(i => println(i))
 
  }

}

取得したリストをコンソールに表示するだけの簡単なお仕事。
なんですが。ものすごーく初心者のような書き方になっています。
もっと腕をあげたいですね。

実行すると
Person(hoge,hogehoge@hoge.com)
というような出力をされますよ。

0 件のコメント:

コメントを投稿