后端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),仅供参考
