前言
這個小小的數據庫操作封裝框架是參考IBM開發網上的兩篇文章並在其基礎上擴充了一些功能而得到的
學習JDBC以來一直想實現一個簡單的封裝來方便編程但是由於水平有限一直沒有較好的辦法
我把源碼提供出來有兩個目的一個是希望能幫助比我還初學的初學者熟悉JDBC
IBM開發網的那兩篇文章分別是《一個簡單的 JDBC 包裝器》《對一個簡單的 JDBC 包裝器的擴展及應用》
設計思想
把DBMS抽象成類Database
把數據庫中的一張或多張表抽象成類Table
將數據庫表中的一條記錄抽象成類Row
把對個Row的集合抽象成RowSet
代碼分析
由於已經給出源碼所以我只對代碼中關鍵的和需要注意的地方加以說明
Database類源碼如下
package com
import java
import javax
import com
public class Database {
/**
* 這個數據庫連接成員只有在與數據庫直接建立連接的情況下是有效的
*/
private Connection conn = null;
/**
* 當這個參數有效時
*/
private String url
/**
* 當這個參數有效時
*/
private String datasource;
/**
* 用數據庫地址
* 與數據庫建立連接的情況
* @param url
* @param user
* @param password
*/
public Database(String url
this
this
this
}
/**
* 用JNDI數據源名初始化數據庫對象
* @param datasource
*/
public Database(String datasource) {
this
}
/**
* 得到數據庫連接
* 來判斷是否直接與數據庫建立連接還是從連接池裡取連接
* 對於用戶來說不用考慮程序是從那裡取得連接
* @return
* @throws SQLException
*/
public Connection getConnection() throws Exception {
if (datasource == null) { //直接與數據庫建立連接
if (conn == null) {
conn = DriverManager
}
}
else { //從應用服務器的連接池裡取得連接
ServiceLocator sl = ServiceLocator
DataSource ds = sl
return ds
}
return conn;
}
/**
* 釋放連接
* 如果是從連接池中取得的連接那麼釋放傳來的連接
* @param conn
*/
public void disConnect(Connection connection) {
if (datasource != null) { //只處理從連接池取連接的情況
try {
if (connection != null) {
connection
}
}
catch (Exception ex) {}
}
}
/**
* 得到與參數名對應的表對象
* @param name
* @return
*/
public Table getTable(String name) {
return new Table(this
}
}
這個類是對DBMS的抽象
? Table類源碼如下
package com
import java
import java
import com
public class Table {
/**
* 通過這個數據庫對象得到數據庫連接
*/
private Database database;
/**
* 數據庫中一個或多個(只限查詢)表的名
*/
private String name;
/**
* 初始化表對象
* 一般通過database的getTable調用
* @param database
* @param name
*/
public Table(Database database
this
this
}
/**
* 查詢某一行
* @return
*/
public Row getRow(String fields
DBAccessException {
RowSet rows = executeQuery(fields
if (rows == null) {
return null;
}
return rows
}
/**
* 得到一個多行記錄
* @param criteria 查詢條件
* @param args 查詢條件的參數列表
* @return
*/
public RowSet getRows(String fields
DBAccessException {
return executeQuery(fields
}
/**
* 執行SQL查詢
* @param fields 要查詢的字段
* @param criteria用戶輸入的查詢Where條件
* @param args 用到的參數數組
* @return 返回符合結果行集
*/
private RowSet executeQuery(String fields
DBAccessException {
Connection conn = null;
RowSet rows = new RowSet();
String sql = null;
if (fields == null) {
fields =
}
try {
conn = database
sql =
( (criteria == null) ?
(
PreparedStatement pstmt = conn
if (args != null) { //如果有查詢參數則設置參數
for (int i =
pstmt.setObject(i + 1, args[i]);
}
}
ResultSet rs = pstmt.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
int cols = rsmd.getColumnCount();
/**@todo 判斷是否為零*/
if (cols == 0) {
return null;
}
while (rs.next()) {
Row row = new Row();
for (int i = 1; i <= cols; i++) {
String name = rsmd.getColumnName(i);
Object value = rs.getObject(i); //作通用類型處理,這
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26189.html