Java Web項目中連接Access數據庫的配置方法


        本文是對前幾天的“JDBC連接Access數據庫的幾種方式”這篇的升級。因為在做一些小項目的時候遇到的問題,因此才決定寫這篇博客的。昨天已經將博客公布了。可是后來經過一些驗證有點問題,所以今天改了一下又一次的公布了

老師決定期末考試採用access數據庫實現增刪改查。我覺得如今的我已經沒有問題了。可是曾經都是在JSP頁面中連接access數據庫,不管是下面的那種方式都進行了連接的練習,可是如今我想讓我的項目中的訪問access數據庫的java代碼,封裝到DAO中,在DAO中連接數據庫,沒有和Servlet API有不論什么的關系。

對於大多數人都會優先選擇使用ODBC數據源的方式或者是使用絕對路徑的方式連接access數據庫,可是我個人覺得,這樣做不太好,假設採用這種方式,項目做好后。放到他人的server上是無法執行的,由於數據庫的信息不存在了。而我如今的想法是不管項目放那一台支持jdbc-odbc機器的server上都能夠連接數據庫。並執行項目。所以要完畢這種操作,僅僅有在讓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”選項卡中,單擊“加入”button,打開創建數據源對話框。選擇Access數據庫的驅動程序“Microsoft Access Driver(*.mdb)”如圖所看到的:

3、單擊完畢button。出現例如以下對話框。在數據源名中輸入數據源的名字“JDBC-ODBC”,單擊選擇button,選擇要操作的數據庫“student.mdb”,單擊確定button完畢數據源的配置。如圖所看到的:

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"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Access</title>
</head>
<body>
<table border="1" width="40%">
<tr bgcolor="gray">
<th>學號</th>
<th>姓名</th>
<th>年齡</th>
<th>地址</th>
<th>語文</th>
<th>數學</th>
<th>英語</th>
</tr>
<%
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())
{
%>
<tr>
<td><%=rs.getString(1) %></td>
<td><%=rs.getString(2) %></td>
<td><%=rs.getInt(3) %></td>
<td><%=rs.getString(4) %></td>
<td><%=rs.getInt(5) %></td>
<td><%=rs.getInt(6) %></td>
<td><%=rs.getInt(7) %></td>
</tr>
<%
}
rs.close();
st.close();
con.close();
%>
</table>
</body>
</html>


執行JSP結果例如以下所看到的:

當將連接改為另外一種方式的時候還是好使的,JSP代碼例如以下所看到的:

執行JSP結果例如以下所看到的:

當將連接改為第三種方式的時候還是好使的。JSP代碼例如以下所看到的:

執行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()方法得到字符串類型的文件路徑在server上的真實路徑。

代碼例如以下所看到的:
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語言連接數據庫,將數據庫文件放在和類路徑同樣的文件夾下是非常好的作法。假設還有其它的辦法,希望大家提出來。

本文是對前幾天的“JDBC連接Access數據庫的幾種方式”這篇的升級。

因為在做一些小項目的時候遇到的問題,因此才決定寫這篇博客的。昨天已經將博客公布了。可是后來經過一些驗證有點問題。所以今天改了一下又一次的公布了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM