JDBC数据库连接与事务处理常见坑:DB2环境下从权限到PreparedStatement的排查指南
简介来自吉林大学《数据库应用程序开发》课程的实验报告面向正在学习Java数据库编程的在校学生和初级开发者。资源围绕使用Java连接IBM DB2数据库展开详实记录了三项核心任务的实现过程补充教材中的JDBC程序片段、修改labstaff查询程序、修改labupdate更新程序并扩展到图形界面插入、空值显示、异常对话框提示、任意行列修改等进阶实验。报告覆盖了建立数据库连接、创建语句对象、执行查询与更新、遍历结果集、关闭自动提交进行事务管理、捕获并分析SQL异常等关键知识点。调试部分记录了多种典型错误和对应解决办法包括用户权限不足、对象名称错误、字段放大后溢出、自动提交关闭导致修改不生效等能帮助读者避开同样的坑。资源为单个doc文档压缩包大小仅1.76MB便于直接阅读或打印。已有898人学习下载适合用于完成数据库课程实验、撰写实验报告或复习JDBC基础知识。1. 数据库应用开发实验一份 JDBC 报告里凑齐的常见坑数据库应用开发实验我拆过不少这一次 8 个任务的 JDBC 项目却把最典型的翻车点凑了个遍权限不足、Schema 写错、事务没提交、数值溢出、别名占用表名、异常信息看不懂。表面上是给学生练手的作业题实际是 DB2 环境下 Java 与数据库交互的全流程排查手册。对我这种写业务代码的人最有价值的反而不是 SQL 本身而是那些错误记录——输入 20 时为什么溢出、怎么定位到 salary 字段、为什么 executeUpdate 返回成功但库里数据没变。新手照着跑一遍能避开大半雷区熟手可以直接翻到自己关心的章节看结论。2. 实验环境与权限修复驱动加载、GRANT 授权与 Schema 全限定名任务 1 的起点是「把 P171 页程序片段补充完整」但真正动手时第一道坎不在代码逻辑而在环境。DB2 实验环境里连接用的账号、表属主、驱动类名三者不匹配程序就只能停在报错阶段。这一章把环境层面的三个环节拆开讲。2.1 驱动加载与连接串的参数含义实验用的连接语句是经典老写法Class.forName(COM.ibm.db2.jdbc.app.DB2Driver); Connection sample DriverManager.getConnection(JDBC:db2:sample, db2admin, db2admin);第一行Class.forName的作用是把 DB2 的 JDBC 驱动类加载进 JVM。这个COM.ibm.db2.jdbc.app.DB2Driver是 DB2 自带的 Type 2 驱动走本机协议不用配网络端口。第二行DriverManager.getConnection的三个参数分别是连接 URL、用户名、密码。实验里用户密码都是 db2admin实际项目不会这么写但初学阶段先跑通比考虑安全更重要。URL 第三段sample是 DB2 示例数据库的别名连的是本机实例里那个叫 SAMPLE 的库。要注意这个别名大小写敏感写错会直接抛SQLException。Type 2 驱动加载后DriverManager 会自动注册所以Class.forName在 JDBC 4.0 之后可以省略但保留下来能让报错更直观——类名拼错时第一时间能定位到驱动问题。2.2 权限不足的固定解法GRANT 授权程序刚跑起来最常见的报错是db2admin没有访问 EMPLOYEE 表的权限。DB2 的权限模型里表属于某个模式Schema模式所有者之外的账号要访问表必须被显式授权。实验中的处理方式是登录 EMPLOYEE 表的属主账号把查询和操作权限授给 db2admin。GRANT SELECT, INSERT, UPDATE, DELETE ON EMPLOYEE TO db2admin;这条语句在实验环境里执行一次就够了。需要注意两点第一必须以表的属主身份登录执行普通用户没有 GRANT 的权限第二授权粒度可以细化到列但实验场景没必要直接按表授权更省事。如果后续改了表结构授权一般会保留不必重复执行。2.3 Schema 全限定名TEMPL 未定义名称的根因命令行执行 JAVA 文件时报DB2ADMIN.TEMPL未定义这个报错很典型。原因是 JDBC 连接建立后默认当前模式Schema取的是登录用户名。db2admin 登录裸写 TEMPL 就会被解析成DB2ADMIN.TEMPL而实验里的 TEMPL 对象实际归属于实验专用的那个模式。修复方式是改成全限定名SELECT * FROM LAB.TEMPL;代码里凡是涉及 TEMPL 和 staff 的地方都统一改成LAB.TEMPL、LAB.staff。这个坑在连接串正确的情况下最容易踩到因为报错信息说的是「未定义名称」新手容易误以为是表不存在实际是模式前缀缺失。我一般会在项目开头定义一个常量保存模式名字符串拼接时统一带上避免散落各处改漏。提示DB2 里SELECT * FROM TEMPL和SELECT * FROM LAB.TEMPL是两回事。前者由当前登录用户决定解析路径后者是绝对定位。排查未定义名称错误时先确认是不是 Schema 前缀的问题。3. JDBC 查询链路Statement、ResultSet 与 next() 边界任务 2 是修改 labstaff.java任务 8 又回头补 labstaff1.java 的九个答题点。这两件事本质是同一套查询链路连库、建 Statement、执行查询、取 ResultSet、遍历。这一章把这条链路里的关键动作拆到代码级。3.1 查询最小可运行模板把任务 8 里那九个答题点组合成完整代码就是下面这个模样import java.sql.*; public class LabStaffQuery { public static void main(String[] args) { try { Class.forName(COM.ibm.db2.jdbc.app.DB2Driver); Connection sample DriverManager.getConnection(JDBC:db2:sample, db2admin, db2admin); PreparedStatement stmt sample.prepareStatement( select id, name, salary from LAB.staff where Dept ?); int mydeptno 20; stmt.setInt(1, mydeptno); ResultSet rs stmt.executeQuery(); boolean more rs.next(); while (more) { System.out.println( rs.getInt(id) rs.getString(name) rs.getBigDecimal(salary)); more rs.next(); } rs.close(); stmt.close(); sample.close(); } catch (Exception e) { e.printStackTrace(); } } }prepareStatement里的?是参数占位符stmt.setInt(1, mydeptno)把第一个占位符替换成变量 mydeptno。这里用 PreparedStatement 而不是 Statement一是避免拼接 SQL 注入风险二是有预编译缓存重复执行时效率更高。executeQuery返回 ResultSet此时游标停在第一行之前必须调next()才能取第一行数据。salary 字段在 DB2 里是小数字段用getBigDecimal而不是getDouble能避免浮点精度问题。查询配了where Dept ?参数类型要跟表结构匹配mydeptno 传 intDB2 会自动处理。3.2 next() 的返回值游标移动与边界判断实验里特意写了两次boolean more rs.next()这是在强调 next() 的双重语义一是把游标从当前行移到下一行二是返回新行是否存在。第一次调用从初始位置移到第一行返回 true 表示有数据第二次调用移到第二行如果表里只有一行数据返回 false循环自然退出。常见的错误写法是把 next() 放在 while 条件里却忘了先取第一行或者循环体里多调了一次 next() 导致跳行。我常用的模式是while (rs.next()) { // 处理当前行 }这种写法最简洁但实验要求用more变量承接是为了让新手看清游标移动过程。两种写法等价重点是理解 next() 每调一次就会丢掉上一行的引用——如果需要保留上一行数据要先存到变量里。3.3 SQLWarning容易被忽略的软错误任务 8 第 7 问是「If SQLWarning occurs display the warning」。SQLWarning 和 SQLException 的区别在于SQLException 是硬错误SQL 执行失败SQLWarning 是软提示语句能执行但有截断、弃用特性等警告信息。SQLWarning SQLWarn null; if ((SQLWarn stmt.getWarnings()) ! null) { System.out.println(Warning: SQLWarn.getMessage()); }这段代码从 Statement 对象上取第一个警告。如果存在警告会顺着getNextWarning()链往下串联SQLWarning warn stmt.getWarnings(); while (warn ! null) { System.out.println(warn.getMessage() , warn.getSQLState()); warn warn.getNextWarning(); }getWarnings()有个特点读取过结果集后Statement 上的警告会被清空。所以要先取警告再遍历 ResultSet顺序反了就拿不到。这一小段代码在作业里是凑点数在真实项目里查数据截断时却很有用——尤其是把超长字符串写进窄字段时DB2 可能只告警不报错。4. 更新与事务排查PreparedStatement、事务提交与溢出的三个坑任务 3 是 labupdate.java表面是改 salary 字段实际牵出了事务开关、记录是否存在、数值溢出三个问题。这一章把更新链路的代码写全再按踩坑记录逐个展开。4.1 参数化更新与事务开关import java.sql.*; public class LabUpdate { public static void main(String[] args) { Connection sample null; PreparedStatement pstmt null; try { Class.forName(COM.ibm.db2.jdbc.app.DB2Driver); sample DriverManager.getConnection(JDBC:db2:sample, db2admin, db2admin); sample.setAutoCommit(false); String sqlstmt update LAB.staff set salary salary * 1.01 where dept ?; pstmt sample.prepareStatement(sqlstmt); pstmt.setInt(1, 15); int updateCount pstmt.executeUpdate(); System.out.println(updated rows: updateCount); sample.commit(); } catch (SQLException x) { int SQLCode x.getErrorCode(); String SQLState x.getSQLState(); String Message x.getMessage(); System.err.println(SQLCode SQLCode SQLState SQLState Message Message); } } }setAutoCommit(false)是把自动提交关掉之后每条 SQL 都在事务里累积直到手动commit()才会写入数据库。executeUpdate()返回受影响行数updateCount 为 0 表示没有匹配到记录。这里 salary 用salary * 1.01做比例放大是实验里验证溢出问题的手段日常需求里常见做法是直接赋新值。4.2 坑一更新执行成功但数据库没变现象程序输出 affected rows 为 1但回到 DB2 命令行查 staff 表salary 还是旧值。原因setAutoCommit(false)之后没有调用commit()事务一直处于未提交状态程序结束时未提交事务被回滚。DB2 的默认行为是隐式提交但一旦手动关掉自动提交就必须负责收尾。解决在executeUpdate()之后调用sample.commit()或者把setAutoCommit(false)改成setAutoCommit(true)。实验里的处理方式是改回 true一劳永逸真实项目里用事务控制时应该 commit 和 rollback 成对出现catch 块里记得rollback()。4.3 坑二输入 16 时更新 0 行现象程序把 mydeptno 设为 16执行成功但 updateCount 返回 0。原因staff 表里没有 dept 为 16 的记录。不是权限问题也不是 SQL 写错是数据本身不存在。解决先查询确认记录存在再做更新SELECT * FROM LAB.staff WHERE dept 16;实验里跑出 0 行后到 DB2 里一查就明白了。这个坑常被误判为更新语句写错实际是数据边界问题。我养成的习惯是更新类语句的返回结果一定打日志看到影响行数异常时第一反应是查数据而不是查 SQL 语法。4.4 坑三salary 放大后溢出现象把放大系数从 1.01 改成 2 后输入 15 和 20 都报类型转换溢出换成 1.01 则正常。原因salary 列在表定义时有精度上限。salary * 2 后部分行的值超过了列能容纳的最大值DB2 在执行更新时做类型转换发现超界直接抛异常。输入 16 时不溢出是因为 16 号记录不存在根本没走到数值计算这一步。解决用不同系数做对照实验确认溢出由数值放大引起。真实修复路径是修改列定义把 salary 字段的精度调大或者改用 DECIMAL 高精度类型ALTER TABLE LAB.staff ALTER COLUMN salary SET DATA TYPE DECIMAL(15,2);这个坑的价值在于报错信息写的是「类型转换溢出」但溢出发生在数据库列约束上而不是 Java 的 int 溢出。排查时先分清是哪一层溢出JVM 的 int 溢出通常发生在计算前DB2 的溢出发生在更新写入时。4.5 坑四异常信息只看 SQLState 不够现象catch 块里只打印了x.getMessage()得到一句「类型转换溢出」不知道具体是哪个字段、哪一行。原因单条异常信息不包含完整上下文DB2 的 SQLException 有三个属性errorCodeSQLCODE、SQLStateSQLSTATE、message消息文本组合起来才能定位。解决三个值都打印像 4.1 代码里那样。SQLCODE 是 DB2 特有的错误码SQLState 是标准五字符状态码message 是给人看的描述。真实项目里建议把这三元组写进日志文件排查问题时能直接关联到 DB2 诊断文档。5. 插入建模与 GUI 改造单行、多行、子查询与空值显示任务 5 和任务 6 从更新跳到插入要求做一个 GUI 插入程序支持单行插入、多行插入、子查询插入还要把空值显示成「空」。这一章不再局限于 JDBC 基础开始涉及界面层与 SQL 的配合。5.1 三种插入方式的 SQL 形态三种插入对应的是三种常见的 SQL 写法-- 单行插入一次插一条完整记录 INSERT INTO LAB.TEMPL (id, name, salary) VALUES (1, 样例数据, 1000); -- 多行插入一次插多条记录 INSERT INTO LAB.TEMPL (id, name, salary) VALUES (1, 行一, 1000), (2, 行二, 2000), (3, 行三, 3000); -- 子查询插入从别的表查数据填进来 INSERT INTO LAB.TEMPL (id, name, salary) SELECT id, name, salary FROM LAB.staff WHERE dept 20;单行和多行的区别只在 VALUES 子句的元组数量DB2 支持一个语句携带多个值元组。子查询插入适合做数据迁移把已有表的数据按条件灌进新表。实验的任务点是 GUI 里提供三种操作入口对应三条不同的 SQL 模板接口层做分支。5.2 无法创建 TEMPL 表别名占用了标识符实验里出现过一个诡异现象创建jlu.templ表时报错原因不是权限而是之前给 EMPLOYEE 表创建了别名为 TEMPL。DB2 里别名和表共享命名空间一个标识符被别名占用后不能再建同名的表。解决方式是先删别名再建表DROP ALIAS TEMPL;然后执行建表语句。这个坑看起来不起眼实际暴露的是 DB2 对象命名空间的管理规则表、视图、别名在同一个模式里不能重名。遇到「无法创建表」的报错时先查同模式里有没有已存在的同名对象SELECT TABNAME, TYPE FROM SYSCAT.TABLES WHERE TABSCHEMA LAB AND TABNAME TEMPL;TYPE 字段会区分表T、视图V、别名A一眼就能看出是哪种对象占用的名字。5.3 JOptionPane 封装输入输出GUI 改造的核心是把命令行输入换成对话框。JOptionPane 的showInputDialog返回字符串插入操作要把字符串解析成参数String input JOptionPane.showInputDialog(请输入记录格式id,name,salary); String[] parts input.split(,); int id Integer.parseInt(parts[0].trim()); String name parts[1].trim(); BigDecimal salary new BigDecimal(parts[2].trim()); PreparedStatement pstmt conn.prepareStatement( INSERT INTO LAB.TEMPL (id, name, salary) VALUES (?, ?, ?)); pstmt.setInt(1, id); pstmt.setString(2, name); pstmt.setBigDecimal(3, salary); pstmt.executeUpdate();多行插入的处理思路是把多条记录用分号或者竖线分隔循环拆分每一条走一次参数绑定。这里有三个容易踩的细节第一split(,)如果输入末尾有逗号会拆出空字符串Integer.parseInt()直接抛异常解析前要过滤空串第二salary 用 BigDecimal 构造不要用Double.parseDouble再转避免浮点误差第三showInputDialog 返回 null 表示用户点了取消提交前要先判空。5.4 空值显示为「空」实验要求结果集里所有空列都以「空」字显示不能出现 Java 的 null。典型场景是 staff 表某些行没有 COMM 佣金字段查询结果里rs.getString(comm)返回 null直接拼接字符串会输出 null。String value rs.getString(i); if (value null) { System.out.print(空\t); } else { System.out.print(value \t); }这段逻辑也可以封装成工具方法public static String formatValue(String value) { return value null ? 空 : value; }放在循环里逐列调用。要注意的是rs.getString(i)对数据库 NULL 返回 Java null对空字符串返回空串两者要分开理解。实验里「空」是对 NULL 的显示替代不是把数据改成空字符串。6. 异常处理与任意行列修改把 SQLException 变成看得懂的对话框任务 7 要求把违反约束、类型不匹配、溢出等异常用对话框弹出来任务 8 要求实现对结果集任意行、任意列的修改。异常处理那段代码是所有实验任务里最值得搬进真实项目的。先看异常信息的完整取值catch (SQLException x) { int SQLCode x.getErrorCode(); // DB2 SQLCODE String SQLState x.getSQLState(); // 标准状态码 String Message x.getMessage(); // 可读描述 JOptionPane.showMessageDialog(null, 错误码: SQLCode \n状态: SQLState \n信息: Message); }getErrorCode()拿到的是 DB2 特有的错误码getSQLState()是通用的五字符状态码。违反约束、类型不匹配、溢出的 SQLState 前缀不同实验里用对话框显示只是为了教学直观真实项目更常见的做法是写日志并返回给调用方。我一般会把这三元组封装成异常工具类保证每个 catch 块都打印完整。关于任意行任意列修改有一个通用技巧用 ResultSetMetaData 拿列数再逐列遍历取值这样能写出不对列名硬编码的通用结果集处理器ResultSetMetaData rsmd rs.getMetaData(); int columnCount rsmd.getColumnCount(); while (rs.next()) { StringBuilder row new StringBuilder(); for (int i 1; i columnCount; i) { String value rs.getString(i); if (value null) { row.append(空); } else { row.append(value); } if (i columnCount) { row.append( | ); } } System.out.println(row.toString()); }这个遍历方法能处理任意结果集列名写死是最容易翻车的写法——表结构一变程序就崩。从那以后我每次写 JDBC 更新代码都强制先把 setAutoCommit 状态打出来再在三段式 try-catch 里写全错误码、状态和消息。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Ornith-1.5 对位 DeepSeek V4:‘叫板‘的底气到底有几分

Ornith-1.5 对位 DeepSeek V4:‘叫板‘的底气到底有几分

Ornith-1.5 对位 DeepSeek V4:叫板的底气到底有几分 【免费下载链接】Ornith-1.5-35B-A3B-GGUF 项目地址: https://ai.gitcode.com/hf_mirrors/ornith-ai/Ornith-1.5-35B-A3B-GGUF 2026 年 8 月,DeepReinforce 发布 Ornith-1.5 系列,…

2026/10/15 8:25:57 阅读更多 →
TC3系列芯片I2C中断深度解析:汽车级可靠性设计与实战

TC3系列芯片I2C中断深度解析:汽车级可靠性设计与实战

1. 项目概述与核心需求解析1.1 为什么I2C中断在TC3系列芯片上值得单独拿出来讲TC3系列芯片在汽车电子领域的应用非常广泛,从车身控制模块到动力总成传感器接口,几乎每个ECU里都能找到它的身影。而I2C总线作为板级通信的“老黄牛”,承担着传感…

2026/10/15 8:26:03 阅读更多 →
OpenClaw Windows 可视化安装教程:零基础新手也能一次跑通的配置清单

OpenClaw Windows 可视化安装教程:零基础新手也能一次跑通的配置清单

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

2026/10/15 8:59:14 阅读更多 →

最新新闻

Advanced Installer 15.2汉化实践:Windows安装包多语言工程化落地

Advanced Installer 15.2汉化实践:Windows安装包多语言工程化落地

简介:Advanced Installer 15.2汉化版是一款面向Windows平台开发者与系统管理员的专业级安装包制作工具,解决传统MSI打包流程复杂、本地化支持弱、跨环境部署兼容性差等痛点,适用于.NET、Java、SQL Server等多技术栈项目的自动化部署场景。资源…

2026/10/15 20:24:58 阅读更多 →
轻量级中文词典HTTP服务:Flask+SQLite构建NLP数据预处理基础设施

轻量级中文词典HTTP服务:Flask+SQLite构建NLP数据预处理基础设施

简介:这是一份面向中文自然语言处理、前端词典应用开发及汉字教学研究者的汉语词典结构化数据集,提供21104个汉字与符号的完整属性标注。资源以JSON为主(共28个),涵盖全量字段的full.json、轻量版slim.json、纯字表wor…

2026/10/15 20:24:58 阅读更多 →
Spring Boot 整合 Shiro 实现数据库权限认证

Spring Boot 整合 Shiro 实现数据库权限认证

1. 项目概述:为什么在 Spring Boot 里非得用 Shiro 做权限控制?“shiro学习三(spring boot整合shiro读取数据库数据实现用户登录,权限认证)”——这个标题看似平实,但背后藏着一个非常典型的、几乎每个 Jav…

2026/10/15 20:24:58 阅读更多 →
边缘-云协同架构下低延迟数据传输优化实践

边缘-云协同架构下低延迟数据传输优化实践

我们团队在推进模拟项目X的过程中,面临过一个很现实的性能瓶颈:边缘端的数据要全部汇聚到云端处理,再决定是否下发控制指令。当节点数量从几十扩展到几百,链路波动、带宽占用、决策时延这些老问题全部被放大。后来我们花了大概三个…

2026/10/15 20:24:58 阅读更多 →
Python电磁场可视化实战:从电偶极子到射频调试

Python电磁场可视化实战:从电偶极子到射频调试

1. 这不是物理课,是“电磁场可视化”实战手记你有没有过这种体验:翻开《电磁场与电磁波》教材,第一页就看到麦克斯韦方程组的积分形式和微分形式并排而立,旁边还配着矢量算符∇、旋度curl、散度div——字都认识,连起来…

2026/10/15 20:24:58 阅读更多 →
Eviews时间序列分析实战:ARDL模型实现与边界检验全解析

Eviews时间序列分析实战:ARDL模型实现与边界检验全解析

简介:这是面向经济学、金融等专业研究者的一份Eviews操作指南,重点讲解自回归分布滞后(ARDL)模型在EViews 9及以上版本中的实现流程。内容系统覆盖工作文件创建、数据导入、取对数处理、单位根检验、ARDL模型估计以及Bounds协整检…

2026/10/15 20:23:57 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/15 9:49:14 阅读更多 →