Scala数据库操作
2015-10-13 21:20
232 查看
Scala各种数据库操作的框架已经出来了,例如:ScalaQuery、O/R
Broker 、Squeryl 等。但是,我看过的Scala编程书从未有介绍数据库操作的章节,于是就很好奇,查了一些资料,最终自己写了一个简单的基于Scala的数据库操作代码。
闲言少叙,下面直接看代码吧。
总之,Scala对数据库的操作时调用Java的API来完成的,从这里也可以看到Scala与Java的无缝结合。我想这也许是为什么Scala编程书上没有相关数据库操作的内容的原因吧。
完整的代码(用的是MySQL数据)我已经托管到了GitHub上,并且源代码中还包含了JDBC的代码,二者可以对比。
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的代码,二者可以对比。
相关文章推荐
- jdbc中的Statement和PreparedStatement接口对象
- Android之获取手机上的图片和视频缩略图thumbnails
- 数据库链接字符串查询网站
- Windows下Scala环境搭建
- DB2实例管理
- DB2实例管理
- 保障MySQL数据安全的14个最佳方法
- mysql问答汇集
- 创建一个空的IBM DB2 ECO数据库的方法
- Access 2000 数据库 80 万记录通用快速分页类
- 开通一个数据库失败的原因的和解决办法
- 一个简单的asp数据库操作类
- CentOS下DB2数据库安装过程详解
- EasyASP v1.5发布(包含数据库操作类,原clsDbCtrl.asp)第1/2页
- sql2008 还原数据库解决方案
- Oracle 数据库自动存储管理-安装配置
- Oracle 数据库 临时数据的处理方法
- 数据库分页查询语句数据库查询
- 最近比较流行的数据库挂马