日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

mysql asyn 示例

發布時間:2023/12/24 综合教程 29 生活家
生活随笔 收集整理的這篇文章主要介紹了 mysql asyn 示例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這篇文章摘自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那樣,還要單獨的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(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 示例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 谁有毛片网站 | 中文字幕欧美日韩 | 国产黄色特级片 | 国产18禁黄网站免费观看 | 成年人网站免费在线观看 | 国产区精品在线 | 91国模 | 嫩草视频在线免费观看 | 欧美精品v国产精品v日韩精品 | 男同毛片 | 致命弯道8在线观看免费高清完整 | 日韩欧美在线免费观看 | 可以看的黄色网 | 国产六区 | 免费在线观看一区二区 | 精品国产无码在线观看 | 91网入口| 我要看一级片 | 日本少妇毛茸茸 | 欧美狠狠干 | 日韩小视频 | 亚洲影院在线播放 | 国产亚洲精品成人 | 久久精品9| 国产aa视频| 国产精品久久久久久久久免费相片 | 男人舔女人下部高潮全视频 | 国产又色又爽无遮挡免费 | 天天操夜夜操视频 | 久久成年人视频 | 欧美日韩一区二区中文字幕 | www色视频 | 亚洲AV蜜桃永久无码精品性色 | 一区二区高清 | 日韩一区二区视频在线观看 | 依人综合 | 亚洲乱亚洲乱 | 99久久99九九99九九九 | 日韩欧美精品一区二区 | 国产一级免费看 | 国产网站黄 | 成年人福利网站 | 国产福利社 | 久久都是精品 | 日韩精品一区二区在线看 | 两个人看的www视频免费完整版 | 中字av在线| 美女伦理水蜜桃4 | 日韩福利片在线观看 | 日本久久爱 | jvid在线 | 玉女心经在线看 | 欧美精品色呦呦 | 波多野结衣在线观看一区 | 哺乳期喷奶水丰满少妇 | 一本在线免费视频 | 精品一区二区久久久久久按摩 | 亚洲网色 | 亚洲区视频在线观看 | 天堂在线观看中文字幕 | 国产精品后入内射日本在线观看 | 天天弄天天干 | 国产精品69久久久 | 亚洲精品一区久久久久久 | 久久99精品国产.久久久久 | av在线三区 | 粉嫩在线 | 香蕉视频黄色 | 国产精品高潮AV无码 | 99久久精品国产亚洲 | 日韩视频播放 | 色涩久久 | 精品免费av | 影音先锋一区 | 久久久久久99精品 | 亚洲视频在线观看免费视频 | 簧片av| 杂技xxx裸体xxxx欧美 | 日韩乱码人妻无码中文字幕久久 | 少妇高潮一区二区三区99 | 先锋av资源网 | www成年人| 一久久久 | 51人人看| 美女啪啪国产 | 风流还珠之乱淫h文 | 欧美日韩成人一区 | 欧美综合一区 | 天天操天天爽天天射 | 好吊日av| 第四色激情 | 亚洲熟妇av一区二区三区漫画 | 国产经典一区二区三区 | 男人吃奶视频 | 国内久久久| 丝袜综合网 | 国内精品人妻无码久久久影院蜜桃 | 日韩视频三区 | 日韩操操 |