首页/新闻资讯/正文详情

Play Framework 2.4 迁移指南:Anorm 独立化与新版本特性全解析

发布时间:2026/9/24 12:07:36 来源:云帆数科 栏目:资讯中心
Play Framework 2.4 迁移指南:Anorm 独立化与新版本特性全解析
后端Web框架【免费下载链接】playframeworkThe Community Maintained High Velocity Web Framework For Java and Scala.项目地址https://gitcode.com/gh_mirrors/pl/playframework点击查看免费下载本指南基于 Play Framework 2.4 迁移文档中关于 Anorm 的章节系统讲解 Anorm 从 Play 核心中独立出来之后的依赖配置方式以及 2.4 时代 Anorm 在BatchSql重构、行解析 API、流式处理、类型映射等方面的全部新特性。读完本文你将掌握 Anorm 2.4 迁移所需的所有改动点并能用索引取值、fold/foldWhile/withResult、数组与多值参数等新 API 编写更简洁、更安全的 SQL 访问代码。背景Anorm 从 Play 核心中独立出去在 Play 2.4 中Anorm 被从 Play 的核心中抽离出来成为一个独立管理、拥有自己生命周期可以独立发版、独立演进的单独项目。这一变化与同版本中 Ebean、Play specs2 支持、数据库 evolutions 支持被拆分为独立模块的思路一致——让各个数据库相关组件能够按照自己的节奏演进而不受 Play 主版本发布周期的约束。关于这次大版本迁移的整体背景可参见 Play 2.4 迁移指南 与 Play 2.4 新特性概览其中 Highlights24 的 Anorm 小节 以要点形式概括了本节介绍的全部新特性。添加 Anorm 依赖由于 Anorm 已不再是 Play 核心的组成部分迁移的第一步就是在构建配置中显式声明对它的依赖。在build.sbt中加入libraryDependencies org.playframework.anorm %% anorm % 2.6.7其中%%会根据项目的 Scala 版本自动选择对应的构建产物。Anorm 的完整版本列表可以从 Maven 中央仓库的org.playframework.anorm组下查询注意本文不提供外部链接请在构建工具或 Maven 仓库页面中检索该坐标。版本兼容性提醒Anorm 2.4.0 起要求 Java 8。最后一个兼容 JDK 1.6 或 1.7 的版本是 Anorm 2.3.9。如果你仍在旧版 JDK 上运行必须停留在 2.3.9 及以下版本。这与 Play 2.4 整体弃用 Java 6/7、要求 Java 8 的决策是一致的。值得一提的是在 Play 2.4 及之前的时代anorm还可以作为 Play 自带依赖通过PlayImport直接引入。仓库中的 build.sbt 示例 展示了这种经典写法libraryDependencies Seq( jdbc, anorm, ehcache )从 Play 2.5 起官方推荐显式声明独立坐标即上面的org.playframework.anorm写法两种方式在你所迁移的目标版本中择一使用即可。ChangesBatchSql 构造方式重构新版本 Anorm 包含大量修复与改进。其中最重要的 API 破坏性变化源于 BatchSQL #3016 这一提交SqlQuerycase class 被重构为 trait 伴生对象的形式。随之而来的后果是BatchSql不再接受预先构造的SqlQuery实例而是直接传入原始 SQL 语句由BatchSql内部完成创建与校验。import anorm.BatchSql // 迁移前直接传入 SqlQuery 实例2.4 起不再被接受无法编译 BatchSql(SqlQuery(SQL)) // 迁移后传入原始 SQL 字符串 BatchSql(SQL) // 更简单、更安全因为 SqlQuery 会在内部被创建并校验从源码结构看这一重构把SQL 语句是否合法、参数占位符是否匹配的校验逻辑收敛到了BatchSql内部统一执行从而避免了调用方绕过校验直接构造SqlQuery的隐患。迁移时只需把所有BatchSql(SqlQuery(...))写法改为BatchSql(...)即可。Parsing行解析能力增强按列索引取值现在可以从Row上通过列索引直接获取值适合列名冗长或列位置固定的场景val res: (String, String) SQL(SELECT * FROM Test).map(row rowString - rowString // 字符串列 #1 和 #2 )按标签label统一解析列解析现在按标签统一处理无论该标签是列名name还是别名alias都走同一套解析逻辑不再区分两种来源val res: (String, Int) SQLSELECT text, count AS i.map(row rowString - rowInt )这里的count AS i是一个聚合函数别名列在 2.4 之前这类标签的解析路径与普通列名不同现在已完全统一。新增 fold 与 foldWhile面向结果流的折叠操作这是 Anorm 2.4 新增的流式 API用于对结果集逐行做累积计算返回Either[List[Throwable], T]左侧是所有执行过程中收集到的异常列表右侧是折叠结果。fold会处理结果流中的每一行val countryCount: Either[List[Throwable], Long] SQLSelect count(*) as c from Country.fold(0l) { (c, _) c 1 }foldWhile则允许在满足条件时提前终止例如只读取前 100 本书名val books: Either[List[Throwable], List[String]] SQL(Select name from Books).foldWhile(List[String]()) { (list, row) if (list.size 100) (list - false) // 停止返回当前 list else (list : rowString) - true // 继续追加一个书名 }注意foldWhile的折叠函数返回值是一个二元组(acc, continue)第一元是累积值第二元是布尔标记false表示停止遍历。这种设计让提前截断 部分处理如分页、限量加载变得非常直接。新增 withResult自定义结果流解析器如果fold/foldWhile仍不够灵活可以用withResult提供完全自定义的流解析器。它把游标Cursor交给你的函数由你自行决定何时停止、如何处理每一行import anorm.{ Cursor, Row } annotation.tailrec def go(c: Option[Cursor], l: List[String]): List[String] c match { case Some(cursor) if (l.size 100) l // 自定义上限部分处理 else { val row cursor.next() go(cursor.next(), l : rowString) } case _ l } val books: Either[List[Throwable], List[String]] SQL(Select name from Books).withResult(go(_, List.empty[String]))该示例演示了与游标配合的尾递归annotation.tailrec写法遍历过程中可以施加任意自定义逻辑如数量上限、条件过滤到达流末尾None时返回累积结果。withResult是fold/foldWhile之外面向高阶定制场景的通用入口。类型映射Type mappings更丰富的列与参数转换数组Array / List支持当某列的类型是 JDBC 数组java.sql.Array时Anorm 现在可以把它映射为数组或列表Array[T]或List[T]前提是元素类型T本身支持列映射import anorm.SQL import anorm.SqlParser.{ scalar, * } // 引入数组与元素解析器 import anorm.Column.{ columnToArray, stringToArray } val res: List[Array[String]] SQL(SELECT str_arr FROM tbl).as(scalar[Array[String]].*)同时还提供了便捷的数组解析函数SqlParser.arrayT与SqlParser.listT用于显式声明按数组或列表解析。反过来如果 JDBC 语句期望一个数组参数java.sql.Array也可以直接传入Array[T]只要元素类型T受支持val arr Array(fr, en, ja) SQLUPDATE Test SET langs $arr.execute()多值参数Multi-value parameter新增了将List[T]、Set[T]、SortedSet[T]、Stream[T]和Vector[T]作为多值参数传入的转换配合IN ({param})写法可以避免手工拼接 SQLSQL(SELECT * FROM Test WHERE cat IN ({categories})) .on(categories - List(1, 3, 4)) SQL(SELECT * FROM Test WHERE cat IN ({categories})) .on(categories - Set(1, 3, 4)) SQL(SELECT * FROM Test WHERE cat IN ({categories})) .on(categories - SortedSet(a, b, c)) SQL(SELECT * FROM Test WHERE cat IN ({categories})) .on(categories - Stream(1, 3, 4)) SQL(SELECT * FROM Test WHERE cat IN ({categories})) .on(categories - Vector(a, b, c))on(categories - ...)中的符号categories对应 SQL 中的命名占位符{categories}。传入Set/SortedSet时元素的去重与排序由集合本身语义保证实际展开为 SQL 列表参数。数值与布尔类型转换的修订基础类型数值、布尔的列转换得到改进。一些原本不合理的转换被移除迁移后以下写法将不再被接受列类型JDBC 类型转为JVM/Scala 类型DoubleBooleanIntBoolean同时新增了大量数值/布尔转换扩展了列类型支持列类型JDBC 类型转为JVM/Scala 类型BigDecimalBigIntegerBigDecimalIntBigDecimalLongBigIntegerBigDecimalBigIntegerIntBigIntegerLongBooleanIntBooleanLongBooleanShortByteBigDecimalFloatBigDecimalIntBigDecimalLongIntShortBigDecimal可以看出新转换以数值精度提升/缩窄为主线如Int↔Long、BigDecimal↔BigInteger互相转换并允许布尔值与数值互转Boolean→Int/Long/Short。做迁移测试时应重点检查原先依赖Double/Int转Boolean的代码。二进制与大对象Binary and large data二进制列bytes、stream、blob新增了映射为Array[Byte]或InputStream的转换↓JDBC / JVM➞Array[Byte]InputStream¹Array[Byte]YesYesBlob²YesYesClob³NoNoInputStream⁴YesYesReader⁵NoNo类型java.io.InputStream类型java.sql.Blob类型java.sql.Clob类型java.io.Reader表格原文如此指流式输入源类型java.io.Reader文本型字符流不映射为二进制二进制与大对象同样可以作为参数传入JVMJDBCArray[Byte]Long varbinaryBlob¹BlobInputStream²Long varbinaryReader³Long varchar类型java.sql.Blob类型java.io.InputStream类型java.io.Reader注意Clob/Reader这类字符型大对象不会转换为Array[Byte]/InputStream二进制视角而是作为文本参数以Long varchar传递二者语义不可混用。其他改进MiscJoda Time新增从Long、Date或Timestamp列到 JodaInstant或DateTime的转换。UUID 解析可将文本列解析为UUID值SQL(SELECT uuid_as_text).as(scalar[UUID].single)。可空参数对可空参数传None已标记为废弃应改用类型安全的Option.empty[T]以便在编译期保留明确的元素类型信息// 废弃写法 .on(param - None) // 推荐写法 .on(param - Option.empty[String])实践提示在 Play 应用中使用 Anorm配合本次迁移还有两点实践建议值得一并落实显式声明依赖并核对版本确认目标 Anorm 版本满足 Java 8 要求并将构建中的anorm依赖更新为独立坐标或按你所迁移的 Play 版本选用PlayImport的anorm条目参考 build.sbt 示例。使用自定义执行上下文执行 JDBC 操作Anorm 的 SQL 执行属于阻塞式 JDBC 操作官方数据库指南 AccessingAnSQLDatabase 明确建议通过CustomExecutionContext如DatabaseExecutionContext来执行避免占用 Play 的渲染线程池文档中还给出了以物理核心数估算 JDBC 连接池大小的建议连接数 ≈ 物理核心数 × 2 磁盘轴数。迁移检查清单构建中添加org.playframework.anorm %% anorm依赖版本满足 Java 8 要求所有BatchSql(SqlQuery(...))改为BatchSql(...)检查Double/Int转Boolean的列转换代码2.4 起已移除将None可空参数改为Option.empty[T]新代码优先使用索引/标签取值、fold/foldWhile/withResult、数组与多值参数等新 API数据库操作迁移到自定义ExecutionContext上执行赞分享后端Web框架【免费下载链接】playframeworkThe Community Maintained High Velocity Web Framework For Java and Scala.项目地址https://gitcode.com/gh_mirrors/pl/playframework点击查看免费下载相关推荐Play 2.3 新特性全解析Activator、sbt-web 资产管线、Java 8 与 WS 独立化Play 2.3 新特性全解析Activator、sbt web 资产管线、Java 8 与 WS 独立化 Play 2.3 是 Play Framework后端Web框架Wagtail 2.4 版本特性全解析Starter Page、页面数量上限、image_url 与升级迁移指南Wagtail 2.4 版本特性全解析Starter Page、页面数量上限、image_url 与升级迁移指南 Wagtail 2.4发布于 2018 年CMS后端ComfyUI版本更新解析新特性与迁移指南ComfyUI版本更新解析新特性与迁移指南 版本概览 ComfyUI当前最新版本为0.3.61可通过 comfyui_version.py https://人工智能大模型媒体生成本地部署创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

FPGA高速数据回传实战:CYUSB3014与GPIF II配置指南
FPGA高速数据回传实战:CYUSB3014与GPIF II配置指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 12:07:36

2026年真实测评三款手机变声器:无杂音
2026年真实测评三款手机变声器:无杂音

今天真实无广给大家测评三款变声器,从大家关心的音质,广告,声线,功能等等去测评一、三款手机变声器1、叮咚变声器优势:500声线,男变女,女变男转变自然,御姐,少年&#xf… · 2026/9/24 12:07:05

CCNP交换实战笔记:VLAN/STP/HSRP可验证配置与排错指南
CCNP交换实战笔记:VLAN/STP/HSRP可验证配置与排错指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 12:07:05

STM32调试新方案:VS Code + Cortex-Debug + OpenOCD实战指南
STM32调试新方案:VS Code + Cortex-Debug + OpenOCD实战指南

1. 为什么我最终把STM32调试从Keil搬到了VS Code说句实话,做嵌入式这些年,最开始我压根没想过用VS Code来调试STM32。入门的习惯就是Keil,打开软件、编译、点个Debug按钮、看个变量,流程也顺。但真正让我下决心换的,是… · 2026/9/24 23:57:00

基于H桥与Simulink的150V/4A双极输出DC-AC逆变器设计与仿真
基于H桥与Simulink的150V/4A双极输出DC-AC逆变器设计与仿真

