在scala中訪問postgresql(使用sbt),scalapostgresql
預設已經安裝了scala和SBT,並且對sbt有基本瞭解,知道怎樣用sbt建立一個工程。
添加依賴
要在scala中使用postgresql資料庫,需要匯入postgresql驅動相關的庫檔案,postgresql的庫檔案,可以去其官網上下載,一定要下載和你的scala、Jdk對應的版本。現在有兩種途徑可以在scala工程編譯時間添加這個postgresql庫:
1. 自己下載這個依賴庫,是一個jar檔案,把這個檔案放到sbt工程目錄下的lib\下
2. 不用自己下載這個依賴庫,在build.sbt中聲明依賴這個檔案,在編譯的過程中sbt會自動下載這個庫檔案,並添加這個庫。在sbt的協助檔案中告訴了如何添加這個依賴的文法
libraryDependencies += groupID % artifactID % revision % configuration
那麼現在問題來了,我只知道我需要postgresql,哪裡知道groupID、artifactID這些東東是什麼,給大家一個匯合了許多庫檔案的網站, 在這個網站中搜尋postgresql,在搜尋結果中就給出了postgresql驅動庫的groupID、artifactID這些資訊
根據這些資訊,就知道應該在build.sbt檔案中這麼寫依賴項了
libraryDependencies += “org.postgresql” % “postgresql” % “9.4-1201-jdbc41” % “provided”
整個build.sbt就是
name := "Task3"version := "1.0"scalaVersion := "2.10.5"libraryDependencies += "org.postgresql" % "postgresql" % "9.4-1201-jdbc41" % "provided"
這麼寫了之後,編譯應該不會出問題了,使用sbt package可以講工程打包成jar。但是仍然不能運行,運行會出現class not found之類的錯誤。因為還需要把postgresql依賴庫檔案的位置添加到Java的classpath中,這樣運行就不會出問題了。
使用postgresql基本查詢
val conn_str = "jdbc:postgresql://IP地址:連接埠號碼/資料庫名稱"classOf[com.mysql.jdbc.Driver] // 使用上一句可能會有warning,因為這是一個運算式,可以換成下面的// Class.forName("org.postgresql.Driver").newInstanceval conn = DriverManager.getConnection(conn_str, "使用者名稱稱", "密碼")val conn = DriverManager.getConnection(conn_str)try { // Configure to be Read Only val statement = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY) // Execute Query val rs = statement.executeQuery("SELECT quote FROM quotes LIMIT 5") // Iterate Over ResultSet while (rs.next) { println(rs.getString("quote")) } } finally { conn.close }
表操作(Insert,update,delete)
val dbc = "jdbc:mysql://localhost:3306/DBNAME?user=DBUSER&password=DBPWD" classOf[com.mysql.jdbc.Driver] // 這是另外一種寫法,把使用者名稱和密碼都寫在一起 val conn = DriverManager.getConnection(dbc) val statement = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE) // do database insert try { val prep = conn.prepareStatement("INSERT INTO quotes (quote, author) VALUES (?, ?) ") prep.setString(1, "Nothing great was ever achieved without enthusiasm.") prep.setString(2, "Ralph Waldo Emerson") prep.executeUpdate } finally { conn.close }