资讯详情

JSP连接ACCESS数据库:JDBC-ODBC桥接方案详解

📅 2026/10/16 14:37:57 | 华诺云谱 👁 阅读
JSP连接ACCESS数据库:JDBC-ODBC桥接方案详解
简介JSP连接ACCESS数据库是Web开发中一种基础的数据交互方式常用于小型项目与课堂实验。教程面向Java Web初学者帮助读者快速掌握通过JDBC-ODBC桥驱动访问Access数据库的完整流程也适合需要完成课程设计的在校学生。内容以一个可运行的示例展开先建立包含uid和pwd文本字段的数据库再将数据库文件放入Tomcat的指定data目录接着编写JSP页面完成连接、查询和结果展示涵盖从数据库准备到页面输出的完整链路。文档不仅完整给出可直接运行的代码还逐段解释连接字符串构造、物理路径转换、驱动加载、资源关闭等关键环节并提示最常见的数据库连接错误及排错思路方便读者对照排查。同时指出Access更适合学习实践若迁移到MySQL等企业级数据库需更换驱动和连接方式有助于建立更系统的JDBC认知。压缩包内仅含1个doc格式文档大小约31KB内容高度浓缩示例代码可直接复制使用。目前已有240人学习下载值得正在自学JSP与数据库交互的读者参考。1. JSP 连接 ACCESS 数据库一份最轻量的 JDBC-ODBC 桥接样例JSP 连接 ACCESS 数据库听起来像十年前的产物但在今天的小型管理系统、课堂演示和内部表单场景里它依然是最省事的方案。Access 把数据直接存在一个 .mdb 文件里不需要单独安装数据库服务JSP 页面通过 JDBC-ODBC 桥读取文件内容整个项目里只有数据库文件和 JSP 两样东西。这份资源要做的事很明确创建 test.mdb里面建一张 username 表存 uid、pwd 两个文本字段把数据库文件放进 Tomcat 的 webapps\ROOT\data 目录再写一个 JDBCAccess.jsp负责加载驱动、建立连接、执行 select 查询并把结果输出到浏览器。适合刚接触 Web 开发的初学者也适合需要在内网机器上快速复现老项目的开发者跑通它等于把 JDBC 和 JSP 内置对象里最常用的一段流程完整走了一遍。2. 环境准备Access 建库、JDK 版本与 Tomcat 目录三件事这套代码能跑起来一半靠 JSP 代码一半靠运行环境。我见过不少人把代码原样粘进新项目结果驱动加载就抛异常。问题不在代码而在 JDK 版本、Access 驱动位数、数据库文件存放位置这三件事没对上。这一章先把环境铺好再进入代码拆解。2.1 技术底座JDBC-ODBC 桥的老原理与新限制JDBC-ODBC 桥的定位是让 Java 程序通过 JDBC API 访问任何带有 ODBC 驱动的关系型数据库。sun.jdbc.odbc.JdbcOdbcDriver 这个类把 JDBC 方法调用转换成 ODBC 调用再由 ODBC 层加载 Microsoft Access Driver (*.mdb) 去读写文件。整个过程里没有独立的数据库服务进程数据文件本身被当作数据库来处理。对 Access 这种轻量文件库来说这个机制几乎是零成本接入。这套桥接机制在 JDK 7 及以前一直是 JDK 自带的功能Class.forName(sun.jdbc.odbc.JdbcOdbcDriver) 可以直接加载成功。JDK 8 开始官方移除了这个桥接类理由是长期无人维护且官方建议改用厂商提供的原生驱动。因此想原样跑通这份样例最省事的是使用 JDK 6 或 JDK 7 配合对应版本的 Tomcat。JSP 页面里用到的语法都极其基础不依赖任何新版本特性旧环境反而更合适。先说一个实践中的认知误区不是“代码写对了就能连上”。Class.forName 只在 JDK 的类库里能找到这个类时才成功。机子上装的是 JDK 8第一行连接就会抛 ClassNotFoundException。这也是很多人在新环境复现老项目时遇到的第一个坎。所以拿到这份资源先别急着贴代码打开命令行执行 java -version看版本号是不是 8 以下。还有一点值得说明为什么不直接用 MySQL 或 PostgreSQL因为这份样例所在的场景里往往没有数据库管理员权限或者目标机器上根本没装数据库服务。Access 文件即库拷走一个 .mdb 文件就等于迁移了整个库这种便携性在演示、教学和单机内部工具里非常实用。它不适合做高并发在线业务这是后续二次开发时要有预期的地方。2.2 建库建表test.mdb 与 username 表怎么生成创建数据库文件建议用 Access 桌面版直接操作。如果没有安装完整 Office也可以装 Access Runtime 环境用空库入口创建文件。最终需要的产物只有一个test.mdb 内部有一张 username 表表里包含 uid 和 pwd 两个文本字段。这一步直接在 Access 的查询设计视图里执行一句建表 SQL 就能完成。CREATE TABLE username ( uid TEXT(50), pwd TEXT(50) );这段 SQL 建的表没有主键学习阶段足够用。字段大小写成 TEXT(50)是因为代码里的 rs.getString(uid) 本来就是按字符串读取50 的容量存放普通用户名和密码不会超长。生产级设计里通常还会给 uid 加唯一约束但本题场景保持原样更贴近样例本身。有一点需要提醒Access 的 SQL 方言和 MySQL 有不小差别它不支持在同一个建表语句里写 IF NOT EXISTS。重复执行上面的 SQL 会提示“数据库中已存在同名对象”。因此建表前先确认库是新创建的或者手动删掉旧表再重新建。建完表之后顺手往表里插入两条数据让 JSP 查询时有内容可显示。这步同样在 Access 查询视图中执行。INSERT INTO username (uid, pwd) VALUES (admin, 123456); INSERT INTO username (uid, pwd) VALUES (guest, guest);插入完成后可以打开表确认数据存在然后保存文件。注意保存时不要勾选需要登录才能打开库的选项否则 JSP 连接时会被拦在数据库认证这一步。2.3 数据库放哪getRealPath 的路径映射机制数据库文件做出来之后第二个关键步骤是放对位置。按这份样例的约定test.mdb 放在 Tomcat 的 webapps\ROOT\data 目录下。这里要特别注意ROOT 不是磁盘根目录而是 Tomcat 中默认 Web 应用上下文对应的目录也就是打开 http://localhost:8080 时访问的那个应用根目录。代码里使用 application.getRealPath(spath) 来获取物理路径。application 是 JSP 内置的 ServletContext 对象getRealPath 接收一个相对于当前 Web 应用根目录的虚拟路径返回对应的磁盘绝对路径。举个例子Tomcat 安装在 C 盘默认目录那么 getRealPath(data/test.mdb) 一般会得到类似 C:\Tomcat\webapps\ROOT\data\test.mdb 的结果。这个机制的价值在于你不需要在代码里写死机器路径部署到任何目录都能自动推导出数据库的真实位置。很多初学者习惯直接写 D:\test.mdb 这种绝对路径结果换一台机器就报文件找不到。改用 getRealPath 之后只要 .mdb 文件在 JSP 所在的同一个应用目录里路径推导就永远正确。这也解释了为什么必须在 ROOT 下建 data 目录——因为 JSP 部署在 ROOT 里相对路径以 ROOT 为基准。整个应用目录的最终形态如下webapps └── ROOT ├── JDBCAccess.jsp └── data └── test.mdb这里有一个 Windows 下容易被忽略的细节如果 Tomcat 被安装到 Program Files 这类需要管理员权限的目录下JSP 读取数据库一般没问题但后续要执行 insert 时可能会因为写权限不足而报“文件共享锁定数不够”。遇到时优先把 Tomcat 换到纯英文且无空格、无系统保护的目录里能省下不少折腾时间。3. 核心代码逐段拆解一个 JSP 页面走完连接到输出的完整链路样例里最核心的就是 JDBCAccess.jsp。它把完整链路切成四段加载驱动、建立连接、执行查询、输出结果。每一段都有对应代码下面把每一段的含义和参数说明展开讲。3.1 连接段url 拼装、驱动加载与建立连接整个 JSP 的入口先声明页面类型和导入 Java SQL 包然后是连接代码。下面是最核心的连接片段。try { String spath data/test.mdb; // 相对 Web 应用根目录的路径 String dbpath application.getRealPath(spath); // 将相对路径转成磁盘绝对路径 String url jdbc:odbc:Driver{Microsoft Access Driver (*.mdb)};DBQ dbpath; Class.forName(sun.jdbc.odbc.JdbcOdbcDriver); // 加载 JDBC-ODBC 桥驱动 Connection conn DriverManager.getConnection(url); // 建立数据库连接第一行的 spath 是相对于应用根目录的路径正斜杠在 Windows 下同样兼容。第三行把数据源名 dbname、用户名 user、密码 password 都留成空字符串因为 Access 文件型数据库默认不需要账号体系。真正的连接字符串由固定前缀和动态 DBQ 参数拼接而成。url 的值最终类似于 jdbc:odbc:Driver{Microsoft Access Driver (*.mdb)};DBQC:\Tomcat\webapps\ROOT\data\test.mdb。这里的每一段都不能写错。Driver 后面的花括号是 ODBC 驱动名的一部分删掉花括号 ODBC 管理器就识别不了驱动DBQ 是 Database Qualified 的缩写后面直接跟数据库文件的物理路径分号是参数分隔符路径里如果出现分号或者特殊字符就会引发解析问题。url 拼好后Class.forName 触发驱动的静态注册逻辑把 JdbcOdbcDriver 注册到 DriverManager 的驱动列表里随后 DriverManager.getConnection(url) 根据 url 前缀找到 ODBC 桥驱动完成连接。很多人在这一步容易踩到几个理解偏差。一是认为 Class.forName 返回的对象需要用变量接住其实这一步只为了触发类加载和注册返回值完全可以忽略。二是认为 DriverManager.getConnection 必须传用户名密码实际 Access 场景里直接传一个 url 参数就够了用户名密码留空即可。三是认为 url 里的 DBQ 可以写相对路径不行ODBC 驱动只认磁盘绝对路径这也是前面必须用 getRealPath 的原因。3.2 查询段Statement 的滚动参数与 ResultSet 取值连接建立后就是执行 SQL 查询并读取结果集。这一段是整份样例的输出核心。Statement stmt conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); ResultSet rs stmt.executeQuery(select * from username); while (rs.next()) { out.print(用户名: rs.getString(uid)); out.print( 密码: rs.getString(pwd) br); } out.print(br恭喜你数据库连接成功);conn.createStatement 接收两个常量参数ResultSet.TYPE_SCROLL_SENSITIVE 表示结果集可以双向滚动并且能感知到其他连接的更新ResultSet.CONCUR_UPDATABLE 表示允许通过结果集直接更新数据库。对于学习这个样例而言这两个参数可以用默认的 createStatement() 简写替代效果一致。这里特意写成完整参数是想展示 JDBC 结果集控制的完整能力。executeQuery 执行 select 语句并返回 ResultSet 对象。rs.next() 的作用是让游标向后移动一行返回 true 时表示当前行有数据返回 false 表示结果集已经读完。rs.getString(uid) 按列名从当前行取出 uid 字段的值也可以按列索引写成 rs.getString(1)。页面上的 out.print 是 JSP 内置对象 response 的简化输出方式最终输出到浏览器响应体里。这里有一个初学者很容易误会的现象如果 username 表是空表while 循环一次都不会进入页面只会显示最后的“恭喜你”一行。新手往往以为代码没生效实际上是因为表里没有数据。所以建库时往里插入两行测试数据页面一打开就能看到明确效果。关于关闭顺序代码里先 rs.close()再 stmt.close()最后 conn.close()三个关闭操作严格遵循由内到外的顺序。ResultSet 是建立在 Statement 之上的Statement 又依赖于 Connection反向关闭会导致底层资源释放不完整在高频访问时容易把数据库连接耗尽。虽然 JSP 页面结束时会自动清理本次请求的资源但养成手动关闭的习惯在写真正业务代码时非常重要。3.3 输出与异常错误信息如何暴露在页面上整段代码被一个 try-catch 包裹一旦任意一个环节出现异常catch 块会把异常信息输出到页面上。} catch (Exception e) { out.print(数据库连接错误,错误信息如下br); out.print(e.getMessage()); }catch 块里调用 e.getMessage() 而不是 e.printStackTrace()这是一个面向页面调试的取舍。getMessage() 返回的是异常的一句话描述适合直接显示给浏览器printStackTrace() 会把完整堆栈打到 Tomcat 控制台信息更全但对页面调试不友好。建议排查时两者配合先用 getMessage() 看清楚错误类型再翻控制台看具体栈帧。页面顶部的 contentTypetext/html; charsetgb2312 和 meta 标签声明了输出编码。gb2312 对简体中文够用但现代 Tomcat 默认以 UTF-8 解析 JSP 文件如果文件保存编码和页面声明不一致就会出现中文乱码。这个问题会在后面的避坑章节专门展开。4. 避坑指南驱动消失、路径空格、乱码和文件锁的排查经验下面把这份样例最常见的问题按“现象 → 原因 → 解决”逐条整理。这些都是实际部署时反复出现的照着排查能省下大半天的定位时间。现象一页面报 ClassNotFoundException: sun.jdbc.odbc.JdbcOdbcDriver。原因是 JDK 8 及以上已经移除了 JDBC-ODBC 桥驱动类不存在于类库中Tomcat 运行时使用的是高版本 JDKClass.forName 自然找不到。解决方法是安装 JDK 7 并把 Tomcat 的 JAVA_HOME 变量指向它保持原代码不修改如果必须用新 JDK可以改用 UCanAccess 这类纯 Java 驱动把连接字符串换成 jdbc:access:// 协议但这就偏离了样例本身的桥接方式。现象二驱动加载成功但连接失败提示“未发现数据源名称并且未指定默认驱动程序”。常见原因是 64 位系统下的 ODBC 驱动与 JDK 位数不匹配32 位 JDK 找不到 64 位的 Access 驱动还有一种可能是机器上安装的 Access 驱动显示名不是花括号里的写法。解决方法是打开 ODBC 数据源管理器32 位系统运行 odbcad32.exe64 位系统要区分 SysWOW64 下的版本在“驱动程序”选项卡里核对驱动显示名并安装与 JDK 位数一致的 Microsoft Access Database Engine。现象三页面提示找不到文件或路径错误但 data 目录和 test.mdb 确实存在。最常见的原因是 Tomcat 安装路径带有空格比如 Windows 默认的 Program Files 目录DBQ 参数拼接后无法正确解析。解决方法是把 Tomcat 挪到纯英文且无空格的目录如 D:\Tomcat或者临时在代码里输出 dbpath 变量确认 getRealPath 到底解析到了哪个物理路径。注意绝对路径方案虽然能绕过 getRealPath 的问题但换机器后必须改代码只适合应急。现象四页面中文全部变成问号或乱码。原因是 JSP 文件声明的是 gb2312但文件实际以 UTF-8 保存Tomcat 解析 JSP 时按文件原始编码读取字符流最终与页面声明的输出编码不一致。解决方法是把页面的 contentType 和 meta 标签统一改成 UTF-8同时确保 JSP 文件用 UTF-8 编码保存。数据库里已经存在的乱码数据需要重新录入不是改页面编码就能恢复的。现象五能连接成功但执行 insert 时报“文件共享锁定数不够”或“数据库被锁定”。原因是 Access 文件锁机制要求同一时刻只能有一个进程以读写方式打开数据库Tomcat 进程和本机手工打开的 Access 客户端之间发生竞争残留的 .ldb 锁文件也会导致异常。解决方法是排查是否有人用 Access 打开了 test.mdb关闭所有外部进程删除 data 目录下的 .ldb 文件再给目录授权写权限。修改数据库结构时先停 Tomcat 再操作改完再启动是比较稳妥的流程。5. 运行验证部署进 Tomcat 后如何确认真正读到了库代码和环境都准备好之后剩下的问题就是怎么把项目跑起来并且在出错时定位到具体环节。这一章给出完整的部署路径和验收方法。5.1 目录复制与启动顺序部署前先确认最终目录结构只包含两个必要文件。以 Tomcat 6.0 为例把 JDBCAccess.jsp 复制到 webapps\ROOT 目录下把 test.mdb 复制到 webapps\ROOT\data 目录下。如果 ROOT 下还没有 data 目录手动新建一个Tomcat 不会自动创建它。目录确认无误后进入 Tomcat 的 bin 目录双击 startup.batWindows或执行 ./startup.shLinux。看到控制台输出类似“Server startup in xxx ms”的信息后打开浏览器访问 http://localhost:8080/JDBCAccess.jsp。如果 8080 端口被占用需要先修改 conf\server.xml 里的 Connector port再重启 Tomcat。这里有一个部署路径的细节如果不想把文件放在 ROOT 里也可以在 webapps 下新建一个名为 app 的目录把 JSP 和 data 目录都放进去然后访问 http://localhost:8080/app/JDBCAccess.jsp。这种情况下 application.getRealPath 的相对基准会跟着应用上下文变化getRealPath(data/test.mdb) 会解析到 webapps\app\data\test.mdb不需要改代码。这也体现了 getRealPath 相对路径设计的好处应用目录迁移不会破坏路径映射。5.2 页面结果与错误信息对照正常情况下页面会依次输出 username 表里的所有记录最后一行是“恭喜你数据库连接成功”。如果数据库里插入了前面准备的两条测试数据页面应该显示用户名:admin 密码:123456 用户名:guest 密码:guest 恭喜你数据库连接成功如果页面出现异常信息先别急着改代码对照异常内容判断属于哪一层。下面这张表是实际运行中最常出现的错误信息与处理方向错误信息片段问题层处理方向ClassNotFoundException: JdbcOdbcDriverJDK 层换回 JDK 7或改用第三方 Access 驱动未发现数据源名称并且未指定默认驱动程序ODBC 层核对驱动显示名匹配 JDK 位数文件名或路径错误 / 数据库名被截断路径层检查 DBQ 路径移除空格和中文java.io.FileNotFoundException路径层检查 data 目录与 test.mdb 文件名是否完全一致文件共享锁定数不够文件锁层关闭外部 Access 进程删除 .ldb 文件5.3 用 dbpath 做现场诊断页面报错但看不清是路径问题还是驱动问题时可以直接在代码里临时加一行输出。out.print(DBPath dbpath br);这行放在 url 拼装之前刷新页面就能看到 JSP 实际解析到的磁盘绝对路径。把这个路径复制到资源管理器里检查能立刻确认文件是否真的存在于该目录、文件名大小写是否一致、路径中是否包含空格或中文。确认完之后把这一行删掉避免正式页面暴露服务器路径。这个诊断手段也适合排查“代码在别人电脑上能跑在我这里不行”的问题。大部分情况下最终都会落在 dbpath 解析结果和本机 Access 驱动位数这两个变量上。把输出结果对比一下问题往往马上定位。6. 二次开发把只读样例改成能登录、能写入的工具6.1 从查询改成登录校验最常见的改造方向是把页面变成登录页。在 JSP 里接收表单提交的 uid 和 pwd拼到查询条件里有结果就提示登录成功没有结果就提示失败。String uid request.getParameter(uid); String pwd request.getParameter(pwd); String sql select * from username where uid uid and pwd pwd ;这个写法能快速演示业务逻辑但存在 SQL 拼接注入风险。做二次开发时第一件事应该把 Statement 换成 PreparedStatement用占位符传参。6.2 把连接代码抽成公共方法每个 JSP 都重复写一遍 Class.forName 和 DriverManager.getConnection代码会越来越臃肿。常见做法是写一个 db.Conn 工具类把驱动加载和连接创建都封装进去页面里只调用一句话。连接参数放到一个配置变量里统一管理后续换数据库或调整路径只需要改一处。6.3 扩展成增删改把 executeQuery 换成 executeUpdate就能执行 insert、update、delete 语句。Access 的 SQL 语法与标准 SQL 基本一致插入数据用 INSERT INTO 表名 (字段) VALUES (值)。需要注意 Access 的并发能力弱这个方案更适合后台管理和教学演示不要把它推到高并发的线上业务里。我在刚学 JSP 时也是从这份桥接代码起步的。那之后每次在陌生机器上跑老项目我都会先敲一遍 java -version 确认 JDK 版本再从 ODBC 管理器核对驱动位数最后才动代码。这套习惯帮我避开了无数次驱动消失和路径解析的坑。希望帮到你。本文还有配套的精品资源点击获取
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