1. 从需求到方案:150V/4A双极输出DC-AC系统的整体设计思路1.1 这个项目到底要做什么先把需求翻译成工程语言。标题里说得很清楚:用H桥MOSFET做开关,电感器做滤波,R和C做负载,最终目标是产生150V的双极输出和4A的双极电… · 2026/9/24 23:57:00

STM32调试实战:环境搭建、时钟配置与串口通信避坑指南
STM32调试实战:环境搭建、时钟配置与串口通信避坑指南

STM32这芯片,说它简单吧,库函数一调就能跑;说它难吧,硬件环境、时钟配置、调试工具链随便哪个环节出幺蛾子,都能让你在电脑前坐到怀疑人生。这些年我前前后后经手了十几个基于STM32的项目,从刚开始的F103C8… · 2026/9/24 23:57:00

NSGA-III求解微电网多目标优化调度的Matlab实现与解析
NSGA-III求解微电网多目标优化调度的Matlab实现与解析

1. 项目概述与核心逻辑做微电网优化调度的人,基本都绕不开多目标这个问题。一个微电网系统里,既要让运行成本尽量低,又要让污染物排放尽量少,可能还得兼顾蓄电池的寿命损耗、系统的电压稳定性……这些目标之间往往是互相打架的&am… · 2026/9/24 23:57:00

NSGA-III算法求解微电网多目标优化调度:Matlab建模、实现与避坑实战
NSGA-III算法求解微电网多目标优化调度:Matlab建模、实现与避坑实战

最近刚把一套NSGA-III算法跑进了微电网调度场景里,前后折腾了两周,终于把整套Matlab代码调通了。这篇就来盘一盘从问题建模、算法原理到代码实现,再到结果分析和避坑经验的全过程。目标读者是正在做微电网多目标优化调度,或者准备… · 2026/9/24 23:56:54

基于SpringBoot的流浪猫狗救助领养管理系统开发指南
基于SpringBoot的流浪猫狗救助领养管理系统开发指南

做这类基于 SpringBoot 的流浪猫狗救助领养管理系统,看着是个典型的 Java 毕业设计题目,但真要做到能跑、能答辩、能扩展,里头的门道并不比企业级项目少。我前后带过几届毕业生做类似课题,也帮人 review 过不少代码,今… · 2026/9/24 23:56:41

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码