视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
JavaWeb项目中连接Access数据库
2020-11-09 15:29:04 责编:小采
文档


Java Web 项目 中 连接 Access 数据库 注:本篇博客是对前几天的“ JDBC 连接 Access 数据库 的几种方式 ”这篇的升级。由于在做一些小 项目 的时候遇到的问题,因此才决定写这篇博客的。昨天已经将博客发布了,但是后来经过一些验证有点问题,所以今天改了

Java Web项目中连接Access数据库

注:本篇博客是对前几天的“JDBC连接Access数据库的几种方式”这篇的升级。由于在做一些小项目的时候遇到的问题,因此才决定写这篇博客的。昨天已经将博客发布了,但是后来经过一些验证有点问题,所以今天改了一下重新的发布了。

老师决定期末考试采用access数据库实现增删改查,我认为现在的我已经没有问题了,但是以前都是在JSP页面中连接access数据库,无论是以下的那种方式都进行了连接的练习,但是现在我想让我的项目中的访问access数据库的java代码,封装到DAO中,在DAO中连接数据库,没有和Servlet API有任何的关系。对于大多数人都会优先选择使用ODBC数据源的方式或者是使用绝对路径的方式连接access数据库,但是我个人认为,这样做不太好,如果采用这样的方式,项目做好后,放到他人的服务器上是无法运行的,因为数据库的信息不存在了,而我现在的想法是无论项目放那一台支持jdbc-odbc机器的服务器上都可以连接数据库,并运行项目,所以要完成这样的操作,只有在让access数据库的mdb文件随着项目的移动而移动,因此,在Java Web项目,将mdb文件放入到WebRoot下或者其子目录下。但是在DAO中如何得到该mdb的真实路径呢?

其实,这个和在JSP中动态的得到mdb文件的路径的思想基本上是一样。

先复习一下jsp中使用access数据库吧!

例如有如下的Access数据库student,表basic,以及6条记录,现在通过几种方式在Jsp中将他们的数据显示出来。如图所示:

对于几种连接Access数据库的方式,基本上都是基于JDBC-ODBC方式的,当然也有纯JDBC驱动的方式。这里我暂时就不说了。对于这几种方式,除了取得连接之处不同外,其他的代码都是一样的。所以这里先写出取得连接的几种方式,然后再用完整的代码进行显示。

方式一:通过JDBC-ODBC方式桥连直接连接:

1、对于这种方式,首先要建立ODBC数据源,我的系统是Win7系统,所以依次选择“控制面板----管理工具----数据源(ODBC)”,打开数据源管理器,如图所示:

2、在“系统DSN”选项卡中,单击“添加”按钮,打开创建数据源对话框,选择Access数据库的驱动程序“Microsoft Access Driver(*.mdb)”如图所示:

3、单击完成按钮,出现如下对话框,在数据源名中输入数据源的名字“JDBC-ODBC”,单击选择按钮,选择要操作的数据库“student.mdb”,单击确定按钮完成数据源的配置。如图所示:

4、数据源配置好了,就可以写获取连接的代码了,如下所示:

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

String url = "jdbc:odbc:JDBC-ODBC";

Connection con = DriverManager.getConnection(url);

以上的三行代码就是通过JDBC-ODBC连接Access数据库的关键代码。这种方式连接可以很方便的记忆连接的url代码,这是很有用的。后面的代码就是正常写了。

方式二:通过数据库所在的绝对路径方式连接

上面说过这里的几种方式都是基于JDBC-ODBC方式。所以加载驱动的Class.forName()中的参数都是“sun.jdbc.odbc.JdbcOdbcDriver”。对于这种方式我将student.mdb文件放在了e盘的根目录下,在使用的时候,直接写上该数据库的绝对路径就行了。获取连接的代码如下所示:

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

String url = "jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ="+"e://student.mdb ";

Connection con = DriverManager.getConnection(url);

对于这种方式不用配置数据源,虽然代码比较多,但是很好理解的。也是很常用的。

方式三:通过请求来获取数据库的绝对路径方式连接

对于这种方式,我个人认为很适合在Java Web应用中使用,将做好的应用给别人,别人也可以使用。我将该数据库文件放在了Web应用的根路径下。那么动态的获取连接的代码如下所示:

String path = application.getRealPath("/index.jsp");

path = path.substring(0,path.lastIndexOf("\\"))+"\\";

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

String url = "jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ="+path+"student.mdb ";

Connection con = DriverManager.getConnection(url);

以上便是三种方式获取连接。接下来便是显示的代码了。代码如下所示:

<%@ page language="java" import="java.util.*,java.sql.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>



 
 Access
 
 
 
 <%
 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
 String url = "jdbc:odbc:JDBC-ODBC";
 Connection con = DriverManager.getConnection(url);
 Statement st = con.createStatement();
 String sql = "select * from basic";
 ResultSet rs = st.executeQuery(sql);
 while(rs.next())
 {
 %>
 
 <%
 }
 rs.close();
 st.close();
 con.close();
 %>
 
学号 姓名 年龄 地址 语文 数学 英语
<%=rs.getString(1) %> <%=rs.getString(2) %> <%=rs.getInt(3) %> <%=rs.getString(4) %> <%=rs.getInt(5) %> <%=rs.getInt(6) %> <%=rs.getInt(7) %>

