这篇文章摘自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, 5 seconds)//sendQuery直接就执行了,不像slick那样,还要单独的runval 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.headrow(0)}//注意,这里的-1是Any而不是Future[Any]case None => -1})val result = Await.result(mapResult, 5 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(0)))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     = 5433)}// 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. db2 springboot 整合_springboot的yml配置文件通过db2的方式整合mysql代码示例

    本篇文章小编给大家分享一下springboot的yml配置文件通过db2的方式整合mysql代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. s ...

  2. Mysql函数示例(如何定义输入变量与返回值)

    Mysql 函数示例 简介 基于mysql实现函数的编写,如何定义输入变量,如何定义和使用返回值等. 获取男女信息 --1 获取男女信息 CREATE FUNCTION getGender(idcar ...

  3. php上传查询excel到mysql_PHP上传Excel文件导入数据到MySQL数据库示例

    PHP上传Excel文件导入数据到MySQL数据库示例2020-06-20 00:34:11 最近在做Excel文件导入数据到数据库.网站如果想支持批量插入数据,可以制作一个上传Excel文件,导入里 ...

  4. php mysql事务实例_PHP + MySQL事务示例

    PHP + MySQL事务示例 我真的没有找到正在使用MySQL事务的PHP文件的正常示例. 你能告诉我一个简单的例子吗? 还有一个问题. 我已经做了很多编程,但没有使用交易. 我可以在header. ...

  5. golang连接mysql操作示例增删改查

    golang本身没有提供连接mysql的驱动,但是定义了标准接口供第三方开发驱动.这里连接mysql可以使用第三方库,第三方库推荐使用https://github.com/Go-SQL-Driver/ ...

  6. Bluemix云端数据库服务ClearDB MySQL使用示例———Python开发投票程序

    越来越多的服务走向云端,看不见摸不着,让没接触过的我感觉有些茫然,IBM的云平台Blumemix上提供了很多服务,我这里就把学习使用ClearDBMySQL Database服务的过程给大家分享一下. ...

  7. mysql函数示例_mysql函数备忘单和示例

    mysql函数示例 There are a ton of functions provided by MySQL and most of them are used extensively. I wi ...

  8. Qt数据库练习之QSqlTableModel的使用(MySql数据库示例,含源码+注释)

    文章目录 一.操作示例 1.1 修改记录(数据) 1.2 添加记录(数据) 1.3 删除记录(数据) 1.4 取消操作 1.5 排序操作 1.6 查询操作 二.了解QSqlTableModel 三.源 ...

  9. adodb mysql.inc.php,php adodb操作mysql数据库示例(增删改查)

    php adodb操作mysql数据库示例(增删改查) 发布于 2014-10-05 08:16:18 | 113 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: H ...

最新文章

  1. 如何读论文才不至于发疯?
  2. c语言一对圆括号不能,C语言单元习题集
  3. 怎样取消连续包月自动续费_苹果手机连续包月会员怎么取消 设置iPhone解除应用自动续费...
  4. libfacedetection库 yufacedetectnet-open-v1.prototxt详解
  5. 7种主流案例,告诉你调度器架构设计通用法则(干货!)
  6. python小工具自动审单录凭证_跟着老板工作了二十年,最近来了个新员工然后我被开除了...
  7. 自学python考哪些证书-【经验分享】想转行学python,过来人提醒大家几点
  8. 怎么将tflite部署在安卓上_手把手教程:如何从零开始训练 TF 模型并在安卓系统上运行...
  9. Windows清理助手ARSWP
  10. iOS 15 导航栏(Navigation)变白(导航栏不见)
  11. RecyclerView加载了那么多图,为什么就是不崩呢?
  12. ICDE‘22推荐系统论文之Research篇
  13. 数据结构和算法学习网站
  14. 华人捕鱼可不可以把死鱼的几率调试的简单一点
  15. linux系统调用创建无名管道,linux 无名管道pipe和有名管道FIFO
  16. 澳洲值得代购物品汇总
  17. TCP在FIN_WAIT1状态到底能持续多久以及TCP假连接问题
  18. WKT、SRID、EPSG概念
  19. ## 微信web开发者工具网络连接失败解决办法,基本百分百成功
  20. 安徽科技学院 信网学院网络文化节 王鑫

热门文章

  1. 旷视冲刺科创板IPO获通过!距离上市仅一步之遥,拟募资60.18亿
  2. 小冰超级自然语音技术发布!PK真人真假难辨,同时获独角兽轮融资
  3. 首款脑机接口耳机来了!预售1300元,可监测注意力,「意念」切歌、接电话
  4. 滚蛋吧,流量!红利已见顶,是时候步入「留量时代」了
  5. 今年芯片行业最大收购案:亚德诺209亿美元收购美信,对抗行业老大德州仪器...
  6. 量子计算竞速时代,如何拨动时间的指针
  7. 5、Makefile基础知识汇总(转自陈皓总述)
  8. Python的流程控制 - for序列
  9. Kudu command tools
  10. eclipse 怎么关闭 show children