这篇文章摘自mysql asyn作者的博客,博客地址

开头有一个简单示例,然后是一个在play上的应用。例子我并没有跑过,但是仍能学到不少东西。

object BasicExample {
def main(args: Array[String]) {
// 这个Parser我发现好像用不了。。
val configuration = URLParser.parse("")
val connection: Connection = new PostgreSQLConnection(configuration) //阻塞等待连接
Await.result(connection.connect, seconds) //sendQuery直接就执行了,不像slick那样,还要单独的run
val future: Future[QueryResult] = connection.sendQuery("SELECT * FROM USERS") val mapResult: Future[Any] = future.map(queryResult => queryResult.rows match {
case Some(resultSet) => {
val row: RowDat = resultSet.head
row()
}
//注意,这里的-1是Any而不是Future[Any]
case None => -
}) val result = Await.result(mapResult, seconds)
println(result)
//关闭数据库链接
connection.disconnect
}
}

The basic usage pattern is quite simple, you ask for something, you get a future[_] back. The PostgreSQLConnection is a real connection to database. it implements the Connection trait and you should try to use the trait as much as possible.

When you create a connection handler, it's not connected to the db yet, you have to connect it yourself calling connect and waiting for the future to return or composing on the future to do something else.

下面是一个play app. 包括MVC模型。因为Controller牵扯了太多play的知识,我就暂时不抄了,只把持久化部分写上。

这个持久化实现了ResultSet到case class的mapping,虽然是手动进行的,但是写的非常好。如果能使用implicit写mapping应该会更加优雅。

此外,一个play app应该选用connection pool而不是每次用到数据库都重新建立连接。下面给出了用法。

// 需要提前创建好数据库,id应该是自增的
case class Message(id: Option[Long], content: String: LocalDate = LocalDate.now()) object MessageRepository {
val Insert = "INSERT INTO messages (content, moment) VALUES(?, ?)"
val Update = "UPDATE messages SET content = ?, moment = ? WHERE id = ?"
val Select = "SELECT id, content, moment FROM messages ORDER BY id asc"
val SelectOne = "SELECT id, content, momment FROM messages WHERE id = ?"
} // 这个有点dependency injection的意思
class MessageRepository(pool: Content) {
import MessageRepository._ def save(m: Message): Future[Message] = {
// queryResult => m 是什么意思
case Some(id) => pool.sendPreparedStatement(Update, Array(m.content, m.moment, id)).
map { queryResult => m }
case None => pool.sendPreparedStatement(Insert, Array(m.content, m.moment)).
map { queryResult => m }
} def list: Future[IndexSeq[Message]] = {
pool.sendQuery(Select). map {
//rows 返回resultSet, get返回什么呢,返回的是 Iterator 类型的东西么
queryResult => queryResult.rows.get.map {
item => rowToMessage(item)
}
}
} def find(id: Long): Future[Option[Message]] = {
//[Any] 非得加么
pool.sendPreparedStatement(SelectOne, Array[Any](id)).map {
queryResult =>
queryResult.rows match {
case Some(rows) =>
Some(rowToMessage(rows.apply()))
case None => None
}
}
} private def rowToMessage(row: RowData): Message = {
new Message(
id = Some(row("id".asInstanceOf[Long]))
content = row("content").asInstanceOf[String]
moment = row("moment").asInstanceOf[LocalDate]
)
}
}

对于mysql的每一张表,都应该有一个这样的插入语句,对于多表join的情况,可能要单独处理吧。

上面实现了DAO,下面一小段代码可以充当配置文件来用,相当于dependency injection

object Global extends GlobalSettings {
private val databaseConfiguration = System.getenv("DATABASE_URL") match {
case url: String => URLParser.parse(url)
case _ => new Configuration(
username = "postgres"
database = Some("databasename")
port =
)
} // factory 还有mysql专用版么
private val factory = new PostgreSQLFactory(databaseConfiguration)
private val pool = new ConnectionPool(factory, PoolConfiguration.Default)
val messageRepository = new MessageRepository( pool ) // play 的东西,普通的程序不晓得如何处理close问题
override def onStop(app: Application)
pool.close
}

对于一般的程序,用connectionPool要好一点,但是要注意,不能直接在connectionPool上应用transacation。当需要用到transacation时,从connectionPool中获取一个connection,还要记得还回去。