运行JSP结果如下所示:

当将连接改为第二种方式的时候还是好使的,JSP代码如下所示:

<%@ page language="java" import="java.util.*,java.sql.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>


 
 JDBC连接Access数据库的第二种方式
 
 
 
 <%

 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
 String url = "jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ="+"e://student.mdb ";
 Connection con = DriverManager.getConnection(url);
 Statement st = con.createStatement();
 String sql = "select * from basic";
 ResultSet rs = st.executeQuery(sql);
 while(rs.next())
 {
 %>
 
 <%
 }
 rs.close();
 st.close();
 con.close();
 %>
 
学号 姓名 年龄 地址 语文 数学 英语
<%=rs.getString(1) %> <%=rs.getString(2) %> <%=rs.getInt(3) %> <%=rs.getString(4) %> <%=rs.getInt(5) %> <%=rs.getInt(6) %> <%=rs.getInt(7) %>

运行JSP结果如下所示:

当将连接改为第三种方式的时候还是好使的,JSP代码如下所示:

<%@ page language="java" import="java.util.*,java.sql.*" contentType="text/html; charset=UTF-8"
 pageEncoding="UTF-8"%>


 
 JDBC连接Access数据库的第三种方式
 
 
 
 <%
 String path = application.getRealPath("/index.jsp");
 path = path.substring(0,path.lastIndexOf("\\"))+"\\";
 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
 String url = "jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ="+path+"student.mdb ";
 Connection con = DriverManager.getConnection(url);
 Statement st = con.createStatement();
 String sql = "select * from basic";
 ResultSet rs = st.executeQuery(sql);
 while(rs.next())
 {
 %>
 
 <%
 }
 rs.close();
 st.close();
 con.close();
 %>
 
学号 姓名 年龄 地址 语文 数学 英语
<%=rs.getString(1) %> <%=rs.getString(2) %> <%=rs.getInt(3) %> <%=rs.getString(4) %> <%=rs.getInt(5) %> <%=rs.getInt(6) %> <%=rs.getInt(7) %>

运行JSP结果如下所示:

对于这种方式我的项目的目录结构如下所示:

第三种方式正是现在要用的方式,可以在Java类中,访问数据库了。

首先将mdb文件放入到WebRoot下面,当点击超链接的时候,将信息传给Servlet,在Servlet中写上如下的语句:

String path = request.getServletContext().getRealPath("/");
Dao dao = new Dao();
dao.init(path);
在dao的init()方法中初始化Connection连接:

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String url = "jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ="+path+"student.mdb ";
Connection con = DriverManager.getConnection(url);

这样在dao中就可以根据传过来的path找到数据库文件所在的路径了。并成功的连接到数据库了,实现了分层理念。

但是这样出现了一个问题,如果放在WebRoot下,别人知道数据库的位置,不就可以访问了吗?

为此我想了好久,既然是在Java类中访问数据库,那么能不能将mdb文件放在src下边呢,答案是可以的。这样在MyEclipse或Eclipse中,就将该文件复制到了Web项目的WEB-INF下的classes根路径下,不就能访问了,于是我的URL代码变成了这样:

String url = "jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=student.mdb ";

但是结果失败了,没有找到文件,但后来将该文件放到“项目”下,就好使了,但是这样一旦给别人,就又不行了,所以还得放到src下,只有这样才会放到WebRoot或WebContent下,才会放到classes下,才能被java类所访问,才能给别人项目就能运行。但是如何才能找到classes目录下的数据库文件呢。一直在找某个方法,直到找到了如下的方法:

方法一:Class类的getResource()方法或者是ClassLoader类的


方法二:URL类的getPath()方法

通过Class类的getResource()方法查找当前类所在的目录,这里dao类在com.student.dao包下,那么该方法返回的就是该类的路径,如果参数是“/”的化,返回的就是classes的根目录,这样就可以得到classes下的数据库mdb文件的所在路径。再通过URL类的getPath()方法得到字符串类型的文件路径在服务器上的真实路径。

代码如下所示:

String path = this.getClass().getResource("/").getPath().replaceAll("%20"," ");//replaceAll方法是为了解决路径中含有空格字符的问题

path = path.substring(1,path.length());//对路径进行截取,获得的路径前边会多加一个杠Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

String url = "jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ="+path+"student.mdb";

con = DriverManager.getConnection(url);

将以上的代码封装DAO中,就可以访问到数据库了。就可以在Java Web项目中,使用Access数据库实现MVC设计模式,并添加DAO和VO了。对于使用Servlet API将mdb文件的路径传给dao是一种方式,使用dao封装Access也是一种方式,有时为了方便可以将mdb文件放到WebRoot下,通过JSP或者是Servlet将数据库文件的路径传给dao。我觉的Access数据库这一点比较好,可以将数据库和项目一起移动。通关这两种方式可以再任何的机器上运行。

目前,我所知道的就是这么做,我也认为这是比较好的作法。用Java语言连接数据库,将数据库文件放在和类路径相同的目录下是很好的作法。如果还有其他的办法,希望大家提出来。

下载本文
显示全文
专题