Scala数据库操作

Scala各种数据库操作的框架已经出来了,例如:ScalaQuery、O/R Broker 、Squeryl 等。但是,我看过的Scala编程书从未有介绍数据库操作的章节,于是就很好奇,查了一些资料,最终自己写了一个简单的基于Scala的数据库操作代码。

1.连接数据库

和Java没有太大的不同,还是定义数据库四个几个参数,操作步骤和JDBC一样样儿的。唯一需要注意的一点是:JDBC中Class.forName()换成了classOf[com.mysql.jdbc.Driver],并且“com.mysql.jdbc.Driver”是不能加引号的

闲言少叙,下面直接看代码吧。

package edu.wzm.db.scala

import java.sql.Connection
import java.sql.DriverManager
//import java.sql.PreparedStatement
//import java.sql.ResultSet

/**
 * Created by GatsbyNewton on 2015/10/12.
 */
object DBUtils {

  val url = "jdbc:mysql://localhost:3306/test"
  val username = "root"
  val password = "admin"

  classOf[com.mysql.jdbc.Driver]

  def getConnection(): Connection = {
    DriverManager.getConnection(url, username, password)
  }

  def close(conn: Connection): Unit = {
    try{
      if(!conn.isClosed() || conn != null){
        conn.close()
      }
    }
    catch {
      case ex: Exception => {
        ex.printStackTrace()
      }
    }
  }

//  def close(rs: ResultSet): Unit = {
//    try {
//      if(!rs.isClosed() || rs != null){
//        rs.close()
//      }
//    }
//    catch {
//      case ex: Exception => {
//        ex.printStackTrace()
//      }
//    }
//  }
//
//  def close(pstm: PreparedStatement): Unit = {
//    try {
//      if(!pstm.isClosed() || pstm != null){
//        pstm.close()
//      }
//    }
//    catch {
//      case ex: Exception => {
//        ex.printStackTrace()
//      }
//    }
//  }

}
看完代码后,可能有小伙伴会问“为啥把ResultSet和PreparedStatement的close代码注释掉”,在下面ACID的操作中就会发现原因。

2.ACID操作

package edu.wzm.db.scala

import scala.collection.mutable
import scala.collection.mutable.ArrayBuffer

/**
 * Created by GatsbyNewton on 2015/10/12.
 */
class Operators {

  case class User(id: String, name: String, age: Int)

  //Insert operator
  def add(user: User): Boolean = {
    val conn = DBUtils.getConnection()
    try{
      val sql = new StringBuilder()
        .append("INSERT INTO user(id, name, age)")
        .append("     VALUES(?, ?, ?)")
      val pstm = conn.prepareStatement(sql.toString())
      pstm.setObject(1, user.id)
      pstm.setObject(2, user.name)
      pstm.setObject(3, user.age)

      pstm.executeUpdate() > 0
    }
    finally {
      conn.close()
    }
  }

  //Delete operator
  def delete(id: String): Boolean ={
    val conn = DBUtils.getConnection()
    try{
      val sql = "DELETE FROM user WHERE id = ?"
      val pstm = conn.prepareStatement(sql)
      pstm.setObject(1, id)

      pstm.executeUpdate() > 0
    }
    finally {
      DBUtils.close(conn)
    }
  }

  //Update operator
  def modify(user: User): Boolean ={
    val conn = DBUtils.getConnection()
    try{
      val sql = "UPDATE user SET age = ? WHERE id = ?"
      val pstm = conn.prepareStatement(sql)
      pstm.setObject(1, user.age)
      pstm.setObject(2, user.id)

      pstm.executeUpdate() > 0
    }
    finally {
      DBUtils.close(conn)
    }
  }

  //Select operator
  def query(id: Int): ArrayBuffer[mutable.HashMap[String, Any]] = {
    val conn = DBUtils.getConnection()
    try{
      val sql = new StringBuilder()
        .append("SELECT name, age")
        .append("  FROM user")
        .append(" WHERE id >  ?")
      val pstm = conn.prepareStatement(sql.toString())
      pstm.setObject(1, id)
      val rs = pstm.executeQuery()

      val rsmd = rs.getMetaData()
      val size = rsmd.getColumnCount()
      val buffer = new ArrayBuffer[mutable.HashMap[String, Any]]()
      while (rs.next()){
        val map = mutable.HashMap[String, Any]()
        for(i <- 1 to size) {
          map += (rsmd.getColumnLabel(i) -> rs.getString(i))
        }
        buffer += map
      }

      buffer
    }
    finally {
      conn.close()
    }
  }
}
看完代码,大家会发现JDBC中的JavaBean被Scala的case class所替代。另外,批量删除的代码我没写,基本上和JDBC中的批量删除没有差别。

总之,Scala对数据库的操作时调用Java的API来完成的,从这里也可以看到Scala与Java的无缝结合。我想这也许是为什么Scala编程书上没有相关数据库操作的内容的原因吧。


完整的代码(用的是MySQL数据)我已经托管到了GitHub上,并且源代码中还包含了JDBC的代码,二者可以对比。

你可能感兴趣的:(数据库,scala,jdbc)