mysql asyn 示例的更多相关文章

  1. JAVA使用jdbc连接MYSQL简单示例

    以下展示的为JAVA使用jdbc连接MYSQL简单示例: import java.sql.DriverManager; import java.sql.ResultSet; import java.s ...

  2. Mysql语句示例

    Mysql语句示例 最常用 sql 语句总结 前言 Mysql 是数据库开发使用的主要平台之一.sql 的学习掌握与使用是数据库开发的基础,此处展示详细sql 语句的写法,及各种功能下的 sql 语句 ...

  3. MySQL安装示例数据库

    MySQL安装示例数据库 本文档演示如何下载及安装MySQL示例数据库sakila及employees数据库 1. 安装sakila数据库 1.1 下载sakila数据库 wget http://do ...

  4. mysql死锁示例

    MySQL有三种锁的级别:页级.表级.行级. MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking):BDB存储引擎采用的是页面锁(page-level locki ...

  5. 创建MySQL存储过程示例

    创建MySQL存储过程是学习MySQL数据库必须要掌握的知识,下文对创建MySQL存储过程作了详细的介绍,供您参考学习. AD:2013大数据全球技术峰会课程PPT下载 下文将教您如何创建MySQL存 ...

  6. mysql 视图示例

    基本操作 建立视图 CREATE VIEW view_test(qty,price,total) AS SELECT quantity,price,quantity*price FROM t; 多表视 ...

  7. SpringBoot+MyBatis+Mysql 详细示例

    SpringBoot与MyBatis整合,底层数据库为mysql的使用示例  项目下载链接:https://github.com/DFX339/bootdemo.git   新建maven项目,web ...

  8. mysql 函数示例(转)

    MySQL函数大全及用法示例 1.字符串函数ascii(str)   返回字符串str的第一个字符的ascii值(str是空串时返回0)  mysql> select ascii('2');   ...

  9. MySQL操作示例

    """ MySQL综合练习作业 """ # 1.自行创建测试数据: # 创建数据库 """ create da ...

随机推荐

  1. 经典JS

    用apply把document当作this传入getId函数,帮助“修正”this; document.getElementById = (function (func) { return funct ...

  2. PriorityQueue的Java实现

    借助heap数据结构实现. 以小顶heap为例(说明值越小优先级越高,如距离),代码如下: // PriorityQueue.java // Java Spatial Index Library // ...

  3. 卡片式ViewPager,一屏展示多个pager item,设置高度不一致的tabBar

    ViewPager的基本用法不必多说,这都很简单,我们可以在ViewPager中加载一个ImageView,也可以加载一个Fragment,这都是目前非常常见的用法.那么我今天说的是ViewPager ...

  4. java 模拟一个单向链表

    class Node { //当前节点 private String data; //下个节点 private Node next; //当前节点 public void setData(String ...

  5. CI框架 -- 文件结构

    这个本来是很基础的东西,基本上用过CI的人都知道这些,原本是不消说的~但是因为毕业论文是关于CodeIgniter的,所以我必须把大大小小的东西都写出来做成记录~ CodeInigter,一个轻量,功 ...

  6. 使用ConcurrentLinkedQueue惨痛的教训【转】

    转自:http://blog.csdn.net/jackpk/article/details/49634577 服务端原本有个定时任务对一个集合ArrayList 中的消息做处理. 因为考虑到处理消息 ...

  7. 7款效果惊人的HTML5/CSS3应用

    今天是周末,我为大家收集7个比较经典的HTML5/CSS3应用,每一个都提供源代码,效果非常惊人. 1.CSS3/jQuery创意盒子动画菜单 作为前端开发者,各种各样的jQuery菜单见过不少,这款 ...

  8. 如何解析oracle执行计划

    要执行任何SQL语句,Oracle 必须推导出一个“执行计划”.查询的执行计划是 Oracle 将如何实现数据的检索,以满足给定 SQL 语句的描述.它只不过是其中包含的步骤及它们之间关系的顺序树.执 ...

  9. CentOS7 防火墙配置(关闭)

    CentOS7 的防火墙配置跟曾经版本号有非常大差别,经过大量尝试,最终找到解决这个问题的关键 CentOS7这个版本号的防火墙默认使用的是firewall.与之前的版本号使用iptables不一样. ...

  10. js 1+'2' == '1'+'2'

    前言 非常深入地讲解了包含隐式转换时js计算过程,全篇干货.本文由@keenjaan授权分享. 本文由@仙人掌推荐分享 正文从这里开始 你有没有在面试中遇到特别奇葩的js隐形转换的面试题,第一反应是怎 ...