新闻详情

新闻详情

首页 / 资讯中心 / 详情

JSP连接ACCESS数据库:JDBC-ODBC桥驱动原理与配置详解

发布时间:2026/10/1 17:36:45来源:尧图网络
JSP连接ACCESS数据库:JDBC-ODBC桥驱动原理与配置详解
简介面向初学Java Web开发者的JSP与ACCESS数据库连接入门教程重点讲解在小型项目与学习场景下如何通过JDBC-ODBC桥驱动完成数据库连接、SQL查询与结果展示。资源以doc文档形式呈现共1个文件压缩包仅31KB结构紧凑、便于快速查阅目前已有238人学习浏览适合作为高校课程实验或自主学习的参考资料。文档按完整实操流程展开先创建test.mdb数据库及username表的uid、pwd字段再将数据库文件部署至TOMCAT指定目录最后给出JDBCAccess.jsp完整示例代码并演示运行效果。代码逐行解析加载驱动、建立连接、执行查询、遍历结果集与关闭资源等关键步骤同时说明连接字符串参数含义、字符编码设置及常见报错排查思路。整体内容对理解JDBC原理、掌握JSP基础数据交互很有帮助也可为后续迁移至MySQL、SQL Server等主流数据库打下良好基础。1. JSP 连接 ACCESS 数据库先讲清楚这条老路为什么还能走JSP 连 ACCESS 数据库放在十年前是 Java Web 课设的标准开场放在今天仍然有人翻车后回来找答案。原因很简单ACCESS 文件型数据库不需要单独装服务拷贝一个 .mdb 文件就能跑配合 JSP 做小型管理系统、课程设计、毕业设计绰绰有余。但这条路的坑也不少驱动选型、数据库文件位置、ODBC 数据源配置、64 位系统兼容每一个环节都可能让页面直接报错。这篇文章以你手上的 JSP 连接 ACCESS 数据库资源为主线把从建库、放文件、写代码到排错的全过程拆开讲适合正在做 JSP 课设、毕设或者维护老项目的开发者。你不需要提前懂太多 JDBC 原理跟着步骤走就能把数据读出来但我会把每一步为什么这么做也讲清楚免得你换了个环境就不知道怎么办。2. 驱动与连接原理为什么选 JDBC-ODBC 桥以及它的边界在哪2.1 JDBC-ODBC 桥的工作原理JSP 本身不直接认识 ACCESS 数据库文件它需要通过 JDBC 驱动发出 SQL 请求再由驱动把请求转成 ACCESS 能理解的格式。这套资源里用的驱动是sun.jdbc.odbc.JdbcOdbcDriver它属于 JDBC-ODBC 桥驱动原理是让 Java 程序通过 JDBC API 调用 ODBC 接口再由 ODBC 去访问 ACCESS 数据库。你可以把它理解成一个翻译官JSP 说 JDBC 语言ODBC 说 Windows 数据库通用语言ACCESS 说自己的方言桥驱动在中间做两层转换。JSP 页面 → JDBC API → JDBC-ODBC 桥驱动 → ODBC 驱动管理器 → Access ODBC Driver → test.mdb这种方案的优点是配置简单不需要额外下载第三方驱动 JAR 包JDK 1.8 以前的版本自带桥驱动类。缺点是性能一般而且 JDK 1.8 之后 Oracle 移除了这个桥驱动这一点后面会在避坑章节详细讲。至于代码里的Class.forName(sun.jdbc.odbc.JdbcOdbcDriver)它的作用是让 JVM 加载驱动类到内存中注册这样DriverManager.getConnection()才能识别到可用的驱动。2.2 连接字符串参数逐个拆解连接字符串是整段代码里最需要理解的部分资源里给出的写法是String url jdbc:odbc:Driver{Microsoft Access Driver (*.mdb)};DBQ dbpath;这里的参数含义分别是参数值作用jdbc:odbc:固定前缀告诉 DriverManager 走 JDBC-ODBC 桥Driver{Microsoft Access Driver (*.mdb)}ODBC 驱动名称指定 Windows 自带的 ACCESS 驱动DBQ数据库物理路径指定 .mdb 文件的绝对路径注意Driver后面的花括号不能省略而且驱动名称严格遵守*.mdb里的星号也是固定写法不能写成*mdb或者去掉星号否则 ODBC 驱动管理器找不到对应的驱动。另外DBQ参数后面跟的是数据库文件的物理磁盘路径不是相对路径这就是为什么资源里要用application.getRealPath(spath)把相对路径转换成物理路径。这里有一个容易混淆的点有的教程让你在 ODBC 数据源管理器里先建立一个系统 DSN然后把连接字符串写成jdbc:odbc:test这种形式。那是另一种连接方式本资源用的是 DSN-less 连接好处是不需要预先配置数据源直接把驱动名称和数据库路径写进连接字符串里换一台机器部署时少一个配置步骤但代价是路径硬编码在代码中迁移时要同步修改。2.3 JDK 版本与驱动可用性的硬边界JDBC-ODBC 桥驱动从 JDK 1.2 开始提供到 JDK 8 仍然能用但从 JDK 9 开始被移除。如果你用的是 JDK 8 或更早版本Class.forName(sun.jdbc.odbc.JdbcOdbcDriver)可以正常执行如果你用的是 JDK 9 以上运行时会直接抛出ClassNotFoundException: sun.jdbc.odbc.JdbcOdbcDriver这不是你代码写错了而是 JDK 里根本没有这个类了。配套的 Tomcat 版本也需要匹配。资源里写的是 Tomcat 6.0那个年代主流搭配是 JDK 1.5 或 1.6。如果你手头是 Tomcat 9 JDK 8代码还能跑但要注意 Tomcat 9 要求 JDK 8 及以上而 JDK 8 又恰好是最后一个自带桥驱动的版本所以这个组合是当前条件下能跑通的老方案天花板。更高版本的组合就不建议尝试了除非你换用第三方驱动这部分在最后一章会给出替代方案。3. 建库与部署从 test.mdb 到 Tomcat data 目录的完整操作3.1 创建 ACCESS 数据库和 username 表打开 Microsoft Access新建一个空白数据库命名为test.mdb保存到你能找到的任意位置稍后要拷贝到 Tomcat 目录下去。数据库创建好之后需要建立一张名为username的表。在 Access 里选择「创建」→「表设计」进入表结构设计视图添加两个字段字段名数据类型说明uid文本用户名长度建议设为 20pwd文本密码长度建议设为 20两个字段都是文本型这是资源正文里明确要求的。注意 Access 默认会生成一个ID主键字段如果你不需要可以删掉也可以保留不影响查询。保存表时命名为usernameAccess 会提示是否创建主键选「否」即可因为uid和pwd本身没有唯一性约束的要求。建完表之后随手录入几条测试数据比如uidadmin, pwd123456 uidtest, pwdabc123这一步很重要不然 JSP 页面查询出来是空结果你还要纠结是代码错了还是表里没数据。3.2 数据库文件放置位置的逻辑资源里要求把test.mdb放到 Tomcat 安装目录下的webapps\ROOT\data文件夹中例如C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps\ROOT\data。为什么是这个位置因为 Tomcat 默认把webapps\ROOT作为根 Web 应用的发布目录放在它下面的文件可以通过 URL 直接访问而 JSP 代码里application.getRealPath(data/test.mdb)拿到的物理路径就是相对于这个根目录解析的。webapps\ROOT\ ├── index.jsp ├── JDBCAccess.jsp └── data\ └── test.mdb如果你把数据库文件放在webapps\ROOT之外比如放在 D 盘某个目录那么application.getRealPath()就解析不到这个路径必须在代码里硬编码绝对路径类似String dbpath D:/test.mdb。这样做不是不行但会降低部署时的灵活性换一台机器就要改代码。实操步骤是先在webapps\ROOT下新建一个data文件夹再把刚才创建的test.mdb文件复制进去。如果你的 Tomcat 安装路径跟资源里不一致不要照抄找到你自己的 Tomcat 根目录就行。这一步有一个常见翻车点有人把数据库文件放到了webapps\ROOT\WEB-INF下面以为更安全实际上application.getRealPath(data/test.mdb)按相对路径找文件时只认webapps\ROOT\data这种目录结构放了别处就要改代码路径完全没必要自找麻烦。3.3 Access 数据库文件锁与并发注意ACCESS 是文件型数据库JSP 程序通过 ODBC 读取 .mdb 文件时Access 引擎会对文件加锁。如果此时你刚好在 Access 软件里打开了同一个数据库文件JSP 程序读数据时可能会报「文件正被另一用户使用」或者「无法打开数据库」。这不是代码问题是文件级并发冲突。规范做法是测试阶段确认 Access 软件里已经关闭了test.mdb再启动 Tomcat 访问 JSP 页面。生产环境更不应该让 Access 软件直接打开正在被 Web 程序使用的数据库文件这只会在并发读写时制造更多麻烦。另外.ldb文件是 Access 的锁文件你会在 data 目录下看到它自动生成属正常现象别手贱去删它——删了之后 Tomcat 里的程序正在持有连接时可能导致数据库状态异常。4. JSP 代码逐段拆解每一行的作用你都该知道4.1 完整代码与分块说明资源里提供了完整的JDBCAccess.jsp文件我们把它按功能块拆开来看。第一段是页面指令和编码声明% page contentTypetext/html; charsetgb2312 languagejava importjava.sql.*% meta http-equivContent-Type contenttext/html; charsetgb2312这一行的importjava.sql.*导入了 JDBC 所需的全部接口和类包括Connection、Statement、ResultSet、DriverManager没有这个导入后面所有数据库相关代码都会报编译错误。contentType设置页面输出编码为gb2312这是老项目的典型写法适合中文 Windows 环境。但要注意如果你的 JSP 文件本身是以 UTF-8 编码保存的这里却声明成 gb2312页面输出中文时可能乱码。保持一致的原则是文件保存编码 页面声明编码。我一般建议新建文件时就用 gb2312 编码保存或者全部改成 UTF-8别混搭。第二段是连接初始化代码也就是整个资源的核心try { String spath data/test.mdb; String dbpath application.getRealPath(spath); String user ; String url jdbc:odbc:Driver{Microsoft Access Driver (*.mdb)};DBQ dbpath; Class.forName(sun.jdbc.odbc.JdbcOdbcDriver); Connection conn DriverManager.getConnection(url); Statement stmt conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);这段代码的顺序是固定的先确定数据库路径再拼连接字符串然后加载驱动最后建立连接。你可能会问user和密码为什么是空的因为 ACCESS 数据库文件本身可以不设用户名密码ODBC 驱动也不做认证所以DriverManager.getConnection(url)只需要一个参数就够了。如果你在 Access 里给数据库设置了密码连接字符串要改成Driver{Microsoft Access Driver (*.mdb)};DBQ路径;PWD密码这种形式但 ODBC 方式下密码机制比较脆弱建议测试环境就别折腾了。conn.createStatement里的两个参数值得解释一下。ResultSet.TYPE_SCROLL_SENSITIVE表示结果集支持来回滚动ResultSet.CONCUR_UPDATABLE表示结果集可以更新这是最灵活但也是开销最大的组合。对于你现在只是查询数据来说这两个参数完全多余反而在某些 ODBC 驱动版本下会触发「结果集类型不受支持」的异常。更稳妥的写法是Statement stmt conn.createStatement();参数缺省时是TYPE_FORWARD_ONLY和CONCUR_READ_ONLY性能更好兼容性也更好。这是资源里第一个值得你动手改的地方改成这样至少能避开一部分奇怪报错。第三段是查询与输出String sql select * from username; ResultSet rs stmt.executeQuery(sql); while(rs.next()) { out.print(用户名: rs.getString(uid)); out.print( 密码: rs.getString(pwd) br); } out.print(br恭喜你数据库连接成功); rs.close(); stmt.close(); conn.close();这段逻辑不复杂executeQuery执行查询并返回结果集while(rs.next())循环逐行读取getString(uid)取出当前行的 uid 字段值。关闭顺序是从结果集到语句再到连接倒着关回去这个顺序不能乱。资源里没有处理如果username表不存在的情况异常会直接跳转到 catch 块打印错误信息这在你调试时反而是好事能看到具体报错内容。第四段是异常处理} catch(Exception e) { out.print(数据库连接错误,错误信息如下br); out.print(e.getMessage()); }这里有一个体验问题出错时页面只显示异常消息不显示堆栈信息。调试阶段建议临时改成e.printStackTrace()把完整堆栈输出到 Tomcat 控制台排查起来方便得多。定位完问题之后再改回来或者直接保留 printStackTrace 也没问题反正老项目也不讲究优雅降级。4.2 部署与访问步骤把JDBCAccess.jsp文件保存到webapps\ROOT目录下确保文件名后缀是.jsp大小写不影响 Tomcat 识别。然后启动 Tomcat打开浏览器访问http://localhost:8080/JDBCAccess.jsp如果一切正常页面会先输出 username 表中的所有记录然后输出「恭喜你数据库连接成功」。如果数据库文件放错位置或者表名不对页面会显示「数据库连接错误」以及具体异常信息。这一步能跑通就说明整条链路是通的Tomcat 能读到 JSP 文件JSP 能加载桥驱动ODBC 能识别 ACCESS 文件SQL 查询能正常返回。4.3 路径解析的两种常见写法资源里用application.getRealPath(spath)把相对路径转成物理路径这是 JSP 内置对象application的常见用法。还有一种等价写法是application.getRealPath(/data/test.mdb)路径前面多一个斜杠表示从 Web 应用根目录开始解析。两种写法解析出来的物理路径一模一样但如果你在路径前面漏了斜杠某些 Tomcat 版本下解析结果会出现偏差。另外一个容易出问题的地方是路径分隔符。Windows 下物理路径是C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps\ROOT\data\test.mdb但 Java 字符串里反斜杠需要转义写成C:\\Program Files\\...太罗嗦而且application.getRealPath()返回的路径已经自带正确分隔符你不需要手工拼路径。连接字符串里DBQ后面直接拼这个返回值即可拼接时用加号连接字符串String url jdbc:odbc:Driver{Microsoft Access Driver (*.mdb)};DBQ dbpath;注意DBQ后面没有空格路径中间如果出现空格比如Program FilesODBC 驱动能够正常处理不需要加引号包裹——这一点跟某些老教程里说的「路径含空格要加引号」不一样实测过不加引号也能跑通。5. 避坑与常见问题JSP 连 ACCESS 的十个典型翻车现场5.1 现象ClassNotFoundException: sun.jdbc.odbc.JdbcOdbcDriver原因JDK 9 及以上版本移除了 JDBC-ODBC 桥驱动Class.forName()加载不到这个类。解决换用 JDK 8 或更早版本运行 Tomcat或者改用 UCanAccess 第三方 JDBC 驱动替代桥驱动。从 Tomcat 的启动脚本catalina.bat里能看到当前使用的 JAVA_HOME确认一下是不是指向了 JDK 9。5.2 现象[Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序原因连接字符串里的驱动名称写错了或者当前系统是 64 位而 Tomcat 是 32 位。解决检查Driver{Microsoft Access Driver (*.mdb)}是否完全一致特别注意花括号和星号。64 位系统上如果 Tomcat 是 32 位的ODBC 驱动管理器加载的是 32 位版本的驱动而 Access 驱动可能是 64 位的两边对不上就会报这个错。解决方向是保持 Tomcat 位数和 Access 驱动位数一致或者确认系统里确实安装了对应的 Access Database Engine 驱动。5.3 现象java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] 找不到文件原因DBQ后面拼出来的路径不对application.getRealPath()返回 null 或者指向了不存在的位置。解决在代码里临时加上out.print(dbpath)把实际解析出来的完整路径打印到页面上看看这个路径指向的文件是否真实存在。最常见的情况是data文件夹没有创建或者test.mdb没有真正放到webapps\ROOT\data下面。5.4 现象页面中文乱码原因JSP 文件保存编码和contentType声明的编码不一致。解决如果文件用 UTF-8 保存而声明是gb2312中文输出必定乱码。把页面声明改成 UTF-8或者把文件另存为 ANSI/gb2312 编码二选一保持一致即可。5.5 现象ResultSet.TYPE_SCROLL_SENSITIVE不被支持原因部分 ODBC Access 驱动对可滚动、可更新的结果集支持不完整导致createStatement时抛异常。解决直接用conn.createStatement()不带参数让结果集使用默认的前向只读模式查询功能不受任何影响。5.6 现象Tomcat 已经启动但访问页面提示 404原因JSP 文件没有放在webapps\ROOT下而是放到了别的 Web 应用目录里。解决确认浏览器访问的 URL 和应用实际部署的目录一致。如果放在了webapps\demo\JDBCAccess.jsp访问路径就应该是http://localhost:8080/demo/JDBCAccess.jsp。5.7 现象数据库文件被占用导致无法访问原因Access 软件打开了同一个.mdb文件文件级锁冲突。解决关闭 Access 软件或者确认没有其他进程持有该数据库文件的句柄。Windows 下可以打开任务管理器查看是否有MSACCESS.EXE进程在运行。5.8 现象application.getRealPath()返回 null原因Tomcat 的部署方式导致没有解压后的真实目录。比如使用 WAR 包部署时Tomcat 可能直接用压缩包运行getRealPath就无法正确解析。解决改用绝对路径硬编码或者把数据库文件放到 Tomcat 公共目录下配合外部路径访问。5.9 现象页面提示「未找到可加载的驱动程序」原因Class.forName()这行代码没有被执行到或者驱动类名拼写错误。解决检查sun.jdbc.odbc.JdbcOdbcDriver拼写是否完整注意大小写敏感O 和 D 都是大写。5.10 现象Tomcat 启动正常但页面访问极慢原因ODBC 桥驱动性能本身有限加上每次请求都重新建立物理连接耗时明显。解决如果只是课设或 Demo 范围可以接受这个性能如果要提高响应速度最简单的做法是减少数据库连接次数比如把多条操作合并到一次连接里完成或者考虑切换到其他数据库方案。6. 验证与进阶如何确认连接可靠以及往新 JDK 迁移的两条出路6.1 从抓取错误到参数调优的验证路径当页面报错时第一件事不是改代码而是把错误信息完整抓出来。把 catch 块里的out.print(e.getMessage())临时改成e.printStackTrace()然后去看 Tomcat 的logs\catalina.out或控制台输出堆栈信息里能精确指出是哪一行代码出错、底层异常是什么。这是排查 JSP 连接数据库问题最直接的手段。连接成功后可以用一个简单方法验证数据库操作的完整性在页面上追加一个插入操作往username表里写入一条新记录然后刷新页面查询看是否能读回这条数据。这个验证能确认不只是查询可用写入同样可用对后续做增删改查功能有参考价值。代码结构如下String insertSql insert into username (uid, pwd) values (hello, world); stmt.executeUpdate(insertSql);注意这里要用executeUpdate而不是executeQuery后者只处理 select 查询。执行完后去 Access 里打开表可以看到新记录。6.2 老方案的新代餐UCanAccess 驱动的迁移路线如果你的机器上没有 JDK 8或者不想被sun.jdbc.odbc的兼容性问题卡住可以改用 UCanAccess 驱动它在 Maven 中央仓库里有现成的ucanaccess依赖配合commons-lang和hsqldb两个辅助 JAR 包。连接字符串变成String url jdbc:ucanaccess:// dbpath; Class.forName(net.ucanaccess.jdbc.UcanaccessDriver); Connection conn DriverManager.getConnection(url);这个驱动是纯 Java 实现不依赖 ODBC因此支持 JDK 8、11、17 乃至更高版本而且性能比桥驱动好。代价是需要引入三个 JAR 包到WEB-INF\lib目录下配置步骤多一点但长期维护角度看是值得的。如果你的项目不是必须用旧代码我的建议是优先考虑 UCanAccess把资源里的桥接代码当作理解原理的起点而不是最终方案。6.3 把连接参数抽到配置文件的习惯从这套资源里延伸出来的一个好习惯是不要硬编码数据库路径和连接字符串。把dbpath、user、pwd、连接 URL 模板放到webapps\ROOT\WEB-INF\classes\db.properties文件里JSP 里用java.util.Properties读出来。这样换数据库文件或者换机器部署时只改配置文件不用动 JSP 源码。Properties props new Properties(); String configPath application.getRealPath(/WEB-INF/classes/db.properties); props.load(new FileInputStream(configPath)); String dbpath application.getRealPath(props.getProperty(db.path)); String url jdbc:odbc:Driver{Microsoft Access Driver (*.mdb)};DBQ dbpath;对应配置文件内容db.pathdata/test.mdb db.user db.password这个习惯在项目变大后价值明显。当你有三五个 JSP 页面都要访问数据库时改一处配置比逐个文件查字符串要省太多时间。我自己以前维护一个老课设项目时就是吃了硬编码的亏数据库文件换了个目录结果十几个 JSP 页面里每个都要改路径改完还有可能漏掉一两个。从那以后我每次写 JSP 连接数据库都强制把连接参数抽到 properties 文件里路径统一通过application.getRealPath解析从来没有再为路径问题折腾过。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

