package com.jack.SQLHelper;java
import java.sql.*;
import java.util.logging.*;
import javax.swing.table.*;sql
/**
* SQL 基本操做
* 經過它,能夠很輕鬆的使用 JDBC 來操縱數據庫
* @author Null
*/
public class SQLHelper
{數據庫
/**
* 驅動
*/
public static String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
/**
* 鏈接字符串
*/
public static String url = "jdbc:sqlserver://localhost:1433;databaseName=J2ee;";
/**
* 用戶名
*/
public static String user = "null";
/**
* 密碼
*/
public static String password = "123456";ide
/**
* 不容許實例化該類
*/
private SQLHelper()
{
}sqlserver
/**
* 獲取一個數據庫鏈接
* 經過設置類的 driver / url / user / password 這四個靜態變量來 設置數據庫鏈接屬性
* @return 數據庫鏈接
*/
public static Connection getConnection()
{
try
{
// 獲取驅動,這裏使用的是 sqljdbc_1.2.2828.100_chs.exe,不一樣版本的驅動,語句有所不一樣
Class.forName(driver);
} catch (ClassNotFoundException ex)
{
Logger.getLogger(SQLHelper.class.getName()).log(Level.SEVERE, null, ex);
}ui
try
{
return DriverManager.getConnection(url, user, password);
} catch (SQLException ex)
{
Logger.getLogger(SQLHelper.class.getName()).log(Level.SEVERE, null, ex);
return null;
}
}url
/**
* 獲取一個 Statement
* 該 Statement 已經設置數據集 能夠滾動,能夠更新
* @return 若是獲取失敗將返回 null,調用時記得檢查返回值
*/
public static Statement getStatement()
{
Connection conn = getConnection();
if (conn == null)
{
return null;
}
try
{
return conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
// 設置數據集能夠滾動,能夠更新
} catch (SQLException ex)
{
Logger.getLogger(SQLHelper.class.getName()).log(Level.SEVERE, null, ex);
close(conn);
}
return null;
}code
/**
* 獲取一個 Statement
* 該 Statement 已經設置數據集 能夠滾動,能夠更新
* @param conn 數據庫鏈接
* @return 若是獲取失敗將返回 null,調用時記得檢查返回值
*/
public static Statement getStatement(Connection conn)
{
if (conn == null)
{
return null;
}
try
{server
return conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
// 設置數據集能夠滾動,能夠更新
} catch (SQLException ex)
{
Logger.getLogger(SQLHelper.class.getName()).log(Level.SEVERE, null, ex);
return null;
}
}字符串
/**
* 獲取一個帶參數的 PreparedStatement
* 該 PreparedStatement 已經設置數據集 能夠滾動,能夠更新
* @param cmdText 須要 ? 參數的 SQL 語句
* @param cmdParams SQL 語句的參數表
* @return 若是獲取失敗將返回 null,調用時記得檢查返回值
*/
public static PreparedStatement getPreparedStatement(String cmdText, Object... cmdParams)
{
Connection conn = getConnection();
if (conn == null)
{
return null;
}
PreparedStatement pstmt = null;
try
{
pstmt = conn.prepareStatement(cmdText, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
int i = 1;
for (Object item : cmdParams)
{
pstmt.setObject(i, item);
i++;
}
} catch (SQLException e)
{
e.printStackTrace();
close(conn);
}
return pstmt;
}
/**
* 獲取一個帶參數的 PreparedStatement
* 該 PreparedStatement 已經設置數據集 能夠滾動,能夠更新
* @param conn 數據庫鏈接
* @param cmdText 須要 ? 參數的 SQL 語句
* @param cmdParams SQL 語句的參數表
* @return 若是獲取失敗將返回 null,調用時記得檢查返回值
*/
public static PreparedStatement getPreparedStatement(Connection conn, String cmdText, Object... cmdParams)
{
if (conn == null)
{
return null;
}
PreparedStatement pstmt = null;
try
{
pstmt = conn.prepareStatement(cmdText, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
int i = 1;
for (Object item : cmdParams)
{
pstmt.setObject(i, item);
i++;
}
} catch (SQLException e)
{
e.printStackTrace();
close(pstmt);
}
return pstmt;
}
/**
* 執行 SQL 語句,返回結果爲整型
* 主要用於執行非查詢語句
* @param cmdText SQL 語句
* @return 非負數:正常執行; -1:執行錯誤; -2:鏈接錯誤
*/
public static int ExecSql(String cmdText)
{
Statement stmt = getStatement();
if (stmt == null)
{
return -2;
}
int i;
try
{
i = stmt.executeUpdate(cmdText);
} catch (SQLException ex)
{
Logger.getLogger(SQLHelper.class.getName()).log(Level.SEVERE, null,
ex);
i = -1;
}
closeConnection(stmt);
return i;
}
/**
* 執行 SQL 語句,返回結果爲整型
* 主要用於執行非查詢語句
* @param cmdText SQL 語句
* @return 非負數:正常執行; -1:執行錯誤; -2:鏈接錯誤
*/
public static int ExecSql(Connection conn, String cmdText)
{
Statement stmt = getStatement(conn);
if (stmt == null)
{
return -2;
}
int i;
try
{
i = stmt.executeUpdate(cmdText);
} catch (SQLException ex)
{
Logger.getLogger(SQLHelper.class.getName()).log(Level.SEVERE, null,
ex);
i = -1;
}
close(stmt);
return i;
}
/**
* 執行 SQL 語句,返回結果爲整型
* 主要用於執行非查詢語句
* @param cmdText 須要 ? 參數的 SQL 語句
* @param cmdParams SQL 語句的參數表
* @return 非負數:正常執行; -1:執行錯誤; -2:鏈接錯誤
*/
public static int ExecSql(String cmdText, Object... cmdParams)
{
PreparedStatement pstmt = getPreparedStatement(cmdText, cmdParams);
if (pstmt == null)
{
return -2;
}
int i;
try
{
i = pstmt.executeUpdate();
} catch (SQLException ex)
{
Logger.getLogger(SQLHelper.class.getName()).log(Level.SEVERE, null,
ex);
i = -1;
}
closeConnection(pstmt);
return i;
}
/**
* 執行 SQL 語句,返回結果爲整型
* 主要用於執行非查詢語句
* @param conn 數據庫鏈接
* @param cmdText 須要 ? 參數的 SQL 語句
* @param cmdParams SQL 語句的參數表
* @return 非負數:正常執行; -1:執行錯誤; -2:鏈接錯誤
*/
public static int ExecSql(Connection conn, String cmdText, Object... cmdParams)
{
PreparedStatement pstmt = getPreparedStatement(conn, cmdText, cmdParams);
if (pstmt == null)
{
return -2;
}
int i;
try
{
i = pstmt.executeUpdate();
} catch (SQLException ex)
{
Logger.getLogger(SQLHelper.class.getName()).log(Level.SEVERE, null, ex);
i = -1;
}
close(pstmt);
return i;
}
/**
* 返回結果集的第一行的一列的值,其餘忽略
* @param cmdText SQL 語句
* @return
*/
public static Object ExecScalar(String cmdText)
{
ResultSet rs = getResultSet(cmdText);
Object obj = buildScalar(rs);
closeConnection(rs);
return obj;
}
/**
* 返回結果集的第一行的一列的值,其餘忽略
* @param conn 數據庫鏈接
* @param cmdText SQL 語句
* @return
*/
public static Object ExecScalar(Connection conn, String cmdText)
{
ResultSet rs = getResultSet(conn, cmdText);
Object obj = buildScalar(rs);
closeEx(rs);
return obj;
}
/**
* 返回結果集的第一行的一列的值,其餘忽略
* @param cmdText 須要 ? 參數的 SQL 語句
* @param cmdParams SQL 語句的參數表
* @return
*/
public static Object ExecScalar(String cmdText, Object... cmdParams)
{
ResultSet rs = getResultSet(cmdText, cmdParams);
Object obj = buildScalar(rs);
closeConnection(rs);
return obj;
}
/**
* 返回結果集的第一行的一列的值,其餘忽略
* @param conn 數據庫鏈接
* @param cmdText 須要 ? 參數的 SQL 語句
* @param cmdParams SQL 語句的參數表
* @return
*/
public static Object ExecScalar(Connection conn, String cmdText, Object... cmdParams)
{
ResultSet rs = getResultSet(conn, cmdText, cmdParams);
Object obj = buildScalar(rs);
closeEx(rs);
return obj;
}
/**
* 返回一個 ResultSet
* @param cmdText SQL 語句
* @return
*/
public static ResultSet getResultSet(String cmdText)
{
Statement stmt = getStatement();
if (stmt == null)
{
return null;
}
try
{
return stmt.executeQuery(cmdText);
} catch (SQLException ex)
{
Logger.getLogger(SQLHelper.class.getName()).log(Level.SEVERE, null, ex);
closeConnection(stmt);
}
return null;
}
/**
* 返回一個 ResultSet
* @param conn
* @param cmdText SQL 語句
* @return
*/
public static ResultSet getResultSet(Connection conn, String cmdText)
{
Statement stmt = getStatement(conn);
if (stmt == null)
{
return null;
}
try
{
return stmt.executeQuery(cmdText);
} catch (SQLException ex)
{
Logger.getLogger(SQLHelper.class.getName()).log(Level.SEVERE, null, ex);
close(stmt);
}
return null;
}
/**
* 返回一個 ResultSet
* @param cmdText 須要 ? 參數的 SQL 語句
* @param cmdParams SQL 語句的參數表
* @return
*/
public static ResultSet getResultSet(String cmdText, Object... cmdParams)
{
PreparedStatement pstmt = getPreparedStatement(cmdText, cmdParams);
if (pstmt == null)
{
return null;
}
try
{
return pstmt.executeQuery();
} catch (SQLException ex)
{
Logger.getLogger(SQLHelper.class.getName()).log(Level.SEVERE, null, ex);
closeConnection(pstmt);
}
return null;
}
/**
* 返回一個 ResultSet
* @param conn 數據庫鏈接
* @param cmdText 須要 ? 參數的 SQL 語句
* @param cmdParams SQL 語句的參數表
* @return
*/
public static ResultSet getResultSet(Connection conn, String cmdText, Object... cmdParams)
{
PreparedStatement pstmt = getPreparedStatement(conn, cmdText, cmdParams);
if (pstmt == null)
{
return null;
}
try
{
return pstmt.executeQuery();
} catch (SQLException ex)
{
Logger.getLogger(SQLHelper.class.getName()).log(Level.SEVERE, null, ex);
close(pstmt);
}
return null;
}
public static Object buildScalar(ResultSet rs)
{
if (rs == null)
{
return null;
}
Object obj = null;
try
{
if (rs.next())
{
obj = rs.getObject(1);
}
} catch (SQLException ex)
{
Logger.getLogger(SQLHelper.class.getName()).log(Level.SEVERE, null, ex);
}
return obj;
}
/**
* 從 ResultSet 中構建 DefaultTableModel
* @param rs ResultSet
* @return
*/
public static DefaultTableModel buildTableModel(ResultSet rs)
{
if (rs == null)
{
return null;
}
ResultSetMetaData rsm;
String[] columnNames = null; // 列標題
Object[][] data = null; // 數據項
DefaultTableModel model; // 表格模型
try
{
// 查詢語句
rsm = rs.getMetaData();
// 判斷時候能夠實現對數據庫的更新
if (rs.getConcurrency() == ResultSet.CONCUR_UPDATABLE)
{
System.out.println("Can UPDATABLE");
} else
{
System.out.println("Only Ready");
}
// 獲取列標題
columnNames = new String[rsm.getColumnCount()];
for (int i = 0; i < rsm.getColumnCount(); i++)
{
columnNames[i] = rsm.getColumnName(i + 1);
}
int row = 0;
int colum = 0;
int columCount = rsm.getColumnCount();
// 獲取行數,沒有直接的方法,這裏先移動到紀錄結尾,獲取行號,即爲行數,而後再移回來
rs.last();
int rowCount = rs.getRow();
rs.beforeFirst();
System.out.println("rowCount:" + rowCount);
// 讀取數據到數據項變量
data = new Object[rowCount][columCount];
while (rs.next())
{
for (colum = 0; colum < rsm.getColumnCount(); colum++)
{
data[row][colum] = rs.getObject(colum + 1);
}
row++;
}
} catch (SQLException ex)
{
Logger.getLogger(SQLHelper.class.getName()).log(Level.SEVERE, null,
ex);
return null;
}
// 初始化數據模型
model = new DefaultTableModel(data, columnNames)
{
/**
* 重寫 getColumnClass 能夠使表格自動識別數據類型
*/
@SuppressWarnings("unchecked")
@Override
public Class getColumnClass(int c)
{
// 這裏要對空數據集進行檢驗
if (dataVector.isEmpty() == false && getValueAt(0, c) != null)
{
return getValueAt(0, c).getClass();
} else
{
return Object.class;
}
}
};
return model;
}
/**
* 獲取一個數據模型 該表格模型只能用來顯示數據,若是須要更新數據,請使用 DataSet getDataSet(String cmdText)
*
* @param conn 數據庫鏈接
* @param cmdText
* 能返回一個數據集的查詢SQL 語句
* @return 表格數據模型
*/
public static DefaultTableModel getTableModel(Connection conn, String cmdText)
{
ResultSet rs = getResultSet(conn, cmdText);
DefaultTableModel tm = buildTableModel(rs);
closeEx(rs);
return tm;
}
/**
* 獲取一個數據模型 該表格模型只能用來顯示數據,若是須要更新數據,請使用 DataSet getDataSet(String cmdText)
*
* @param cmdText 須要 ? 參數的 SQL 語句
* @param cmdParams SQL 語句的參數表
* @return 表格數據模型
*/
public static DefaultTableModel getTableModel(String cmdText, Object... cmdParams)
{
// 查詢語句
ResultSet rs = getResultSet(cmdText, cmdParams);
DefaultTableModel tm = buildTableModel(rs);
closeConnection(rs);
return tm;
}
/**
* 獲取一個數據模型 該表格模型只能用來顯示數據,若是須要更新數據,請使用 DataSet getDataSet(String cmdText)
*
* @param cmdText
* 能返回一個數據集的查詢SQL 語句
* @return 表格數據模型
*/
public static DefaultTableModel getTableModel(String cmdText)
{
// 查詢語句
ResultSet rs = getResultSet(cmdText);
DefaultTableModel tm = buildTableModel(rs);
closeConnection(rs);
return tm;
}
/**
* 獲取一個數據模型 該表格模型只能用來顯示數據,若是須要更新數據,請使用 DataSet getDataSet(String cmdText)
* @param conn 數據庫鏈接
* @param cmdText 須要 ? 參數的 SQL 語句
* @param cmdParams SQL 語句的參數表
* @return 表格數據模型
*/
public static DefaultTableModel getTableModel(Connection conn, String cmdText, Object... cmdParams)
{
ResultSet rs = getResultSet(conn, cmdText, cmdParams);
DefaultTableModel tm = buildTableModel(rs);
closeEx(rs);
return tm;
}
/**
* 獲取一個具備更新功能的數據模型 若是隻要讀取數據,就不要用它了
* @param cmdText 能返回一個數據集的查詢SQL 語句
* @return 表格數據模型
*/
public static DataSet getDataSet(String cmdText)
{
Statement stmt = getStatement();
DataSet dbc = new DataSet();
if (stmt == null)
{
dbc.code = -2;
return dbc;
}
try
{
// 查詢語句
dbc.rs = stmt.executeQuery(cmdText);
dbc.model = buildTableModel(dbc.rs);
dbc.code = dbc.model.getRowCount();
} catch (SQLException ex)
{
Logger.getLogger(SQLHelper.class.getName()).log(Level.SEVERE, null, ex);
dbc.code = -1;
}
return dbc;
}
/**
* 獲取一個具備更新功能的數據模型 若是隻要讀取數據,就不要用它了
* @param conn 數據庫鏈接
* @param cmdText 能返回一個數據集的查詢SQL 語句
* @return 表格數據模型
*/
public static DataSet getDataSet(Connection conn, String cmdText)
{
Statement stmt = getStatement(conn);
DataSet dbc = new DataSet();
if (stmt == null)
{
dbc.code = -2;
return dbc;
}
try
{
// 查詢語句
dbc.rs = stmt.executeQuery(cmdText);
dbc.model = buildTableModel(dbc.rs);
dbc.code = dbc.model.getRowCount();
} catch (SQLException ex)
{
Logger.getLogger(SQLHelper.class.getName()).log(Level.SEVERE, null, ex);
dbc.code = -1;
}
return dbc;
}
/**
* 獲取一個具備更新功能的數據模型 若是隻要讀取數據,就不要用它了
* @param cmdText 須要 ? 參數的 SQL 語句
* @param cmdParams SQL 語句的參數表
* @return 表格數據模型
*/
public static DataSet getDataSet(String cmdText, Object... cmdParams)
{
PreparedStatement pstmt = getPreparedStatement(cmdText, cmdParams);
DataSet dbc = new DataSet();
if (pstmt == null)
{
dbc.code = -2;
return dbc;
}
try
{
// 查詢語句
dbc.rs = pstmt.executeQuery();
dbc.model = buildTableModel(dbc.rs);
dbc.code = dbc.model.getRowCount();
} catch (SQLException ex)
{
Logger.getLogger(SQLHelper.class.getName()).log(Level.SEVERE, null, ex);
dbc.code = -1;
}
return dbc;
}
/**
* 獲取一個具備更新功能的數據模型 若是隻要讀取數據,就不要用它了
* @param conn 數據庫鏈接
* @param cmdText 須要 ? 參數的 SQL 語句
* @param cmdParams SQL 語句的參數表
* @return 表格數據模型
*/
public static DataSet getDataSet(Connection conn, String cmdText, Object... cmdParams)
{
PreparedStatement pstmt = getPreparedStatement(conn, cmdText, cmdParams);
DataSet dbc = new DataSet();
if (pstmt == null)
{
dbc.code = -2;
return dbc;
}
try
{
// 查詢語句
dbc.rs = pstmt.executeQuery();
dbc.model = buildTableModel(dbc.rs);
dbc.code = dbc.model.getRowCount();
} catch (SQLException ex)
{
Logger.getLogger(SQLHelper.class.getName()).log(Level.SEVERE, null, ex);
dbc.code = -1;
}
return dbc;
}
private static void close(Object obj)
{
if (obj == null)
{
return;
}
try
{
if (obj instanceof Statement)
{
((Statement) obj).close();
} else if (obj instanceof PreparedStatement)
{
((PreparedStatement) obj).close();
} else if (obj instanceof ResultSet)
{
((ResultSet) obj).close();
} else if (obj instanceof Connection)
{
((Connection) obj).close();
}
} catch (SQLException ex)
{
Logger.getLogger(SQLHelper.class.getName()).log(Level.SEVERE, null, ex);
}
}
private static void closeEx(Object obj)
{
if (obj == null)
{
return;
}
try
{
if (obj instanceof Statement)
{
((Statement) obj).close();
} else if (obj instanceof PreparedStatement)
{
((PreparedStatement) obj).close();
} else if (obj instanceof ResultSet)
{
((ResultSet) obj).getStatement().close();
} else if (obj instanceof Connection)
{
((Connection) obj).close();
}
} catch (SQLException ex)
{
Logger.getLogger(SQLHelper.class.getName()).log(Level.SEVERE, null, ex);
}
}
private static void closeConnection(Object obj) { if (obj == null) { return; } try { if (obj instanceof Statement) { ((Statement) obj).getConnection().close(); } else if (obj instanceof PreparedStatement) { ((PreparedStatement) obj).getConnection().close(); } else if (obj instanceof ResultSet) { ((ResultSet) obj).getStatement().getConnection().close(); } else if (obj instanceof Connection) { ((Connection) obj).close(); } } catch (SQLException ex) { Logger.getLogger(SQLHelper.class.getName()).log(Level.SEVERE, null, ex); } }}