小白也能看懂的大模型新宠Step 3.5 Flash,高效智能体开发必备 2026/10/1 19:05:44

小白也能看懂的大模型新宠Step 3.5 Flash,高效智能体开发必备

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

阅读更多 →
华为云AgentArts实战:金融信贷AI智能体从零搭建与落地指南 2026/10/1 19:05:44

华为云AgentArts实战:金融信贷AI智能体从零搭建与落地指南

金融信贷这个行当,过去十年我基本都在跟风控系统和信贷流程打交道。早些年做规则引擎,后来做评分卡,再后来搞机器学习模型,每一步都是在解决“怎么让机器更懂业务”这个问题。但真正让我觉得门槛被踏平的,是最近两年AI…

阅读更多 →
基于RFID技术的国有资产管理系统Java后台开发实战:从读写器对接到盘点避坑 2026/10/1 19:05:44

基于RFID技术的国有资产管理系统Java后台开发实战:从读写器对接到盘点避坑

简介:这份资源是面向Java方向本科毕业设计的后台项目源码,主题为基于RFID技术的国有资产管理系统,适合正在准备毕设、需要完整可运行工程参考的计算机专业学生,也可供想了解RFID资产盘点、借还、报废等业务建模的开发者学习。压缩…

阅读更多 →
MiMo-V2.6全面解析:双版本选择、AA指数与部署实战 2026/10/1 19:05:44

MiMo-V2.6全面解析:双版本选择、AA指数与部署实战

MiMo-V2.6 的发布消息,这两天在开源模型圈子里讨论度确实不低。这次小米一口气放出 Pro 和 Flash 两个版本,价格维持原样,同时在 AA 指数上的排名超过了 Kimi K3 和 GLM-5.3,直接成为开源阵营里排名最高的模型。这个信息量其实挺大…

阅读更多 →
Docker 入门实战:从安装到 Compose 多容器部署与排错指南 2026/10/1 19:05:44

Docker 入门实战:从安装到 Compose 多容器部署与排错指南

简介:《Docker基础入门指南》面向具备一定计算机基础、希望从零掌握容器技术的开发者与运维初学者,帮助解决环境搭建繁琐、部署流程不统一等入门痛点。资源包共1个PDF文件,约696KB,内容以图文与命令示例为主,便于随时查…

阅读更多 →
2026年32位Win7玩Steam老游戏:离线模式、TLS优化与系统配置全指南 2026/10/1 19:05:38

2026年32位Win7玩Steam老游戏:离线模式、TLS优化与系统配置全指南

先说结论:2026年的32位Win7,已经没法像十年前那样痛快地刷Steam商店、逛社区、同步云存档了。但如果你的需求只是“双击桌面图标,进游戏,能玩”,而且玩的以老游戏为主,这条路依然走得通。下面这份折腾记录&…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